Files
tools/dexcel/README.md
T
macro cb5d7d0768 docs(README): 更新文档添加换行符处理功能说明
- 添加换行符支持特性说明
- 新增换行符使用示例和常见问题解答
- 扩展技术细节中的换行符智能处理说明
- 更新注意事项中关于换行处理的内容
- 添加多行文本处理的使用示例
2026-04-26 01:01:51 +08:00

693 lines
17 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 操作默认需要用户确认,可用 `-y` 跳过
- 💾 **样式保留**: 使用 umya-spreadsheet 库,完整保留 Excel 样式
- 📤 **表格输出**: query 以美观的表格格式显示数据
- 📅 **日期智能**: 自动识别和格式化日期时间单元格
- 🧹 **备份清理**: 操作成功后自动删除 .bak 备份文件
- ↩️ **换行支持**: 智能处理各种换行符格式,自动开启换行并调整行高
## 📦 安装
### 从源码编译
```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 命令要求文件必须已存在,如果文件不存在会报错。
**换行符支持**
```bash
# 使用字面量 \n(单引号)
dexcel data.xlsx insert '第一行\n第二行\n第三行|其他列'
# 使用 PowerShell 转义(双引号 + `r`n
dexcel data.xlsx insert "Line1`r`nLine2,Col2" --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>`: 分隔符(默认 |
**换行符支持**
```bash
# 更新单元格为多行文本
dexcel data.xlsx update '新内容\n带换行' --row 5
# 自动开启换行并调整行高
dexcel data.xlsx update "Line1`nLine2" --row 3 --split ","
```
### 5. 删除数据 (delete)
```bash
# 删除第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)
```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 -y
# 从第10行开始删除5行
dexcel data.xlsx delete 10 --count 5 -y
# 删除最后3行
dexcel data.xlsx delete -3 --count 3 -y
```
### 示例 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"
```
### 示例 7: 处理多行文本
```bash
# 插入带换行的内容(单引号中使用 \n)
dexcel data.xlsx insert '地址:北京市\n朝阳区\n建国路100号|备注'
# 使用 PowerShell 转义符(双引号中使用 `r`n)
dexcel data.xlsx insert "Line1`r`nLine2`r`nLine3,Col2" --split ","
# 更新为多行文本
dexcel data.xlsx update '说明:第一项\n说明:第二项' --row 2
# 程序会自动:
# 1. 识别并转换所有换行格式(\r\n, \n, `r`n
# 2. 开启单元格的自动换行功能
# 3. 根据行数自动调整行高(每行约15磅)
```
## 📊 输出格式
### 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**: 错误处理库
### 工作原理
#### 工作流程
1. 打开 Excel 文件(使用 umya-spreadsheet
2. 选择指定的 Sheet(默认第一个)
3. 执行相应操作(查询/插入/更新/删除/样式设置)
4. 保存文件(保留原有样式)
### 数据类型支持
**读取时支持:**
- 字符串 (String)
- 整数 (Int)
- 浮点数 (Float)
- 布尔值 (Bool)
- 日期时间 (DateTime) - 自动识别并格式化
- `2024-01-15` → 显示为 `2024-01-15`
- `2024-12-25 14:30:00` → 显示为 `2024-12-25 14:30:00`
- `14:30:00` → 显示为 `14:30:00`
- 空值 (Empty)
- 错误值 (Error)
**写入时:**
- 所有数据都作为字符串写入
- 日期时间自动识别并转换为 Excel 序列号
- 样式完全保留
- **换行符智能处理**
- 真正的 `\r\n` (ASCII 13+10) → 转换为 `\n`
- 字面量 `\r\n` (4个字符) → 转换为 `\n`
- 字面量 `\n` (2个字符) → 转换为 `\n`
- 自动开启单元格自动换行
- 自动调整行高(每行约15磅)
## ⚠️ 注意事项
1. **索引从 1 开始**: 行和列的索引都是从 1 开始,不是 0
2. **负数索引**: `-1` = 最后一行/列,`-2` = 倒数第二
3. **文件必须存在**: insert/update/delete 操作要求文件必须已存在
4. **分隔符默认**: 默认使用 `|` 分隔列
5. **文件格式**: 仅支持 `.xlsx`,不支持 `.xls`
6. **删除需确认**: delete 操作默认需要用户确认,可用 `-y` 跳过
7. **日期自动识别**: 自动识别并格式化日期单元格 (如 `2024-01-15`, `2024-12-25 14:30:00`)
8. **样式保留**: 使用 umya-spreadsheet 库,完整保留 Excel 样式
9. **备份清理**: 操作成功后自动删除 .bak 备份文件
10. **不可撤销**: delete 操作不可撤销,请谨慎操作!
11. **样式设置**: style 命令可设置行高、列宽、自动换行等样式
12. **换行处理**: insert/update 自动处理换行符,开启自动换行并调整行高
### 限制
**读取限制:**
- 公式: 不计算公式,只读取原始值
- 图表: 不支持读取图表
- 宏: 不支持 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 -y # 删除最后一行
```
### 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: 删除操作能撤销吗?
不能撤销,请谨慎操作!建议先备份文件。
### Q7: 如何跳过删除确认?
使用 `-y``--yes` 参数:
```bash
dexcel data.xlsx delete 5 --count 3 -y
```
### Q8: 如何处理多行文本?
**方法 1: 使用单引号 + 字面量 \n**
```bash
dexcel data.xlsx insert '第一行\n第二行\n第三行'
```
**方法 2: 使用 PowerShell 双引号 + `` `r`n ``**
```powershell
dexcel data.xlsx insert "Line1`r`nLine2`r`nLine3"
```
**方法 3: 使用 Bash/Shell**
```bash
dexcel data.xlsx insert $'Line1\nLine2\nLine3'
```
程序会自动:
- ✅ 识别并转换所有换行格式
- ✅ 开启单元格自动换行
- ✅ 根据行数自动调整行高(每行约15磅)
- ✅ 保留原有样式不变
### Q9: 行高会自动调整吗?
是的!当检测到单元格包含换行符时,程序会:
1. 计算行数(换行符数量 + 1
2. 估算所需行高(每行约15磅)
3. 只在当前行高小于估算值时才调整
4. 不会覆盖用户手动设置的行高
如果需要精确控制行高,可以使用 style 命令:
```bash
dexcel data.xlsx style --rows 5 --row-height 50
```
## 🎯 应用场景
### 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 -y
# 从第10行开始删除5行
dexcel data.xlsx delete 10 --count 5 -y
# 删除最后3行
dexcel data.xlsx delete -3 --count 3 -y
```
### 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**