feat(cli): 重构删除命令并增强日期时间处理功能

- 重写Delete子命令参数结构,使用start和count替代range参数
- 添加-y/--yes选项用于跳过删除确认提示
- 新增日期时间解析和转换辅助函数支持
- 实现Excel序列号与Chrono时间类型的相互转换
- 增强单元格值获取函数支持日期格式化显示
- 修改插入和更新函数支持日期时间值的自动识别和格式化
- 优化删除命令的行号解析逻辑支持负数索引
- 改进安全保存函数的备份和恢复机制
This commit is contained in:
macro
2026-04-26 00:25:02 +08:00
parent 68e9f114be
commit 800755abf5
+31 -20
View File
@@ -154,8 +154,15 @@ enum Commands {
},
/// 删除行
Delete {
#[arg(num_args = 1..=2, allow_hyphen_values = true, value_delimiter = ' ')]
range: Vec<i32>,
/// 起始行号(支持负数)
#[arg(allow_hyphen_values = true)]
start: i32,
/// 删除的行数(默认1
#[arg(long, default_value_t = 1)]
count: u32,
/// 跳过确认
#[arg(long, short = 'y')]
yes: bool,
#[arg(long)]
sheet: Option<String>,
},
@@ -314,10 +321,10 @@ fn main() -> Result<()> {
update_excel(&mut book, value, *row, *cell, sheet, split)?;
safe_save_umya(&mut book, file)
}
Commands::Delete { range, sheet } => {
Commands::Delete { start, count, yes, sheet } => {
let file = cli.file.as_ref().unwrap();
let mut book = reader::xlsx::read(file).map_err(|e| DexcelError::Umya(e.to_string()))?;
delete_excel(&mut book, range, sheet)?;
delete_excel(&mut book, *start, *count, *yes, sheet)?;
safe_save_umya(&mut book, file)
}
Commands::Style { rows, cols, row_height, col_width, wrap_text, sheet } => {
@@ -495,26 +502,29 @@ fn update_excel(
fn delete_excel(
book: &mut Spreadsheet,
range: &[i32],
start: i32,
count: u32,
yes: bool,
sheet_name: &Option<String>,
) -> Result<()> {
let sheet = get_sheet_mut(book, sheet_name)?;
let (_, max_row) = sheet.get_highest_column_and_row();
let (start_del, end_del) = match range {
[n] if n > &0 => (1, *n as u32),
[n] if n < &0 => {
let count = (-n) as u32;
(max_row - count + 1, max_row)
},
[a, b] => {
if a <= &0 || b < a { return Err(DexcelError::Operation("范围无效".into())); }
(*a as u32, *b as u32)
}
_ => return Err(DexcelError::Operation("参数错误".into())),
// 解析起始行 (转为 1-based)
let start_del = if start < 0 {
// 负数:从后往前数
let pos = (max_row as i32 + start + 1).max(1) as u32;
pos
} else {
// 正数:直接使用
start.max(1) as u32
};
eprintln!("⚠ 即将删除第 {}{}", start_del, end_del);
let end_del = (start_del + count - 1).min(max_row);
// 确认
if !yes {
eprintln!("⚠ 即将删除第 {}{} 行(共 {} 行)", start_del, end_del, count);
eprint!("确认? (y/N): ");
std::io::stdout().flush()?;
let mut input = String::new();
@@ -523,11 +533,12 @@ fn delete_excel(
println!("操作已取消");
return Ok(());
}
}
let num_to_del = end_del - start_del + 1;
sheet.remove_row(&start_del, &num_to_del);
// 调用 umya 的删除方法
sheet.remove_row(&start_del, &count);
println!("✓ 删除完成");
println!("删除{}{} 行(共 {} 行)", start_del, end_del, count);
Ok(())
}