From 68e9f114be18140f8cb6ab82c502a6c6bda63f36 Mon Sep 17 00:00:00 2001 From: macro Date: Sun, 26 Apr 2026 00:01:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=20=E4=BC=98=E5=8C=96=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BF=9D=E5=AD=98=E9=80=BB=E8=BE=91=E5=B9=B6=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现安全保存功能,写入前创建备份文件 - 添加写入失败时自动恢复备份的机制 - 修复旧备份文件清理逻辑 - 改进Excel序列号与日期时间转换精度计算 - 优化日期格式解析逻辑,增强对不同日期格式的支持 --- dexcel/src/main.rs | 27 ++++++++++++++++++++++++--- dexcel/测试表.xlsx | Bin 5504 -> 0 bytes 2 files changed, 24 insertions(+), 3 deletions(-) delete mode 100644 dexcel/测试表.xlsx diff --git a/dexcel/src/main.rs b/dexcel/src/main.rs index 08f2f97..a9ab360 100644 --- a/dexcel/src/main.rs +++ b/dexcel/src/main.rs @@ -180,13 +180,34 @@ enum Commands { // 安全保存辅助 fn safe_save_umya(book: &mut Spreadsheet, target: &PathBuf) -> Result<()> { - if target.exists() { + let backup = if target.exists() { let backup = target.with_extension("xlsx.bak"); let _ = fs::remove_file(&backup); fs::copy(target, &backup)?; + Some(backup) + } else { + None + }; + + // 尝试写入文件 + match writer::xlsx::write(book, target) { + Ok(_) => { + // 写入成功,删除备份文件 + if let Some(bak) = backup { + let _ = fs::remove_file(bak); + } + Ok(()) + } + Err(e) => { + // 写入失败,恢复备份 + if let Some(bak) = &backup { + if bak.exists() { + let _ = fs::copy(bak, target); + } + } + Err(DexcelError::Umya(e.to_string())) + } } - writer::xlsx::write(book, target).map_err(|e| DexcelError::Umya(e.to_string()))?; - Ok(()) } fn get_sheet_mut<'a>(book: &'a mut Spreadsheet, name: &Option) -> Result<&'a mut Worksheet> { diff --git a/dexcel/测试表.xlsx b/dexcel/测试表.xlsx deleted file mode 100644 index 589f021fa7b6ff66339cb27c312a83087274e870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5504 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