72c2431f0f
- 新增日期时间解析函数,支持多种日期格式转换为Excel序列号 - 实现Excel序列号与Chrono时间的相互转换功能 - 添加对各种换行符格式的统一处理(\r\n、\\r\\n、\\n等) - 在插入和更新操作中集成日期格式识别和设置 - 实现自动换行和行高自适应功能 - 优化单元格值获取逻辑以支持日期格式化显示
dexcel - Excel 读写工具 📊
一个简单易用的命令行 Excel 处理工具,支持查询、统计、插入、更新、删除和样式设置操作。
当前版本: v0.4.0
✨ 功能特性
核心操作
- 🔍 query: 灵活查询 Excel 数据,支持行范围选择
- 📊 count: 快速统计行数,适合脚本使用
- ➕ insert: 插入新行,支持指定位置或追加到末尾
- ✏️ update: 更新现有数据,支持部分列更新
- ❌ delete: 删除行,支持灵活的起始位置和数量控制
- 🎨 style: 设置样式(行高、列宽、自动换行)
通用特性
- 📑 多 Sheet 支持: 所有操作都支持
--sheet参数指定工作表 - 🔢 负数索引: 支持负数行号(-1 表示最后一行)
- ⚠️ 安全确认: delete 操作默认需要用户确认,可用
-y跳过 - 💾 样式保留: 使用 umya-spreadsheet 库,完整保留 Excel 样式
- 📤 表格输出: query 以美观的表格格式显示数据
- 📅 日期智能: 自动识别和格式化日期时间单元格
- 🧹 备份清理: 操作成功后自动删除 .bak 备份文件
📦 安装
从源码编译
cd dexcel
cargo build --release
编译后的可执行文件位于 target/release/dexcel.exe (Windows)
全局安装
cargo install --path . --force
安装后可直接使用 dexcel 命令。
🚀 使用方法
基本格式:
dexcel <文件路径> <操作> [参数]
注意:文件路径是第一个位置参数,不需要 --file 标志!
1. 查询数据 (query)
# 查看整个文件(默认显示最后20行)
dexcel data.xlsx query
# 查看前5行
dexcel data.xlsx query 5
# 查看最后3行
dexcel data.xlsx query -3
# 查看最后一行
dexcel data.xlsx query --last
# 从第10行开始查看
dexcel data.xlsx query --start 10
# 指定 Sheet 名称
dexcel data.xlsx query --sheet "Sales"
query 参数说明
[COUNT]: 获取行数(正数从前,负数从后),默认0显示最后20行--start <START>: 开始行号(支持负数)--last: 获取最后一行--sheet <SHEET>: Sheet 名称(可选,默认第一个 Sheet)
2. 统计行数 (count)
# 统计总行数
dexcel data.xlsx count
# 统计指定 Sheet 的行数
dexcel data.xlsx count --sheet "Sales"
count 参数说明
--sheet <SHEET>: Sheet 名称(可选,默认第一个 Sheet)
输出: 只输出一个数字,表示总行数,适合脚本中使用。
3. 创建新文件 (new)
# 创建新的 Excel 文件
dexcel new mydata.xlsx
# 指定 Sheet 名称
dexcel new mydata.xlsx --sheet "数据表"
new 参数说明
<NAME>: 文件名(必填)必需--sheet <SHEET>: Sheet 名称(可选,默认为 Sheet1)
注意:如果文件已存在,会报错提示。
3. 插入数据 (insert)
# 追加数据到末尾(文件必须已存在)
dexcel data.xlsx insert "张三|18|北京"
# 在指定位置插入(第2行)
dexcel data.xlsx insert "李四|20|上海" --row 2
# 使用不同分隔符
dexcel data.xlsx insert "王五,25,广州" --split ","
# 指定 Sheet
dexcel data.xlsx insert "数据" --sheet "Sheet2"
insert 参数说明
<VALUE>: 要插入的值(用 split 分隔列)必需--row <ROW>: 插入位置(不指定则追加到末尾)--sheet <SHEET>: Sheet 名称(可选)--split <SPLIT>: 分隔符(默认 |)
注意:insert 命令要求文件必须已存在,如果文件不存在会报错。
4. 更新数据 (update)
# 更新整行(从第1列开始)
dexcel data.xlsx update "赵六|22|深圳" --row 2
# 更新部分列(从第2列开始)
dexcel data.xlsx update "新年龄" --row 5 --cell 2
# 更新多列(从第3列开始)
dexcel data.xlsx update "新城市|新备注" --row 4 --cell 3
# 指定 Sheet
dexcel data.xlsx update "新值" --row 1 --sheet "Sheet2"
update 参数说明
<VALUE>: 要更新的值(用 split 分隔列)必需--row <ROW>: 行号(必需,支持负数)--cell <CELL>: 起始列号(从1开始,默认1)--sheet <SHEET>: Sheet 名称(可选)--split <SPLIT>: 分隔符(默认 |)
5. 删除数据 (delete)
# 删除第5行(需要确认)
dexcel data.xlsx delete 5
# 从第3行开始删除5行(跳过确认)
dexcel data.xlsx delete 3 --count 5 -y
# 删除最后一行
dexcel data.xlsx delete -1 -y
# 删除最后3行
dexcel data.xlsx delete -3 --count 3 -y
# 指定 Sheet
dexcel data.xlsx delete 1 --sheet "Sheet2"
delete 参数说明
<START>: 起始行号(必需,支持负数)- 正数:从前往后数(如
5表示第5行) - 负数:从后往前数(如
-1表示最后一行)
- 正数:从前往后数(如
--count <COUNT>: 删除的行数(默认1)-y, --yes: 跳过确认--sheet <SHEET>: Sheet 名称(可选)
使用示例:
dexcel file.xlsx delete 5- 删除第5行(需确认)dexcel file.xlsx delete 5 --count 3 -y- 从第5行开始删除3行(跳过确认)dexcel file.xlsx delete -1 --count 2 -y- 删除最后2行
注意: delete 操作默认需要用户确认(输入 y 继续),可使用 -y 跳过确认。
6. 设置样式 (style)
# 设置第1行的行高
dexcel data.xlsx style --rows 1 --row-height 30
# 设置A列的列宽
dexcel data.xlsx style --cols 1 --col-width 20
# 设置自动换行
dexcel data.xlsx style --rows 1 --cols 1 --wrap-text
# 组合设置
dexcel data.xlsx style --rows 1 2 3 --cols 1 2 --row-height 25 --col-width 15 --wrap-text
# 指定 Sheet
dexcel data.xlsx style --rows 1 --row-height 20 --sheet "Sheet2"
style 参数说明
--rows <ROWS>: 行号列表(支持负数,不指定则应用到所有行)--cols <COLS>: 列号列表(不指定则应用到所有列)--row-height <ROW_HEIGHT>: 行高(像素)--col-width <COL_WIDTH>: 列宽(字符数)--wrap-text: 启用自动换行--sheet <SHEET>: Sheet 名称(可选)
💡 使用示例
示例 1: 创建学生信息表
# 创建表头
dexcel students.xlsx insert "姓名|年龄|班级"
# 添加学生数据
dexcel students.xlsx insert "张三|18|一班"
dexcel students.xlsx insert "李四|19|二班"
dexcel students.xlsx insert "王五|20|三班"
# 查看所有数据
dexcel students.xlsx query
# 统计总行数
dexcel students.xlsx count
示例 2: 数据查询和分析
# 查看前5行
dexcel data.xlsx query 5
# 查看最后10行
dexcel data.xlsx query -10
# 从第50行开始查看
dexcel data.xlsx query --start 50
# 导出到文件
dexcel data.xlsx query > output.txt
# 使用逗号分隔
dexcel data.xlsx query --split ","
示例 3: 数据更新
# 更新第2行的所有数据
dexcel data.xlsx update "新姓名|新年龄|新城市" --row 2
# 只更新第2行的第2列
dexcel data.xlsx update "新年龄" --row 2 --cell 2
# 批量更新(脚本)
for i in 2 3 4 5; do
dexcel data.xlsx update "已审核" --row $i --cell 4
done
示例 4: 数据清理
# 删除第5行
dexcel data.xlsx delete 5 -y
# 从第10行开始删除5行
dexcel data.xlsx delete 10 --count 5 -y
# 删除最后3行
dexcel data.xlsx delete -3 --count 3 -y
示例 5: 多 Sheet 操作
# 在不同 Sheet 中操作
dexcel data.xlsx insert "数据1" --sheet "Sheet1"
dexcel data.xlsx insert "数据2" --sheet "Sheet2"
# 查询指定 Sheet
dexcel data.xlsx query --sheet "Sales"
# 统计指定 Sheet 的行数
dexcel data.xlsx count --sheet "Sales"
示例 6: 设置样式
# 设置第1行的行高为30像素
dexcel data.xlsx style --rows 1 --row-height 30
# 设置A列的列宽为20字符
dexcel data.xlsx style --cols 1 --col-width 20
# 设置自动换行
dexcel data.xlsx style --rows 1 --cols 1 --wrap-text
# 组合设置:多行多列,设置行高、列宽和自动换行
dexcel data.xlsx style --rows 1 2 3 --cols 1 2 --row-height 25 --col-width 15 --wrap-text
# 指定 Sheet
dexcel data.xlsx style --rows 1 --row-height 20 --sheet "Sheet2"
📊 输出格式
query 输出(表格格式)
┌──────┬──────┬──────┐
│ 姓名 │ 年龄 │ 城市 │
├──────┼──────┼──────┤
│ 张三 │ 25 │ 北京 │
├──────┼──────┼──────┤
│ 李四 │ 30 │ 上海 │
└──────┴──────┴──────┘
共输出 2 行数据,3 列
特点:
- ✅ 使用美观的表格格式(基于 tabled 库)
- ✅ 自动对齐列宽
- ✅ 清晰的分隔线和边框
- ✅ 显示行数和列数统计
- ✅ 易于阅读和查看
count 输出
100
特点:
- 只输出一个数字
- 适合脚本中使用
- 可与其他命令组合
操作反馈
insert 成功:
✓ 操作成功:已创建新文件并插入一行数据
文件: data.xlsx, Sheet: Sheet1
update 成功:
✓ 操作成功:已更新第 5 行,从第 1 列开始
文件: data.xlsx, Sheet: Sheet1
delete 成功:
✓ 已删除第 5 至 7 行(共 3 行)
⚙️ 技术细节
依赖库
- umya-spreadsheet: Excel 读写库,完整保留样式,支持 .xlsx 格式
- clap: 命令行参数解析库
- tabled: 表格格式化输出库
- chrono: 日期时间处理库
- thiserror: 错误处理库
工作原理
工作流程
- 打开 Excel 文件(使用 umya-spreadsheet)
- 选择指定的 Sheet(默认第一个)
- 执行相应操作(查询/插入/更新/删除/样式设置)
- 保存文件(保留原有样式)
数据类型支持
读取时支持:
- 字符串 (String)
- 整数 (Int)
- 浮点数 (Float)
- 布尔值 (Bool)
- 日期时间 (DateTime) - 自动识别并格式化
2024-01-15→ 显示为2024-01-152024-12-25 14:30:00→ 显示为2024-12-25 14:30:0014:30:00→ 显示为14:30:00
- 空值 (Empty)
- 错误值 (Error)
写入时:
- 所有数据都作为字符串写入
- 日期时间自动识别并转换为 Excel 序列号
- 样式完全保留
⚠️ 注意事项
- 索引从 1 开始: 行和列的索引都是从 1 开始,不是 0
- 负数索引:
-1= 最后一行/列,-2= 倒数第二 - 文件必须存在: insert/update/delete 操作要求文件必须已存在
- 分隔符默认: 默认使用
|分隔列 - 文件格式: 仅支持
.xlsx,不支持.xls - 删除需确认: delete 操作默认需要用户确认,可用
-y跳过 - 日期自动识别: 自动识别并格式化日期单元格 (如
2024-01-15,2024-12-25 14:30:00) - 样式保留: 使用 umya-spreadsheet 库,完整保留 Excel 样式
- 备份清理: 操作成功后自动删除 .bak 备份文件
- 不可撤销: delete 操作不可撤销,请谨慎操作!
- 样式设置: style 命令可设置行高、列宽、自动换行等样式
限制
读取限制:
- 公式: 不计算公式,只读取原始值
- 图表: 不支持读取图表
- 宏: 不支持 VBA 宏
- 大文件: > 10MB 的文件可能较慢
写入限制:
- 无公式: 不能写入公式
- update 会覆盖目标单元格的原有内容
- insert 会将原有数据下移
优势:
- ✅ 完整保留 Excel 样式(颜色、字体、边框等)
- ✅ 支持行高、列宽、自动换行等样式设置
- ✅ 插入/删除时自动调整样式
🔧 常见问题
Q1: 如何查看文件有多少行?
dexcel data.xlsx count
Q2: 如何追加多行数据?
多次调用 insert 命令:
dexcel data.xlsx insert "数据1|数据2"
dexcel data.xlsx insert "数据3|数据4"
Q3: 负数参数怎么用?
dexcel data.xlsx query -5 # 最后5行
dexcel data.xlsx delete -1 -y # 删除最后一行
Q4: 如何处理中文内容?
直接传入,完全支持 UTF-8:
dexcel data.xlsx insert "张三|18|北京"
Q5: 如何在脚本中使用 count?
# 获取行数并存储到变量
$lines = dexcel data.xlsx count
# 条件判断
if ((dexcel data.xlsx count) -gt 100) {
Write-Host "文件超过100行"
}
Q6: 删除操作能撤销吗?
不能撤销,请谨慎操作!建议先备份文件。
Q7: 如何跳过删除确认?
使用 -y 或 --yes 参数:
dexcel data.xlsx delete 5 --count 3 -y
🎯 应用场景
1. 数据预览
快速查看大型 Excel 文件的部分内容:
dexcel large-file.xlsx query 5
2. 数据提取
提取特定数据并导出:
dexcel data.xlsx query -10 > last-rows.txt
3. 报告生成
创建报告模板:
dexcel report.xlsx insert "月度报告||||"
dexcel report.xlsx insert "日期|销售额|利润|备注"
4. 数据更新
批量更新某列数据:
dexcel data.xlsx update "新值" --row 5 --cell 2
dexcel data.xlsx update "新值" --row 6 --cell 2
5. 数据清理
删除错误数据:
# 删除第5行
dexcel data.xlsx delete 5 -y
# 从第10行开始删除5行
dexcel data.xlsx delete 10 --count 5 -y
# 删除最后3行
dexcel data.xlsx delete -3 --count 3 -y
6. 自动化脚本
PowerShell 批量导入:
$students = @(
@("张三", "18", "一班"),
@("李四", "19", "二班")
)
foreach ($student in $students) {
dexcel students.xlsx insert "$($student[0])|$($student[1])|$($student[2])"
}
📝 批处理脚本示例
Windows 批量导入 (import.bat)
@echo off
echo 正在导入数据...
dexcel data.xlsx insert "ID|名称|数量"
dexcel data.xlsx insert "001|产品A|100"
dexcel data.xlsx insert "002|产品B|200"
dexcel data.xlsx insert "003|产品C|300"
echo 导入完成!
dexcel data.xlsx query
pause
PowerShell 数据处理 (process.ps1)
# 读取并处理数据
$output = dexcel data.xlsx query 100
# 过滤包含关键词的行
$filtered = $output | Select-String "关键词"
# 保存到文件
$filtered | Out-File -FilePath filtered.txt -Encoding UTF8
Write-Host "处理完成!" -ForegroundColor Green
🤝 贡献
欢迎提交 Issue 和 Pull Request!
可能的改进方向:
- 支持公式计算
- 支持更多数据类型
- 支持批量写入优化
- 支持复制 Sheet
- 添加数据验证功能
- 支持更多输出格式(CSV, JSON 等)
- 支持条件格式化
📄 许可证
本项目采用 MIT 许可证。
🙏 致谢
感谢以下开源项目:
- umya-spreadsheet - 优秀的 Excel 读写库,完整保留样式
- tabled - 美观的表格格式化库
- clap - 优秀的命令行参数解析库
- chrono - 日期时间处理库
- thiserror - 错误处理库
Made with ❤️ using Rust