feat: adiciona suporte para arquivos XLS e atualiza mensagens de erro na importação
This commit is contained in:
@@ -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<Vec<String>, ErroArquivo> {
|
||||
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()))?;
|
||||
|
||||
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<ResultadoXlsx, ErroArquivo> {
|
||||
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()))?;
|
||||
|
||||
let range: calamine::Range<calamine::Data> = workbook
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user