首页 > 其他分享 >json list to excel

json list to excel

时间:2024-04-11 20:14:31浏览次数:22  
标签:style name title excel list len json value key

每次从数据库导出数据交付产品的时候常需要把json拍成excel

"""
    json_to_excel.py
    ~~~~~~~

    json文件转换为excel文件(xlsx)

    注:最多容纳1048576行数据
"""

import os
import sys
import json
import openpyxl
from openpyxl.styles import NamedStyle, Font, Alignment, Border, Side
from openpyxl.styles.colors import BLACK
from openpyxl.utils import get_column_letter

font = Font(
    name='宋体',
    color=BLACK,
    outline=True,
    size=9,
)
title_font = Font(
    name='宋体',
    color=BLACK,
    outline=True,
    size=9,
    b=True
)
alignment = Alignment(
    horizontal='left',
    vertical='center',
)
border = Border(
    left=Side(border_style='thin'),
    right=Side(border_style='thin'),
    top=Side(border_style='thin'),
    bottom=Side(border_style='thin'),
)

# 表格样式
default_style = NamedStyle(name='default', font=font, alignment=alignment, border=border)
title_style = NamedStyle(name='title', font=title_font, alignment=alignment, border=border)

filter_fields = ['ossUrl', 'oss_url']

def tran_to_excel(src, dst=''):
    if not os.path.exists(src):
        print('file(%s) not fount' % src)
        return

    if not dst:
        dst = src + '.xlsx'

    sheet_name = src.split('/')[-1].split('.')[0]
    workbook = openpyxl.Workbook()

    ws = workbook.active

    title_list = []
    # 首行下标为1
    row = 1
    max_len = {}

    with open(src, 'r', encoding='utf-8') as fin:
        for line in fin:
            if row == 1048576:
                break
            # 第二行开始写
            row += 1
            # if len(line) >= 32767:  # 如果行字长超过excel单元格限制长度,结束本次循环
            #     continue
            try:
                doc = json.loads(line)
            except:
                print(line)
                continue

            # # 仅保留某些字段
            # keys = {"name", "nameId"}
            # if keys:
            # 	old_doc = doc
            # 	doc = {}
            # 	for k, v in old_doc.items():
            # 		if k in keys:
            # 			doc[k] = v

            for key, value in doc.items():
                # if key in filter_fields:
                #     continue
                if isinstance(value, (list, dict)):
                    value = json.dumps(value, ensure_ascii=False)
                elif not isinstance(value, str):
                    value = repr(value)
                if key not in title_list:
                    title_list.append(key)
                    max_len[key] = len(key)
                column = title_list.index(key) + 1
                if max_len.get(key, 0) < len(value):
                    max_len[key] = len(value)
                try:
                    default_cell = ws.cell(row, column, value)
                    default_cell.style = default_style
                except:
                    pass
            ws.row_dimensions[row].height = 17

    # 添加标题行
    for column, key in enumerate(title_list):
        title_cell = ws.cell(1, column + 1, key)
        title_cell.style = title_style
    # ws.row_dimensions[row].height = 18

    # 调整列宽
    for key, _max in max_len.items():
        column_name = get_column_letter(title_list.index(key) + 1)
        ws.column_dimensions[column_name].width = min(int(max_len[key]), 50)

    workbook.save(dst)
    return dst


if __name__ == '__main__':
    filename = sys.argv[1]
    if os.path.isdir(filename):
        for f in os.listdir(filename):
            fn = os.path.join(filename, f)
            print(fn)
            dst = tran_to_excel(fn)
            print(dst)
    else:
        tran_to_excel(filename)

标签:style,name,title,excel,list,len,json,value,key
From: https://www.cnblogs.com/thx2199/p/18129941

相关文章

  • vue插件 vue-virtual-scroll-list解决数据量太大问题
    项目中数据量有时候过于庞大,使用elementui的Select组件时,会导致下拉框加载速度慢卡顿甚至于卡死,为解决这个问题,使用vue-virtual-scroll-list插件,模拟虚拟滚动。vue-virtual-scroll-list是vue的一个虚拟滚动组件,通过不渲染可视区域以外的内容,显示虚拟的滚动条来提升页面性能首先......
  • list不能直接remove
    当一个list集合里面包含某个id,我需要把它过滤掉,于是,我直接上代码if(managerIds.contains(userId)){managerIds.remove(userId);}returnmanagerIds;然而,这种写法是大错特错了!因为,list不能直接remove,要不然就会报一个索引的错误,所以,经过指导后代码就改成了if(manager......
  • 多线程-多个子线程执行结果插入List集合
    业务场景:将多个子线程的执行结果存入List,但是总会出现List集合的长度小于子线程的执行数的情况1、错误示例(多个线程同时操作同一个List对象,List是线程不安全)packageunitTest;importorg.assertj.core.util.Lists;importjava.util.List;importjava.util.concurrent.Coun......
  • 多级动态表头导出-easyexcel
    导出如下动态表头 主要的构造tabCols和tableData,注意表头的字段,基本构造出了该格式所有的都能适配@GetMapping("/exportData")publicvoidexcelExport(TbDtTargetHealthMontbDtTargetHealthMon,HttpServletResponseresponse)throwsIOException{re......
  • RecyclerView与ListView区别
    目录1.先说结论2.继承关系3.布局操作4.动画效果5.数据刷新方式6.缓存机制6.1ListView6.2 RecyclerView缓存实例1.先说结论RecyclerView是我们优先考虑的,已经规范化的,自带动画效果的,布局更多样的控件2.继承关系ListView-》继承BaseAdapter,需要自定义ViewHold......
  • pageoffice给在线打开的excel单元格插入图片
    转载:单元格添加图片#单元格添加图片查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。Java命名空间com.zhuozhengsoft.pageoffice.excelwriter中的......
  • Java List集合去重、过滤、分组、获取数据、求最值、合并、排序、跳数据和遍历
    前言请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、准备工作:现有一个User类、Student类和Ticket类,加入相关依赖@DatapublicclassUser{/***id*/privateIntegerid;/***姓名*/privateStringname;/**......
  • django simpleui 的list_display添加自定义列、显示图片 及alert弹窗的设置方法
    参考djangosimpleui的list_display添加自定义列、显示图片及alert弹窗的设置方法-CSDN博客环境:python:3.8.xDjango:3.2.xDjango-simpleui:2021.x先定义下模型#models.pyclassDog(models.Model):name=models.CharField(max_length=15,verbose_name='小狗名字')......
  • jackson 使用jsonNode与objectNode 实现访问json对象, 操作json对象
    前情提要因为现有项目都用的阿里巴巴的fastjson做json串的序列化与反序列化,但是fastJson的漏洞太多了,经常处理扫描出来的漏洞时,需要升级版本,导致出现各种大大小小的bug,经过考究,决定使用jackSon做新项目的序列化与反序列化工作,那先看一下常用的场景:将对象转为js......
  • 认识学习JSON
    JSON:   json是一种轻量级的数据交换格式。   简单来说:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互。   json在js中提供了两种方法:  JSON.parse():将JSON数据转换为对象或数组。  JSON.stringify():将对象或......