为满足工作场景下 Excel 到 JSON 的转换需求,我开发了一款实用工具,以此提升了工作效率并深入学习 Python 文件处理与 GUI 开发技术,以下是从开发到打包的完整过程分享。

项目背景与目标
在日常工作中,我经常需要处理 Excel 文件(.xlsx 或 .xls),并将其中的数据转换为 JSON 格式使用。手动转换既耗时又容易出错,因此我决定开发一个自动化的工具,这个工具的目标是:
- 提供简单易用的图形界面
- 支持常见的 Excel 文件格式
- 能够处理包含中文字符的数据
- 允许用户复制转换后的 JSON 数据到剪贴板
技术选型
为了实现这个工具,我选择了以下技术栈:
- Python:作为主要编程语言,因其简洁的语法和丰富的库生态
- tkinter:Python 自带的 GUI 库,适合快速开发简单的桌面应用
- pandas:强大的数据处理库,能够轻松读取 Excel 文件并转换为 JSON
- pyperclip:用于实现复制功能,将 JSON 数据复制到剪贴板
- openpyxl:作为 pandas 的引擎,用于读取 Excel 文件
- PyInstaller:打包工具,打包成了独立的可执行文件 ExcelToJsonPro.exe
开发过程
创建基本窗口
首先,我创建了一个基本的 tkinter 窗口,设置窗口标题和大小:
python
import tkinter as tk
class ExcelToJsonConverter:
def __init__(self, root):
self.root = root
self.root.title("Excel to JSON Converter")
self.root.geometry("600x400")
if __name__ == "__main__":
root = tk.Tk()
app = ExcelToJsonConverter(root)
root.mainloop()
设计用户界面
接下来,我设计了工具的用户界面,包括上传按钮、文件路径显示、转换按钮、JSON 显示区域和复制按钮:
python
def create_widgets(self):
# 上传按钮
self.upload_btn = tk.Button(
self.root,
text="上传Excel文件",
command=self.upload_excel,
bg="#4CAF50",
fg="white",
font=("Arial", 12)
)
self.upload_btn.pack(pady=20)
# 文件路径显示
self.file_path_label = tk.Label(
self.root,
text="未选择文件",
font=("Arial", 10)
)
self.file_path_label.pack()
# 转换按钮(初始禁用)
self.convert_btn = tk.Button(
self.root,
text="转换为JSON",
command=self.convert_to_json,
state=tk.DISABLED,
bg="#2196F3",
fg="white",
font=("Arial", 12)
)
self.convert_btn.pack(pady=10)
# JSON显示文本框
self.json_text = tk.Text(
self.root,
height=10,
width=70,
font=("Consolas", 10)
)
self.json_text.pack(pady=10, padx=10)
# 复制按钮(初始禁用)
self.copy_btn = tk.Button(
self.root,
text="复制JSON到剪贴板",
command=self.copy_json,
state=tk.DISABLED,
bg="#FF9800",
fg="white",
font=("Arial", 12)
)
self.copy_btn.pack(pady=10)
实现文件上传功能
我使用 tkinter.filedialog 实现了文件选择功能,并在选择文件后更新界面状态:
python
def upload_excel(self):
file_path = filedialog.askopenfilename(
title="选择Excel文件",
filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")]
)
if file_path:
self.file_path = file_path
self.file_path_label.config(text=file_path)
self.convert_btn.config(state=tk.NORMAL)
self.copy_btn.config(state=tk.DISABLED)
self.json_text.delete(1.0, tk.END)
实现文件转换功能
这是整个工具的核心部分,我使用 pandas 库读取 Excel 文件并转换为 JSON:
python
def convert_to_json(self):
if not self.file_path:
messagebox.showerror("错误", "请先选择Excel文件")
return
try:
# 读取Excel文件
df = pd.read_excel(self.file_path, engine='openpyxl')
# 转换为JSON格式
json_data = df.to_json(orient="records", indent=4, force_ascii=False)
# 显示JSON数据
self.json_text.delete(1.0, tk.END)
self.json_text.insert(tk.END, json_data)
# 启用复制按钮并保存JSON数据
self.copy_btn.config(state=tk.NORMAL)
self.json_data = json_data
except Exception as e:
messagebox.showerror("错误", f"转换失败:\n{str(e)}")
self.copy_btn.config(state=tk.DISABLED)
实现复制功能
最后,我实现了将 JSON 数据复制到剪贴板的功能:
python
def copy_json(self):
if not self.json_data:
messagebox.showerror("错误", "没有可复制的JSON数据")
return
try:
pyperclip.copy(self.json_data)
messagebox.showinfo("成功", "JSON已复制到剪贴板!")
except Exception as e:
messagebox.showerror("错误", f"复制失败:\n{str(e)}")
完整代码
以下是完整的工具代码,文件名为 excelTojson.py:
python
import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
import pyperclip
class ExcelToJsonConverter:
def __init__(self, root):
self.root = root
self.root.title("Excel to JSON Converter")
self.root.geometry("600x400")
# 初始化变量
self.file_path = None
self.json_data = None
# 创建UI组件
self.create_widgets()
def create_widgets(self):
# 上传按钮
self.upload_btn = tk.Button(
self.root,
text="上传Excel文件",
command=self.upload_excel,
bg="#4CAF50",
fg="white",
font=("Arial", 12)
)
self.upload_btn.pack(pady=20)
# 文件路径显示
self.file_path_label = tk.Label(
self.root,
text="未选择文件",
font=("Arial", 10)
)
self.file_path_label.pack()
# 转换按钮(初始禁用)
self.convert_btn = tk.Button(
self.root,
text="转换为JSON",
command=self.convert_to_json,
state=tk.DISABLED,
bg="#2196F3",
fg="white",
font=("Arial", 12)
)
self.convert_btn.pack(pady=10)
# JSON显示文本框
self.json_text = tk.Text(
self.root,
height=10,
width=70,
font=("Consolas", 10)
)
self.json_text.pack(pady=10, padx=10)
# 复制按钮(初始禁用)
self.copy_btn = tk.Button(
self.root,
text="复制JSON到剪贴板",
command=self.copy_json,
state=tk.DISABLED,
bg="#FF9800",
fg="white",
font=("Arial", 12)
)
self.copy_btn.pack(pady=10)
def upload_excel(self):
file_path = filedialog.askopenfilename(
title="选择Excel文件",
filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")]
)
if file_path:
self.file_path = file_path
self.file_path_label.config(text=file_path)
self.convert_btn.config(state=tk.NORMAL)
self.copy_btn.config(state=tk.DISABLED)
self.json_text.delete(1.0, tk.END)
def convert_to_json(self):
if not self.file_path:
messagebox.showerror("错误", "请先选择Excel文件")
return
try:
# 读取Excel文件
df = pd.read_excel(self.file_path, engine='openpyxl')
# 转换为JSON格式
json_data = df.to_json(orient="records", indent=4, force_ascii=False)
# 显示JSON数据
self.json_text.delete(1.0, tk.END)
self.json_text.insert(tk.END, json_data)
# 启用复制按钮并保存JSON数据
self.copy_btn.config(state=tk.NORMAL)
self.json_data = json_data
except Exception as e:
messagebox.showerror("错误", f"转换失败:\n{str(e)}")
self.copy_btn.config(state=tk.DISABLED)
def copy_json(self):
if not self.json_data:
messagebox.showerror("错误", "没有可复制的JSON数据")
return
try:
pyperclip.copy(self.json_data)
messagebox.showinfo("成功", "JSON已复制到剪贴板!")
except Exception as e:
messagebox.showerror("错误", f"复制失败:\n{str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = ExcelToJsonConverter(root)
root.mainloop()
使用说明
安装必要的依赖库:
bash
pip install pandas openpyxl pyperclip
运行程序:
bash
python excelTojson.py
为了方便用户使用,我使用 PyInstaller 将工具打包成了独立的可执行文件 ExcelToJsonPro.exe。以下是具体的打包步骤:
安装 PyInstaller
首先,确保安装了 PyInstaller:
bash
pip install pyinstaller
打包命令 在命令行中导航到包含 excelTojson.py 文件的目录,然后运行以下命令进行打包:
bash
pyinstaller --onefile --windowed --name ExcelToJsonPro excelTojson.py
命令参数解释:
- --onefile:将所有依赖打包到一个单独的 .exe 文件中,便于分发。
- --windowed:生成一个没有终端窗口的 GUI 应用程序。
- --name ExcelToJsonPro:指定生成的可执行文件的名称为 ExcelToJsonPro.exe。
生成的文件位置
打包完成后,ExcelToJsonPro.exe 文件会出现在项目目录下的 dist 文件夹中。

验证打包结果
在 dist 文件夹中找到生成的 ExcelToJsonPro.exe 文件,双击运行,确保程序能够正常启动并运行所有功能。

下载体验:无需安装 Python 和相关依赖,直接运行该文件即可使用工具。下载链接如下:
mp-779f4133-ea71-4a67-b4af-8cecfd13e8e1.cdn.bspapp.com/ExcelToJson...