
🚀 Python实战:打造高效Excel转JSON配置工具 (基于PyQt5 + Calamine)
在数据处理和配置管理中,我们经常需要将 Excel 表格数据转换为 JSON 格式。虽然 Python 有很多库可以处理 Excel(如 pandas, openpyxl),但在面对非技术用户或需要频繁调整字段映射的场景时,一个可视化的桌面工具会大大提高效率。
本文将介绍如何使用 PyQt5 构建一个支持拖拽、字段映射和自动聚合的 Excel 转 JSON 工具,并使用 python-calamine 实现高性能读取。
✨ 核心功能
这个工具主要解决了以下痛点:
- 多文件处理:支持直接拖拽多个文件或文件夹进行批量转换。
- 可视化配置:无需修改代码,直接在界面上勾选作为 Key 或 Value 的列。
- 字段映射:支持将 Excel 列名重命名为 JSON 中的新 Key。
- 数据聚合:对于数值型字段,支持自动累加(Accumulate)操作。
- 高性能:使用 Rust 编写的
python-calamine库,读取速度远超传统库。
Github: 转换器2026版本极速版
Github: 转换器2026版本极速版
🛠️ 技术栈
- Python 3.x
- PyQt5: 用于构建图形用户界面。
- python-calamine: 基于 Rust 的
calamine库的 Python 绑定,提供极速的 Excel 读取能力。
💻 实现细节
1. 核心转换逻辑 (main.py)
为了保证逻辑与界面分离,我们将核心转换功能封装在 roster_json 函数中。
关键点:
- 使用
python_calamine读取 Excel,获取迭代器。 - 动态构建字典 Key(支持多列组合 Key)。
- 处理数值累加逻辑。
import json
import os
import python_calamine
def roster_json(file_path, key_columns, value_columns, json_name, accumulate_or_not, columns_mapping=None):
# ... (省略部分初始化代码) ...
# 使用 Calamine 高效读取
f_r = open(file_path, 'rb')
xls = python_calamine.CalamineWorkbook.from_filelike(f_r)
rows = iter(xls.get_sheet_by_index(0).to_python())
# ... (遍历行并处理数据逻辑) ...
2. 拖拽文件支持 (gui.py)
为了提升体验,我们重写了 QListWidget 以支持文件拖拽。
class DropListWidget(QListWidget):
files_dropped = pyqtSignal(list)
def __init__(self):
super().__init__()
self.setAcceptDrops(True) # 开启拖拽支持
def dropEvent(self, event):
files = []
if event.mimeData().hasUrls():
for url in event.mimeData().urls():
path = url.toLocalFile()
# 递归处理文件夹和筛选 .xlsx 文件
# ...
if files:
self.files_dropped.emit(files)
event.accept()
3. 动态配置表格
界面的右侧是一个 QTableWidget,它会在用户拖入文件后自动读取表头,并生成配置行。
- 列名: 自动读取自 Excel 首行。
- Key/Value/Accumulate: 使用
QCheckBox(通过ItemIsUserCheckable标志实现)。 - 映射名: 使用
QLineEdit(实际上是可编辑的QTableWidgetItem) 允许用户输入新的字段名。
def populate_table(self):
self.col_table.setRowCount(len(self.current_headers))
for row, col_name in enumerate(self.current_headers):
# 设置列名 (只读)
# 设置 Checkbox (Key, Value, Accumulate)
# 设置 映射输入框
📖 使用指南
- 启动程序:运行
python gui.py。 - 导入文件:将 Excel 文件直接拖入左侧列表。
- 配置字段:
- Key: 勾选作为唯一标识的列(支持多选,将用
_连接)。 - Value: 勾选需要提取的数据列。
- Accumulate: 勾选需要累加的数值列(如重量、体积)。
- 映射名: 如果需要修改输出的 Key 名称,在此列输入。
- Key: 勾选作为唯一标识的列(支持多选,将用
- 生成:点击“开始转换”,JSON 文件将生成在
./json数据/目录下。
📝 总结
通过结合 PyQt5 的交互能力和 Calamine 的性能优势,我们快速构建了一个实用的数据处理小工具。这个架构非常适合作为内部效率工具的模板,只需替换核心处理函数,即可扩展为 CSV 转换器、图片批量处理器等应用。
完整代码已包含在项目中: