Files
tools/dexcel/README.md
T
macro 436475174d refactor(dexcel): 重构Excel工具库依赖和功能
- 将底层Excel库从calamine和rust_xlsxwriter切换到umya-spreadsheet
- 更新版本号从0.1.0到0.4.0
- 降低Rust edition从2024到2021
- 添加新的样式设置功能(style命令),支持行高、列宽、自动换行设置
- 修改delete命令支持范围删除(前N行、后N行、指定范围)
- 移除自动创建文件功能,insert操作要求文件必须存在
- 添加thiserror和tempfile依赖用于错误处理和临时文件操作
- 更新tabled和clap依赖版本
- 完善README文档,新增样式设置相关说明和示例
- 保留完整的Excel样式(颜色、字体、边框等)功能
- 修改query输出格式,移除分隔符参数,统一使用表格格式显示
2026-04-25 23:51:05 +08:00

587 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# dexcel - Excel 读写工具 📊
一个简单易用的命令行 Excel 处理工具,支持查询、统计、插入、更新、删除和样式设置操作。
**当前版本**: v0.4.0
## ✨ 功能特性
### 核心操作
- 🔍 **query**: 灵活查询 Excel 数据,支持行范围选择
- 📊 **count**: 快速统计行数,适合脚本使用
- **insert**: 插入新行,支持指定位置或追加到末尾
- ✏️ **update**: 更新现有数据,支持部分列更新
-**delete**: 删除行,带安全确认机制
- 🎨 **style**: 设置样式(行高、列宽、自动换行)
### 通用特性
- 📑 **多 Sheet 支持**: 所有操作都支持 `--sheet` 参数指定工作表
- 🔢 **负数索引**: 支持负数行号(-1 表示最后一行)
- ⚠️ **安全确认**: delete 操作需要用户确认
- 💾 **样式保留**: 使用 umya-spreadsheet 库,完整保留 Excel 样式
- 📤 **表格输出**: query 以美观的表格格式显示数据
## 📦 安装
### 从源码编译
```bash
cd dexcel
cargo build --release
```
编译后的可执行文件位于 `target/release/dexcel.exe` (Windows)
### 全局安装
```bash
cargo install --path . --force
```
安装后可直接使用 `dexcel` 命令。
## 🚀 使用方法
**基本格式:**
```bash
dexcel <文件路径> <操作> [参数]
```
**注意:文件路径是第一个位置参数,不需要 `--file` 标志!**
### 1. 查询数据 (query)
```bash
# 查看整个文件(默认显示最后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)
```bash
# 统计总行数
dexcel data.xlsx count
# 统计指定 Sheet 的行数
dexcel data.xlsx count --sheet "Sales"
```
#### count 参数说明
- `--sheet <SHEET>`: Sheet 名称(可选,默认第一个 Sheet)
**输出**: 只输出一个数字,表示总行数,适合脚本中使用。
### 3. 创建新文件 (new)
```bash
# 创建新的 Excel 文件
dexcel new mydata.xlsx
# 指定 Sheet 名称
dexcel new mydata.xlsx --sheet "数据表"
```
#### new 参数说明
- `<NAME>`: 文件名(必填)**必需**
- `--sheet <SHEET>`: Sheet 名称(可选,默认为 Sheet1)
**注意**:如果文件已存在,会报错提示。
### 3. 插入数据 (insert)
```bash
# 追加数据到末尾(文件必须已存在)
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)
```bash
# 更新整行(从第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)
```bash
# 删除前10行
dexcel data.xlsx delete 10
# 删除后5行
dexcel data.xlsx delete -5
# 删除第3到第8行
dexcel data.xlsx delete 3 8
# 指定 Sheet
dexcel data.xlsx delete 1 --sheet "Sheet2"
```
#### delete 参数说明
- `<RANGE>`: 删除范围,支持以下格式:
- `N` - 删除前 N 行(如 `delete 10` 删除前10行)
- `-N` - 删除后 N 行(如 `delete -10` 删除后10行)
- `START END` - 删除从 START 到 END 行(如 `delete 1 10` 删除第1到第10行)
- `--sheet <SHEET>`: Sheet 名称(可选)
**注意**: delete 操作需要用户确认(输入 y 继续),请谨慎操作!
### 6. 设置样式 (style)
```bash
# 设置第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: 创建学生信息表
```bash
# 创建表头
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: 数据查询和分析
```bash
# 查看前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: 数据更新
```bash
# 更新第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: 数据清理
```bash
# 删除前5行
dexcel data.xlsx delete 5
# 删除最后3行
dexcel data.xlsx delete -3
# 删除第10到第20行
dexcel data.xlsx delete 10 20
```
### 示例 5: 多 Sheet 操作
```bash
# 在不同 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: 设置样式
```bash
# 设置第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 行到第 10 行(共 6 行)
剩余行数: 94
文件: data.xlsx, Sheet: Sheet1
```
## ⚙️ 技术细节
### 依赖库
- **umya-spreadsheet**: Excel 读写库,完整保留样式,支持 .xlsx 格式
- **clap**: 命令行参数解析库
- **tabled**: 表格格式化输出库
- **chrono**: 日期时间处理库
- **thiserror**: 错误处理库
### 工作原理
#### 工作流程
1. 打开 Excel 文件(使用 umya-spreadsheet
2. 选择指定的 Sheet(默认第一个)
3. 执行相应操作(查询/插入/更新/删除/样式设置)
4. 保存文件(保留原有样式)
### 数据类型支持
**读取时支持:**
- 字符串 (String)
- 整数 (Int)
- 浮点数 (Float)
- 布尔值 (Bool)
- 日期时间 (DateTime) - 自动识别并格式化
- 空值 (Empty)
- 错误值 (Error)
**写入时:**
- 所有数据都作为字符串写入
- 样式完全保留
## ⚠️ 注意事项
1. **索引从 1 开始**: 行和列的索引都是从 1 开始,不是 0
2. **负数索引**: `-1` = 最后一行/列,`-2` = 倒数第二
3. **文件必须存在**: insert/update/delete 操作要求文件必须已存在
4. **分隔符默认**: 默认使用 `|` 分隔列
5. **文件格式**: 仅支持 `.xlsx`,不支持 `.xls`
6. **删除需确认**: delete 操作必须用户确认才能执行
7. **日期自动识别**: 自动识别并格式化日期单元格
8. **不可撤销**: delete 操作不可撤销,请谨慎操作!
9. **删除范围**: delete 支持多种删除模式(前N行、后N行、指定范围)
10. **样式保留**: 使用 umya-spreadsheet 库,完整保留 Excel 样式
11. **样式设置**: style 命令可设置行高、列宽、自动换行等样式
### 限制
**读取限制:**
- 公式: 不计算公式,只读取原始值
- 图表: 不支持读取图表
- 宏: 不支持 VBA 宏
- 大文件: > 10MB 的文件可能较慢
**写入限制:**
- 无公式: 不能写入公式
- update 会覆盖目标单元格的原有内容
- insert 会将原有数据下移
**优势:**
- ✅ 完整保留 Excel 样式(颜色、字体、边框等)
- ✅ 支持行高、列宽、自动换行等样式设置
- ✅ 插入/删除时自动调整样式
## 🔧 常见问题
### Q1: 如何查看文件有多少行?
```bash
dexcel data.xlsx count
```
### Q2: 如何追加多行数据?
多次调用 insert 命令:
```bash
dexcel data.xlsx insert "数据1|数据2"
dexcel data.xlsx insert "数据3|数据4"
```
### Q3: 负数参数怎么用?
```bash
dexcel data.xlsx query -5 # 最后5行
dexcel data.xlsx delete -1 # 删除最后一行
```
### Q4: 如何处理中文内容?
直接传入,完全支持 UTF-8
```bash
dexcel data.xlsx insert "张三|18|北京"
```
### Q5: 如何在脚本中使用 count
```bash
# 获取行数并存储到变量
$lines = dexcel data.xlsx count
# 条件判断
if ((dexcel data.xlsx count) -gt 100) {
Write-Host "文件超过100行"
}
```
### Q6: 删除操作能撤销吗?
不能撤销,请谨慎操作!建议先备份文件。
## 🎯 应用场景
### 1. 数据预览
快速查看大型 Excel 文件的部分内容:
```bash
dexcel large-file.xlsx query 5
```
### 2. 数据提取
提取特定数据并导出:
```bash
dexcel data.xlsx query -10 > last-rows.txt
```
### 3. 报告生成
创建报告模板:
```bash
dexcel report.xlsx insert "月度报告||||"
dexcel report.xlsx insert "日期|销售额|利润|备注"
```
### 4. 数据更新
批量更新某列数据:
```bash
dexcel data.xlsx update "新值" --row 5 --cell 2
dexcel data.xlsx update "新值" --row 6 --cell 2
```
### 5. 数据清理
删除错误数据:
```bash
# 删除前5行
dexcel data.xlsx delete 5
# 删除第10到第20行
dexcel data.xlsx delete 10 20
```
### 6. 自动化脚本
PowerShell 批量导入:
```powershell
$students = @(
@("张三", "18", "一班"),
@("李四", "19", "二班")
)
foreach ($student in $students) {
dexcel students.xlsx insert "$($student[0])|$($student[1])|$($student[2])"
}
```
## 📝 批处理脚本示例
### Windows 批量导入 (import.bat)
```batch
@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)
```powershell
# 读取并处理数据
$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](https://github.com/nomiddlename/umya-spreadsheet) - 优秀的 Excel 读写库,完整保留样式
- [tabled](https://github.com/zhiburt/tabled) - 美观的表格格式化库
- [clap](https://github.com/clap-rs/clap) - 优秀的命令行参数解析库
- [chrono](https://github.com/chronotope/chrono) - 日期时间处理库
- [thiserror](https://github.com/dtolnay/thiserror) - 错误处理库
---
**Made with ❤️ using Rust**