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 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
|
||||||
|
|||||||
@@ -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.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user