Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用Python实现JSON到Excel的转换

用Python实现JSON到Excel的转换
EN

Stack Overflow用户
提问于 2020-12-15 03:53:53
回答 2查看 203关注 0票数 0

我有一个JSON,需要转换为Excel。我使用的是带有xlsxwriter库的Python 3.8。下面是JSON示例。

代码语言:javascript
运行
AI代码解释
复制
{
    "companyId": "123456",
    "companyName": "Test",
    "companyStatus": "ACTIVE",
    "document": {
        "employee": {
            "employeeId": "EM1567",
            "employeeLastName": "Test Last",
            "employeeFirstName": "Test Fist"
        },
        "expenseEntry": [
            {
            "allocation": [
                {
                "allocationId": "03B249B3598",
                "journal": [
                    {
                        "journalAccountCode": "888",
                        "journalPayee": "EMPL",
                        "journalPayer": "COMP",
                        "taxGuid": [
                            "51645A638114E"
                        ]
                    },
                    {
                        "journalAccountCode": "999",
                        "journalPayee": "EMPL",
                        "journalPayer": "EMPL",
                        "taxGuid": [
                            "8114E51645A63"
                        ]
                    },
                ],
                "tax": [
                    {
                        "taxCode": "TAX123",
                        "taxSource": "SYST"
                    },
                    {
                        "taxCode": "TAX456",
                        "taxSource": "SYST"
                    }
                ]
                }
            ],
            "approvedAmount": 200.0,
            "entryDate": "2020-12-10",
            "entryId": "ENTRY9988"
            }
        ],
        "report": {
            "currencyCode": "USD",
            "reportCreationDate": "2020-12-10",
            "reportId": "ACA849BBB",
            "reportName": "Test Report",
            "totalApprovedAmount": 200.0
        }
    },
    "id": "c71b7d756f549"
}

我现在的代码是:https://repl.it/@tonyiscoming/jsontoexcel

我试过用熊猫

代码语言:javascript
运行
AI代码解释
复制
import pandas as pd

df = pd.json_normalize(data, max_level=5)
df.to_excel('test.xlsx', index=False)

并得到了结果

我试着用json_excel_converter

代码语言:javascript
运行
AI代码解释
复制
from json_excel_converter import Converter 
from json_excel_converter.xlsx import Writer

conv = Converter()
conv.convert(data, Writer(file='test.xlsx'))

并得到了结果

这是我的期望

在这种情况下,有人能帮我一下吗?非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-21 22:13:50

这就是你要找的代码。我使用XlsxWriter包做到了这一点。首先,我用一些单元格格式的东西做了一个模板。在那之后,我根据您的JSON使用输入值。

代码语言:javascript
运行
AI代码解释
复制
import xlsxwriter
from itertools import zip_longest

data = [
    {
        "companyId": "123456",
        "companyName": "Test",
        "companyStatus": "ACTIVE",
        "document": {
            "employee": {
                "employeeId": "EM1567",
                "employeeLastName": "Test Last",
                "employeeFirstName": "Test Fist"
            },
            "expenseEntry": [
                {
                    "allocation": [
                        {
                            "allocationId": "03B249B3598",
                            "journal": [
                                {
                                    "journalAccountCode": "888",
                                    "journalPayee": "EMPL",
                                    "journalPayer": "COMP",
                                    "taxGuid": [
                                        "51645A638114E"
                                    ]
                                },
                                {
                                    "journalAccountCode": "999",
                                    "journalPayee": "EMPL",
                                    "journalPayer": "EMPL",
                                    "taxGuid": [
                                        "8114E51645A63"
                                    ]
                                },
                            ],
                            "tax": [
                                {
                                    "taxCode": "TAX123",
                                    "taxSource": "SYST"
                                },
                                {
                                    "taxCode": "TAX456",
                                    "taxSource": "SYST"
                                }
                            ]
                        }
                    ],
                    "approvedAmount": 200.0,
                    "entryDate": "2020-12-10",
                    "entryId": "ENTRY9988"
                }
            ],
            "report": {
                "currencyCode": "USD",
                "reportCreationDate": "2020-12-10",
                "reportId": "ACA849BBB",
                "reportName": "Test Report",
                "totalApprovedAmount": 200.0
            }
        },
        "id": "c71b7d756f549"
    }
]

xlsx_file = 'your_file_name_here.xlsx'

# define the excel file
workbook = xlsxwriter.Workbook(xlsx_file)

# create a sheet for our work, defaults to Sheet1.
worksheet = workbook.add_worksheet()

# common merge format
merge_format = workbook.add_format({'align': 'center', 'valign': 'vcenter'})

# set all column width to 20
worksheet.set_column('A:V', 20)

# column wise template creation (A-V)
worksheet.merge_range(0, 0, 4, 0, 'companyId', merge_format)  # A
worksheet.merge_range(0, 1, 4, 1, 'companyName', merge_format)  # B
worksheet.merge_range(0, 2, 4, 2, 'companyStatus', merge_format)  # C

worksheet.merge_range(0, 3, 0, 20, 'document', merge_format)  # C-U

worksheet.merge_range(1, 3, 1, 5, 'employee', merge_format)  # D-F
worksheet.merge_range(2, 3, 4, 3, 'employeeId', merge_format)  # D
worksheet.merge_range(2, 4, 4, 4, 'employeeLastName', merge_format)  # E
worksheet.merge_range(2, 5, 4, 5, 'employeeFirstName', merge_format)  # F

worksheet.merge_range(1, 6, 1, 15, 'expenseEntry', merge_format)  # G-P
worksheet.merge_range(2, 6, 2, 12, 'allocation', merge_format)  # G-M
worksheet.merge_range(3, 6, 4, 6, 'allocationId', merge_format)  # G

worksheet.merge_range(3, 7, 3, 10, 'journal', merge_format)  # H-K
worksheet.write(4, 7, 'journalAccountCode')  # H
worksheet.write(4, 8, 'journalPayee')  # I
worksheet.write(4, 9, 'journalPayer')  # J
worksheet.write(4, 10, 'taxGuid')  # K

worksheet.merge_range(3, 11, 3, 12, 'tax', merge_format)  # L-M
worksheet.write(4, 11, 'taxCode')  # L
worksheet.write(4, 12, 'taxSource')  # M

worksheet.merge_range(2, 13, 4, 13, 'approvedAmount', merge_format)  # N
worksheet.merge_range(2, 14, 4, 14, 'entryDate', merge_format)  # O
worksheet.merge_range(2, 15, 4, 15, 'entryId', merge_format)  # P

worksheet.merge_range(1, 16, 1, 20, 'report', merge_format)  # Q-U
worksheet.merge_range(2, 16, 4, 16, 'currencyCode', merge_format)  # Q
worksheet.merge_range(2, 17, 4, 17, 'reportCreationDate', merge_format)  # R
worksheet.merge_range(2, 18, 4, 18, 'reportId', merge_format)  # S
worksheet.merge_range(2, 19, 4, 19, 'reportName', merge_format)  # T
worksheet.merge_range(2, 20, 4, 20, 'totalApprovedAmount', merge_format)  # U

worksheet.merge_range(0, 21, 4, 21, 'id', merge_format)  # V

# inserting data
row = 5
for obj in data:
    worksheet.write(row, 0, obj.get('companyId'))
    worksheet.write(row, 1, obj.get('companyName'))
    worksheet.write(row, 2, obj.get('companyStatus'))

    document = obj.get('document', {})

    # employee details
    employee = document.get('employee', {})
    worksheet.write(row, 3, employee.get('employeeId'))
    worksheet.write(row, 4, employee.get('employeeLastName'))
    worksheet.write(row, 5, employee.get('employeeFirstName'))

    # report details
    report = document.get('report', {})
    worksheet.write(row, 16, report.get('currencyCode'))
    worksheet.write(row, 17, report.get('reportCreationDate'))
    worksheet.write(row, 18, report.get('reportId'))
    worksheet.write(row, 19, report.get('reportName'))
    worksheet.write(row, 20, report.get('totalApprovedAmount'))

    worksheet.write(row, 21, obj.get('id'))

    # expenseEntry details
    expense_entries = document.get('expenseEntry', [])
    for expense_entry in expense_entries:
        worksheet.write(row, 13, expense_entry.get('approvedAmount'))
        worksheet.write(row, 14, expense_entry.get('entryDate'))
        worksheet.write(row, 15, expense_entry.get('entryId'))

        # allocation details
        allocations = expense_entry.get('allocation', [])
        for allocation in allocations:
            worksheet.write(row, 6, allocation.get('allocationId'))

            # journal and tax details
            journals = allocation.get('journal', [])
            taxes = allocation.get('tax', [])
            for journal_and_tax in list(zip_longest(journals, taxes)):
                journal, tax = journal_and_tax
                worksheet.write(row, 7, journal.get('journalAccountCode'))
                worksheet.write(row, 8, journal.get('journalPayee'))
                worksheet.write(row, 9, journal.get('journalPayer'))
                worksheet.write(row, 11, tax.get('taxCode'))
                worksheet.write(row, 12, tax.get('taxSource'))

                # taxGuid details
                tax_guides = journal.get('taxGuid', [])
                if not tax_guides:
                    row = row + 1
                    continue

                for tax_guide in tax_guides:
                    worksheet.write(row, 10, tax_guide)
                    row = row + 1

# finally close the created excel file
workbook.close()

首先,您可以创建自己的模板并将其保存在其他地方,而不是在脚本中创建模板。然后获取该模板的副本,并使用脚本添加数据。这将使您有机会制作自己的基本模板,否则,您必须使用脚本格式化您的excel,如边框格式化,合并单元格等。

我使用了来自itertoolszip_longest python内置函数来压缩journaltax对象。只需遵循Python – Itertools.zip_longest()Python's zip_longest Function的文章即可获得示例。如果你不理解我的代码,请在下面发表评论。

票数 1
EN

Stack Overflow用户

发布于 2020-12-15 09:15:09

在Excel Grid中拥有空单元格并不是什么真正“合适”的事情,这就是为什么json_excel_converter会有这样的行为。所以,如果你想做到这一点,恐怕你必须自己开发它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65299781

复制
相关文章
最优控制——变分法
1、一般的最优化问题要最小化的性能指标定义在数域上,而变分问题的性能指标(目标泛函)的定义域是函数的集合。
全栈程序员站长
2022/09/20
1.3K0
最优控制——变分法
lqr算法优点(lqg控制)
LQR (linear quadratic regulator)即线性二次型调节器
全栈程序员站长
2022/07/31
1.5K0
使用 Python 和 OpenCV 构建 SET 求解器
小伙伴们玩过 SET 吗?SET 是一种游戏,玩家在指定的时间竞相识别出十二张独特纸牌中的三张纸牌(或 SET)的模式。每张 SET 卡都有四个属性:形状、阴影/填充、颜色和计数。下面是一个带有一些卡片描述的十二张卡片布局示例。
小白学视觉
2022/02/14
1.3K0
使用 Python 和 OpenCV 构建 SET 求解器
何为求解器?
最近学习到的关于求解器的新知识总结。首先求解器是用在数学规划问题中的常见工具,那么问题来了,数学中用到的工具和供应链业务有什么相关呢?我们还要继续再往前走一步,看看数学规划问题能为我们解决些什么业务问题。带着这些疑惑请耐心往下看,文章较长。
Act
2021/07/27
10K2
调用OR-Tools求解器求解网络流问题
大家好,小编最近新学了一个求解器OR-Tools,今天给大家介绍一下如何用OR-Tools求解器求解网络流问题中的最大流问题和 最小费用流问题。
用户1621951
2021/09/02
3.2K0
调用OR-Tools求解器求解装箱问题
今天小编将继续前几篇关于OR-Tools求解器的内容,为大家介绍如何调用该求解器求解装箱问题。
用户1621951
2021/09/02
2.2K1
渣土车空车未盖盖识别系统
渣土车空车未盖盖识别系统通过OpenCv+yolo网络实时监控路过的渣土车情况,渣土车空车未盖盖识别系统对没有盖盖或者空车的渣土车进行抓拍。渣土车空车未盖盖识别系统利用城市道路两旁的监控摄像头对交通来往车辆进行识别抓拍,若是空车或者没有盖盖,即会抓拍同步将截图发给后台监控系统平台,提醒后台人员及时处理,避免更大的损失发生。YOLO算法- YOLO算法是一种基于回归的算法,它不是选择图像中有趣的部分,而是预测整个图像中的类和包围框运行一次算法。要理解YOLO算法,我们首先需要了解实际预测的是什么。最终,我们的目标是预测一类对象和指定对象位置的边界框。
燧机科技
2022/12/29
4790
渣土车空车未盖盖识别系统
如何添加前缀和后缀?
例如:如果是数字100,我们需要变成为"自定义100自定义",那我们需要怎么样处理呢?
逍遥之
2020/03/23
1.8K0
自动驾驶的“大脑”——决策规划篇
自动驾驶的“大脑”——决策规划篇 中国人工智能系列白皮书-智能驾驶2017 ▌决策规划技术概述 ---- 智能汽车 ( Intelligent Vehicles) 是智能交通系统(Intelligent Transportation Systems) 的重要组成部分。智能汽车根据传感器输入的各种参数等生成期望的路径,并将相应的控制量提供给后续的控制器。所以决策规划是一项重要的研究内容,决定了车辆在行驶过程中车辆能否顺畅、准确得完成各种驾驶行为。 决策规划是自动驾驶的关键部分之一,它首先融合多传感信
WZEARW
2018/04/10
3.1K0
自动驾驶的“大脑”——决策规划篇
无人驾驶 | MIT无人驾驶运动路线控制
对于无人驾驶汽车来说,除了感知周边的环境、定位这两大方面之外,很重要的一点就是运动的控制。 对于无人驾驶汽车循着特定的轨迹稳定的运动并非易事,下面就根据MIT研究的无人驾驶汽车运动控制的视频来看看这
新智元
2018/03/14
1.3K0
无人驾驶 | MIT无人驾驶运动路线控制
Jsprit和自研车辆路径规划求解器的介绍
前言 哈啰,又见面啦 大家在编写启发式算法程序解决NP难问题时 有没有觉得会很耗时间呀 今天小编给大家介绍 两个可以解决各类VRP问题的工具(即VRP求解器) 一起来看看吧 1 求解器介绍 1.1 Jsprit 1.1.1 Jsprit简介 Jsprit 是一个基于 java 的开源工具包,用于解决旅行商问题 (Traveling Salesman Problem,简称TSP) 和多种车辆路径问题(Vehicle Routing Problem, 简称VRP)。Jsprit是轻量级、灵活且易于使用的V
用户1621951
2022/08/25
2.5K0
Jsprit和自研车辆路径规划求解器的介绍
ICLR 2019论文解读:深度学习应用于复杂系统控制
20 世纪,控制论、系统论、信息论,对工业产生了颠覆性的影响。继 2011 年深度学习在物体检测上超越传统方法以来,深度学习在识别传感(包含语音识别、物体识别),自然语言处理领域里产生了颠覆性的影响。最近在信息论里,深度学习也产生了重要影响。使用深度学习可以对不同形式编码的信息进行自动解码。如今,深度学习再次影响控制论,传统控制论往往是模型驱动算法,需要设计复杂的模型和控制方案,而以数据驱动为核心的深度学习用作控制领域的春天即将到来,这将推动数十万亿的工业、服务业的进一步升级。通过深度学习控制,可以让机器人,能源,交通等行业效率显著提升。例如,使用深度学习进行智能楼宇控制,可以节约大楼 20% 的能耗,传统的控制需要多名专家 2 年的时间建立一个楼宇模型,深度学习可以利用楼宇历史数据在一天内得到超越传统方法的模型;在机器人控制和强化学习领域里,相比传统控制方法,本文提出的方法可以节约 80% 以上的运算时间并且提升 10% 以上的控制准确度。
机器之心
2019/04/30
1.6K0
ICLR 2019论文解读:深度学习应用于复杂系统控制
Jsprit与自研求解器关于VRPTW问题求解的比较
前言 哈啰 又见面啦 上次我们介绍了Jsprit与自研求解器的 简介与使用方法 (Jsprit和自研车辆路径规划求解器的介绍) 这次我们让它们来切磋切磋吧 1 求解准备 • 运行环境:IntelliJ IDEA + Windows10 • 运行问题:VRPTW • 使用语言:JAVA、JSON • 辅助工具:Jsprit、VRP_Solver • 公开数据集:solomon-1987-C1、C2、R1、R2(100 nodes) 2 解的比较 上次推文我们已经介绍了这两个求解器的使用方法啦,这次我
用户1621951
2022/09/07
9100
Jsprit与自研求解器关于VRPTW问题求解的比较
遇事不慌,控制变量法帮助你
学习过TCGA数据挖掘课程的朋友们都应该是知道,可以使用GDC工具来进行TCGA数据下载,首先需要下载一个编译后的二进制可执行的GDC工具软件文件,简单的bing搜索就可以找到官方链接,如下:
生信技能树
2020/06/28
5380
遇事不慌,控制变量法帮助你
Edge 浏览器,自带的 数学求解器
现在Edge浏览器,默认集成了一个数学求解器可以实现代数、三角函数、统计、算术、微积分,二次方程式等等。数学题目的求解和解题介绍。
zinyan.com
2023/07/13
1K0
Edge 浏览器,自带的 数学求解器
PageAdmin如何添加和管理站点
PageAdmin Cms支持多站点,可以在站点管理对每个站点进行管理,站点绑定域名,访问目录,站点模板等操作都在此界面进行操作,
用户5258701
2019/04/26
1.1K0
虹科分享 | 顶级企业如何实现备份和恢复
企业和组织有很多需要保护的重要数据。如果他们丢失了数据,他们的日常操作将停止。您可以尝试以各种方式保护您的系统,但是没有办法使您的系统变得万无一失。
虹科网络可视化与安全
2023/02/09
3150
虹科分享 | 顶级企业如何实现备份和恢复
如何添加smtp服务器_smtp服务器设置
在现在这个时代中,人们传输信息基本上都是用邮件传输,那么你知道电脑之间是怎么用邮件传输的么。
全栈程序员站长
2022/09/27
4.5K0
如何添加smtp服务器_smtp服务器设置
公开课精华 | 机器人的带约束轨迹规划
本文章总结于大疆前技术总监,目前在卡内基梅隆大学读博的杨硕博士在深蓝学院的关于机器人的带约束轨迹规划的公开课演讲内容。
深蓝学院
2020/12/10
1.4K0
Fetch添加超时和拦截器功能
Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应。它还提供了一个全局 fetch()方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。这种功能以前是使用 XMLHttpRequest实现的。Fetch提供了一个更好的替代方法,可以很容易地被其他技术使用,例如 Service Workers。Fetch还提供了单个逻辑位置来定义其他HTTP相关概念,例如CORS和HTTP的扩展
治电小白菜
2020/08/25
2.7K0

相似问题

盖科最优控制如何创建多个终止目标/条件?

12

盖科最优控制空气密度方程出错

11

盖科最优控制如何使值超过一定的阈值?

12

带有控制变量的GEKKO最优控制

21

盖科最优控制我不能把一个值保留在它的范围内

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档