feat: adiciona suporte para arquivos XLS e atualiza mensagens de erro na importação

This commit is contained in:
FelipeCN
2026-03-03 08:30:28 -03:00
parent bbfa66979b
commit b0e216a6ff
2 changed files with 10 additions and 10 deletions
+7 -7
View File
@@ -1,7 +1,5 @@
use crate::domain::errors::{ErroArquivo, ResumoAvisos}; use crate::domain::errors::{ErroArquivo, ResumoAvisos};
use calamine::{open_workbook, Reader, Xlsx}; use calamine::{open_workbook_auto, Reader};
use std::fs::File;
use std::io::BufReader;
use std::path::Path; use std::path::Path;
const LIMITE_BYTES: u64 = 50 * 1024 * 1024; const LIMITE_BYTES: u64 = 50 * 1024 * 1024;
@@ -22,17 +20,19 @@ pub struct ResultadoXlsx {
pub avisos: ResumoAvisos, pub avisos: ResumoAvisos,
} }
/// Lista as abas disponíveis em um arquivo XLSX. /// Lista as abas disponíveis em um arquivo XLSX (ou XLS com extensão .xls mas conteúdo XLSX).
pub fn listar_abas(caminho: &Path) -> Result<Vec<String>, ErroArquivo> { pub fn listar_abas(caminho: &Path) -> Result<Vec<String>, ErroArquivo> {
verificar_tamanho(caminho)?; verificar_tamanho(caminho)?;
let workbook: Xlsx<BufReader<File>> = open_workbook::<Xlsx<_>, _>(caminho) let workbook = open_workbook_auto(caminho)
.map_err(|e| ErroArquivo::Corrompido(e.to_string()))?; .map_err(|e| ErroArquivo::Corrompido(e.to_string()))?;
Ok(workbook.sheet_names().to_vec()) Ok(workbook.sheet_names().to_vec())
} }
/// Lê os dados de uma aba XLSX a partir de uma linha de início. /// Lê os dados de uma aba XLSX (ou XLS com extensão .xls mas conteúdo XLSX) a partir de uma linha de início.
///
/// O formato real é detectado pelo conteúdo do arquivo (magic bytes), não pela extensão.
/// ///
/// # Parâmetros /// # Parâmetros
/// - `caminho`: caminho do arquivo /// - `caminho`: caminho do arquivo
@@ -45,7 +45,7 @@ pub fn ler_xlsx(
) -> Result<ResultadoXlsx, ErroArquivo> { ) -> Result<ResultadoXlsx, ErroArquivo> {
verificar_tamanho(caminho)?; verificar_tamanho(caminho)?;
let mut workbook: Xlsx<BufReader<File>> = open_workbook::<Xlsx<_>, _>(caminho) let mut workbook = open_workbook_auto(caminho)
.map_err(|e| ErroArquivo::Corrompido(e.to_string()))?; .map_err(|e| ErroArquivo::Corrompido(e.to_string()))?;
let range: calamine::Range<calamine::Data> = workbook let range: calamine::Range<calamine::Data> = workbook
+3 -3
View File
@@ -24,7 +24,7 @@ pub fn renderizar(ui: &mut Ui, _ctx: &Context, app: &mut App) {
if ui.button("📂 Selecionar arquivo...").clicked() { if ui.button("📂 Selecionar arquivo...").clicked() {
if let Some(caminho) = rfd::FileDialog::new() if let Some(caminho) = rfd::FileDialog::new()
.add_filter("Planilhas", &["csv", "xlsx"]) .add_filter("Planilhas", &["csv", "xlsx", "xls"])
.pick_file() .pick_file()
{ {
on_arquivo_selecionado(app, caminho); on_arquivo_selecionado(app, caminho);
@@ -140,7 +140,7 @@ fn on_arquivo_selecionado(app: &mut App, caminho: PathBuf) {
app.caminho_arquivo = Some(caminho); app.caminho_arquivo = Some(caminho);
app.notas_importadas.clear(); app.notas_importadas.clear();
} }
"xlsx" => { "xlsx" | "xls" => {
app.tipo_arquivo_atual = TipoArquivo::Xlsx; app.tipo_arquivo_atual = TipoArquivo::Xlsx;
match listar_abas_xlsx(&caminho) { match listar_abas_xlsx(&caminho) {
Ok(info) => { Ok(info) => {
@@ -157,7 +157,7 @@ fn on_arquivo_selecionado(app: &mut App, caminho: PathBuf) {
} }
} }
_ => { _ => {
app.exibir_erro("Formato de arquivo não suportado. Use CSV ou XLSX."); app.exibir_erro("Formato de arquivo não suportado. Use CSV, XLSX ou XLS.");
} }
} }
} }