feat(cli): 重构删除命令并增强日期时间处理功能
- 重写Delete子命令参数结构,使用start和count替代range参数 - 添加-y/--yes选项用于跳过删除确认提示 - 新增日期时间解析和转换辅助函数支持 - 实现Excel序列号与Chrono时间类型的相互转换 - 增强单元格值获取函数支持日期格式化显示 - 修改插入和更新函数支持日期时间值的自动识别和格式化 - 优化删除命令的行号解析逻辑支持负数索引 - 改进安全保存函数的备份和恢复机制
This commit is contained in:
+31
-20
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user