diff --git a/src/infrastructure/xlsx_reader.rs b/src/infrastructure/xlsx_reader.rs index 3b026c1..d7ab4cf 100644 --- a/src/infrastructure/xlsx_reader.rs +++ b/src/infrastructure/xlsx_reader.rs @@ -1,7 +1,5 @@ use crate::domain::errors::{ErroArquivo, ResumoAvisos}; -use calamine::{open_workbook, Reader, Xlsx}; -use std::fs::File; -use std::io::BufReader; +use calamine::{open_workbook_auto, Reader}; use std::path::Path; const LIMITE_BYTES: u64 = 50 * 1024 * 1024; @@ -22,17 +20,19 @@ pub struct ResultadoXlsx { 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, ErroArquivo> { verificar_tamanho(caminho)?; - let workbook: Xlsx> = open_workbook::, _>(caminho) + let workbook = open_workbook_auto(caminho) .map_err(|e| ErroArquivo::Corrompido(e.to_string()))?; 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 /// - `caminho`: caminho do arquivo @@ -45,7 +45,7 @@ pub fn ler_xlsx( ) -> Result { verificar_tamanho(caminho)?; - let mut workbook: Xlsx> = open_workbook::, _>(caminho) + let mut workbook = open_workbook_auto(caminho) .map_err(|e| ErroArquivo::Corrompido(e.to_string()))?; let range: calamine::Range = workbook diff --git a/src/ui/screens/import.rs b/src/ui/screens/import.rs index 17d95ce..b65b40a 100644 --- a/src/ui/screens/import.rs +++ b/src/ui/screens/import.rs @@ -24,7 +24,7 @@ pub fn renderizar(ui: &mut Ui, _ctx: &Context, app: &mut App) { if ui.button("📂 Selecionar arquivo...").clicked() { if let Some(caminho) = rfd::FileDialog::new() - .add_filter("Planilhas", &["csv", "xlsx"]) + .add_filter("Planilhas", &["csv", "xlsx", "xls"]) .pick_file() { on_arquivo_selecionado(app, caminho); @@ -140,7 +140,7 @@ fn on_arquivo_selecionado(app: &mut App, caminho: PathBuf) { app.caminho_arquivo = Some(caminho); app.notas_importadas.clear(); } - "xlsx" => { + "xlsx" | "xls" => { app.tipo_arquivo_atual = TipoArquivo::Xlsx; match listar_abas_xlsx(&caminho) { 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."); } } }