Files
tools/dexcel/README.md
T

515 lines
12 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 处理工具,支持查询、统计、插入、更新和删除操作。
## ✨ 功能特性
### 核心操作
- 🔍 **query**: 灵活查询 Excel 数据,支持行范围选择和自定义分隔符
- 📊 **count**: 快速统计行数,适合脚本使用
- **insert**: 插入新行,支持指定位置或追加到末尾
- ✏️ **update**: 更新现有数据,支持部分列更新
-**delete**: 删除行或单元格,带安全确认机制
### 通用特性
- 📑 **多 Sheet 支持**: 所有操作都支持 `--sheet` 参数指定工作表
- 🔢 **负数索引**: 支持负数行号(-1 表示最后一行)
- 🆕 **自动创建**: insert 操作在文件不存在时自动创建
- ⚠️ **安全确认**: delete 操作需要用户确认
- 📤 **灵活输出**: 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. 插入数据 (insert)
```bash
# 创建新文件并插入表头
dexcel new-file.xlsx 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>`: 分隔符(默认 |
### 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
# 删除整行(带确认)
dexcel data.xlsx delete --row 5
# 删除最后一行
dexcel data.xlsx delete --row -1
# 删除单元格(第3行第2列)
dexcel data.xlsx delete --row 3 --cell 2
# 指定 Sheet
dexcel data.xlsx delete --row 1 --sheet "Sheet2"
```
#### delete 参数说明
- `[COUNT]`: 删除数量(默认1
- `--row <ROW>`: 行号(必需,支持负数)
- `--cell <CELL>`: 列号(可选,不指定则删除整行)
- `--sheet <SHEET>`: Sheet 名称(可选)
**注意**: delete 操作需要用户确认(输入 y 继续)
## 💡 使用示例
### 示例 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
# 删除错误数据行
dexcel data.xlsx delete --row 10
# 删除最后一行
dexcel data.xlsx delete --row -1
# 删除特定单元格
dexcel data.xlsx delete --row 5 --cell 3
```
### 示例 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"
```
## 📊 输出格式
### query 输出(表格格式)
```
┌──────┬──────┬──────┐
│ 姓名 │ 年龄 │ 城市 │
├──────┼──────┼──────┤
│ 张三 │ 25 │ 北京 │
├──────┼──────┼──────┤
│ 李四 │ 30 │ 上海 │
└──────┴──────┴──────┘
共输出 2 行数据,3 列
```
**特点**:
- ✅ 使用美观的表格格式(基于 tabled 库)
- ✅ 自动对齐列宽
- ✅ 清晰的分隔线和边框
- ✅ 显示行数和列数统计
- ✅ 易于阅读和查看
### count 输出
```
100
```
**特点**:
- 只输出一个数字
- 适合脚本中使用
- 可与其他命令组合
### 操作反馈
**insert 成功**:
```
✓ 操作成功:已创建新文件并插入一行数据
文件: data.xlsx, Sheet: Sheet1
```
**update 成功**:
```
✓ 操作成功:已更新第 5 行,从第 1 列开始
文件: data.xlsx, Sheet: Sheet1
```
**delete 成功**:
```
✓ 操作成功:已删除第 5 行
剩余行数: 9
文件: data.xlsx, Sheet: Sheet1
```
## ⚙️ 技术细节
### 依赖库
- **calamine**: Excel 文件读取库,支持 .xlsx 格式
- **rust_xlsxwriter**: Excel 文件写入库,功能强大
- **clap**: 命令行参数解析库
- **chrono**: 日期时间处理库
### 工作原理
#### 查询流程
1. 打开 Excel 文件
2. 选择指定的 Sheet(默认第一个)
3. 根据参数计算读取范围
4. 遍历单元格并提取数据
5. 以指定分隔符格式输出
#### 写入流程
1. 检查文件是否存在(insert 可自动创建)
2. 读取现有数据到新工作簿
3. 执行插入/更新/删除操作
4. 保存文件
### 数据类型支持
**读取时支持:**
- 字符串 (String)
- 整数 (Int)
- 浮点数 (Float)
- 布尔值 (Bool)
- 日期时间 (DateTime) - 自动识别并格式化
- 空值 (Empty)
- 错误值 (Error)
**写入时:**
- 所有数据都作为字符串写入
## ⚠️ 注意事项
1. **索引从 1 开始**: 行和列的索引都是从 1 开始,不是 0
2. **负数索引**: `-1` = 最后一行/列,`-2` = 倒数第二
3. **文件自动创建**: insert 操作在文件不存在时自动创建
4. **分隔符默认**: 默认使用 `|` 分隔列
5. **文件格式**: 仅支持 `.xlsx`,不支持 `.xls`
6. **删除需确认**: delete 操作必须用户确认才能执行
7. **日期自动识别**: 自动识别并格式化日期单元格
8. **不可撤销**: delete 操作不可撤销,请谨慎操作!
### 限制
**读取限制:**
- 公式: 不计算公式,只读取原始值
- 样式: 不读取单元格样式(颜色、字体等)
- 图表: 不支持读取图表
- 宏: 不支持 VBA 宏
- 大文件: > 10MB 的文件可能较慢
**写入限制:**
- 无样式: 不能设置颜色、字体等样式
- 无公式: 不能写入公式
- 覆盖警告: update 会覆盖目标单元格的原有内容
- insert 下移: insert 会将原有数据下移
## 🔧 常见问题
### 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 --row -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
dexcel data.xlsx delete --row 10
```
### 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 许可证。
## 🙏 致谢
感谢以下开源项目:
- [calamine](https://github.com/tafia/calamine) - 优秀的 Excel 读取库
- [rust_xlsxwriter](https://github.com/jmcnamara/rust_xlsxwriter) - 强大的 Excel 写入库
- [clap](https://github.com/clap-rs/clap) - 优秀的命令行参数解析库
- [chrono](https://github.com/chronotope/chrono) - 日期时间处理库
---
**Made with ❤️ using Rust**