200字
打造高效Excel转JSON配置工具打造高效Excel转JSON配置工具
2025-12-25
2025-12-25

image-lrYQ.png

🚀 Python实战:打造高效Excel转JSON配置工具 (基于PyQt5 + Calamine)

在数据处理和配置管理中,我们经常需要将 Excel 表格数据转换为 JSON 格式。虽然 Python 有很多库可以处理 Excel(如 pandas, openpyxl),但在面对非技术用户或需要频繁调整字段映射的场景时,一个可视化的桌面工具会大大提高效率。

本文将介绍如何使用 PyQt5 构建一个支持拖拽、字段映射和自动聚合的 Excel 转 JSON 工具,并使用 python-calamine 实现高性能读取。


✨ 核心功能

这个工具主要解决了以下痛点:

  1. 多文件处理:支持直接拖拽多个文件或文件夹进行批量转换。
  2. 可视化配置:无需修改代码,直接在界面上勾选作为 Key 或 Value 的列。
  3. 字段映射:支持将 Excel 列名重命名为 JSON 中的新 Key。
  4. 数据聚合:对于数值型字段,支持自动累加(Accumulate)操作。
  5. 高性能:使用 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)
        # 设置 映射输入框

📖 使用指南

  1. 启动程序:运行 python gui.py
  2. 导入文件:将 Excel 文件直接拖入左侧列表。
  3. 配置字段
    • Key: 勾选作为唯一标识的列(支持多选,将用 _ 连接)。
    • Value: 勾选需要提取的数据列。
    • Accumulate: 勾选需要累加的数值列(如重量、体积)。
    • 映射名: 如果需要修改输出的 Key 名称,在此列输入。
  4. 生成:点击“开始转换”,JSON 文件将生成在 ./json数据/ 目录下。

📝 总结

通过结合 PyQt5 的交互能力和 Calamine 的性能优势,我们快速构建了一个实用的数据处理小工具。这个架构非常适合作为内部效率工具的模板,只需替换核心处理函数,即可扩展为 CSV 转换器、图片批量处理器等应用。

完整代码已包含在项目中:

打造高效Excel转JSON配置工具打造高效Excel转JSON配置工具
作者
一晌小贪欢
发表于
2025-12-25
License
CC BY-NC-SA 4.0

评论