• Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】


    背景   

            最近在使用JavaScript编写一些浏览器RPA脚本,脚本使用过程中遇到一些问题,脚本使用的数据往往存放在excel表,但运行时只能读取json数据,导致频繁人工exceljson,效率低下。

            遇到问题后赶紧搜索exceljson小工具,发现可以直接使用的工具很少,基本只提供部分代码,而且没有图形化界面。

            还是自己动手好玩。本篇文章介绍使用Python开发excel一键转json小工具,实现任意选中excelxlsxxls文件转化成json文件,并把结果显示在界面中。


    目录

                        一、使用教程

    二、源码解析

    三、下载地址


    一、excel一键转json小工具使用教程

             小工具使用Python Tkinter作为图形GUI,说实话有点难看,但是实用,Window系统直接双击运行即可。

    (一)程序运行界面

            小工具运行效果,如下图 : 

    小工具运行效果图

            excel转换json前后比对效果,如下图 :        

    转换前后比对

             

             (二)小工具操作步骤

            1)选择需要转换的excel文件,支持xlsxxls格式,表格尽量简单,暂时不支持复杂嵌套的json格式转换。

    选择excel文件

             2)点击开始转换,转换后结果显示在界面程序中,可以随时拷贝到其他地方。

    开始转换并显示结果

    二、源码解析

    (一)小工具图形界面设计

            小工具界面需要包含excel文件选择点击按钮、转化结果状态显示栏、带滑块的转换结果文本显示区域,如下图设计界面。

             这里使用Tkinter制作界面,使用了.gird布局,代码如下:

    1. from tkinter import Tk, Label, Button, StringVar, filedialog, Text, Scrollbar
    2. # 显示文件路径组件,_label_filepath_text为文件路径
    3. _label_filepath_text = None
    4. _text = None
    5. _label_state_text = None
    6. def open_window():
    7. # 创建窗口
    8. root = Tk()
    9. # 设置窗口的标题
    10. root.title("excel表格数据转json小工具")
    11. root.geometry("720x360")
    12. _button = Button(root, text="选择excel文件......", command=open_file)
    13. _button.grid(row=1, column=0)
    14. # 创建label可变文本,用于动态更新选中的文件路径
    15. global _label_filepath_text,_text
    16. _label_filepath_text = StringVar()
    17. _label_filepath = Label(root, textvariable=_label_filepath_text)
    18. _label_filepath.grid(row=2, column=0,columnspan=2)
    19. #创建滑块,并绑定文本框
    20. _yscrollbar = Scrollbar(root)
    21. _yscrollbar.grid(row=3,column=3,sticky="NS")
    22. _text = Text(root,height=21,width=99)
    23. _text.grid(row=3,column=0,columnspan=2)
    24. _yscrollbar.config(command=_text.yview)
    25. _text.config(yscrollcommand=_yscrollbar.set)
    26. # 创新开始、停止按钮
    27. _button_start = Button(root, text="开始转换", command=start_transform_file)
    28. _button_start.grid(row=1, column=1)
    29. # 创建label可变文本,用于动态更新发送文件状态
    30. global _label_state_text
    31. _label_state_text = StringVar()
    32. _label_state_text.set("待转换")
    33. _label_state = Label(root, textvariable=_label_state_text)
    34. _label_state.grid(row=4, column=0,columnspan=2)
    35. # 显示窗口
    36. root.mainloop()

    (二)使用xlrd2库读取excel文件

            使用xlrd2库按行读取excel文件,读取表头、列头、表数据,这里需要主要的是最新版本的xlrd不支持xlsx,需要安装xlrd2才行。

    1. import os
    2. import json
    3. import xlrd2
    4. fileTypeArray = [".xlsx",".xls"]
    5. def readAllExecl():
    6. currentPath = os.getcwd()+"/files"
    7. for dir in [x for x in os.listdir(currentPath)]:
    8. localPath = os.path.join(currentPath, dir)
    9. if os.path.isfile(localPath):
    10. filesp = os.path.splitext(localPath)
    11. for k in fileTypeArray:
    12. if filesp[1] == k:
    13. filename = os.path.basename(localPath)
    14. readExecl(localPath,filename.split('.')[0])
    15. def readExecl(path,name):
    16. workbook = xlrd2.open_workbook(path)
    17. sheet2_name = workbook.sheet_names()[0]
    18. sheet=workbook.sheet_by_name(sheet2_name) # sheet索引从0开始
    19. # sheet的名称,行数,列数
    20. adict = {}
    21. for i in range(1,sheet.nrows):
    22. data = {}
    23. for j in range(0,sheet.ncols):
    24. value = TransformationType(sheet.cell_value(i,j))
    25. if isinstance(value , str):
    26. if isJsonString(value):
    27. data[TransformationType(sheet.cell_value(0,j))] = eval(value)
    28. else:
    29. data[TransformationType(sheet.cell_value(0,j))] = value
    30. else:
    31. data[TransformationType(sheet.cell_value(0,j))] = value
    32. adict[TransformationType(sheet.cell_value(i,0))]= data
    33. data = json.dumps(adict,indent=1,ensure_ascii=False)
    34. _json_save_path = os.getcwd() + "/" + name + '.json'
    35. f=open(_json_save_path,'w')
    36. f.write(data)
    37. f.close()
    38. print("already create json:" + path)
    39. return data,_json_save_path
    40. def isJsonString(str):
    41. try:
    42. eval(str)
    43. except Exception as e :
    44. return False
    45. return True
    46. def TransformationType(var):
    47. if isinstance(var ,float) : #type(var) == 'float':
    48. str1 = int(var)
    49. elif isinstance(var, str): #type(var) == 'unicode':
    50. str1 = var
    51. else:
    52. raise Exception("type is not deal")
    53. str1 = var
    54. return str1

    (三)Python字典格式转json格式

            将读取的excel数据存入字典。

    1. adict = {}
    2. for i in range(1,sheet.nrows):
    3. data = {}
    4. for j in range(0,sheet.ncols):
    5. value = TransformationType(sheet.cell_value(i,j))
    6. if isinstance(value , str):
    7. if isJsonString(value):
    8. data[TransformationType(sheet.cell_value(0,j))] = eval(value)
    9. else:
    10. data[TransformationType(sheet.cell_value(0,j))] = value
    11. else:
    12. data[TransformationType(sheet.cell_value(0,j))] = value
    13. adict[TransformationType(sheet.cell_value(i,0))]= data

             转字典数据换成json格式。这里需要注意需要增加ensure_ascii=False参数,否则显示字符串的时候会出现乱码

    data = json.dumps(adict,indent=1,ensure_ascii=False)

    (四)保存json格式文件并把结果显示在界面上

            把转换后的json文本显示到程序界面,文本可拷贝可编辑。

    1. # 点击,转换文件
    2. def start_transform_file():
    3. global _label_filepath_text,_text,_label_state_text
    4. _file_path = _label_filepath_text.get()
    5. _file_type_list = [".xlsx", ".xls"]
    6. if _file_path is not None:
    7. if os.path.isfile(_file_path):
    8. filesp = os.path.splitext(_file_path)
    9. for k in _file_type_list:
    10. if filesp[1] == k:
    11. filename = os.path.basename(_file_path)
    12. _json_data = excel2json.readExecl(_file_path, filename.split('.')[0])
    13. _text.insert("end",_json_data[0])
    14. _label_state_text.set("转换完毕,json文件存放地址为:"+_json_data[1])

    三、下载地址

    (一)excel转json小工具.exe,可执行文件下载地址

    https://download.csdn.net/download/qq616491978/87097155

    (二)excel转json小工具源码下载地址

    https://download.csdn.net/download/qq616491978/87097172

  • 相关阅读:
    ros 接收相机数据数据并发布
    Web3.0的测试题
    vue3.0实战项目
    学习Python的运行方式
    某城商银行生产容器云平台详细设计方案分享及经验总结
    功能测试和非功能测试区别简析,上海好口碑软件测试公司推荐
    k8s核心概念pod 基本定义和命令
    陆拾捌- 如何通过数据影响决策(三)
    L2-3 图着色问题
    linux 配置安装node.js
  • 原文地址:https://blog.csdn.net/qq616491978/article/details/127896528