excel填数据转json格式

news2024/11/23 2:14:45

定制化比较严重,按需更改

excel文件如下

 代码

# -*- coding: utf-8 -*-
import oss2
import shutil
import sys
import xlwt
import xlrd
import json
from datetime import datetime, timedelta
 
file1 = "C:\\Users\\cxy\\Desktop\\generate.xls"
#打开表1
wb1 = xlrd.open_workbook(filename=file1)

# 表1的sheet
sheet = wb1.sheet_by_index(1)
# 表1的sheet的总行数
rowNum = sheet.nrows
# 表1的sheet的总列数
colNum = sheet.ncols

json_data = {}

def getCellValue(row,col): 
    # if row == 8:
    #     print(1)
    value = sheet.cell_value(row,col)
    if str(value).endswith(".0"):
        return str(value).split(".0")[0]
    # if type(value) == float:
    #     value = '%.2f' % sheet.cell_value(8,8)
    return value
def getRowValue(row):
    return sheet.row_values(row)
def getColValue(col,start_rowx=0, end_rowx=None):
    return sheet.col_values(col, start_rowx, end_rowx)
def isKeyRow(row):
    return any(s == '$$key$$' for s in sheet.row_values(row))
import re


def name_convert_to_camel(name: str) -> str:
    """下划线转驼峰(小驼峰)"""
    return re.sub(r'(_[a-z])', lambda x: x.group(1)[1].upper(), name)

def arr_str_to_arr(value: str) -> str:
    """数组字符串变成数组类型"""
    value = str(value)
    if re.match('^\[', value) and re.search('\]$', value):
        arr = value.strip("[]").split(",")
        temp = []
        for v in arr:
            temp.append({"name":add_oss_host(v)})
        return temp
    return add_oss_host(value)

def add_oss_host(value: str) -> str:
    content = str(value)
    if content.endswith(".png") or content.endswith(".jpeg") or content.endswith(".mp4") or content.endswith(".jpg"):
        return "/s" + content
    else:
        return content

def resolveData(cur_level,start_row,end_row,data):
    col_values = sheet.col_values(cur_level, start_row, end_row)
    cur_level_key_row = [i+start_row for i in range(0,len(col_values)) if col_values[i] == '$$key$$']
    # cur_level_key_row.append(rowNum)
    for index, row_index in enumerate(cur_level_key_row):
        key_row = getRowValue(row_index)
        key = key_row[cur_level+1]
        if str(key).endswith(".0"):
            key = str(key).split(".0")[0]
        type = key_row[cur_level+2]

        if isKeyRow(row_index+1):
            # 第一行就遇到key
            if type == 'array':
                print("第"+(row_index+1)+"行格式不对")
                break
            else:
                temp = {}
                data[key] = temp
                if row_index+1<rowNum and isKeyRow(row_index+1):
                    resolveData(
                        cur_level + 1, 
                        row_index + 1, 
                        rowNum if (index + 1) >= len(cur_level_key_row) else cur_level_key_row[index + 1], 
                        temp)
                continue

        column_row = getRowValue(row_index+1)
        column_name_arr = []
        for col_index in range(cur_level,colNum):
            column_name = column_row[col_index]
            if column_name == '':
                break
            column_name_arr.append(name_convert_to_camel(column_name))
        if type == 'object':
            temp = {}
            data[key] = temp
            for i in range(0,len(column_name_arr)):
                temp[column_name_arr[i]] = arr_str_to_arr(getCellValue(row_index+2, i + cur_level) )
            
            if row_index+3<rowNum and isKeyRow(row_index+3):
                resolveData(
                    cur_level + 1, 
                    row_index + 3, 
                    rowNum if (index + 1) >= len(cur_level_key_row) else cur_level_key_row[index + 1], 
                    temp)
        else:
            # [0, 18, 28]
            tempArr = []
            data[key] = tempArr
            arr_data_start = cur_level_key_row[index]+2
            arr_data_end = rowNum # 默认,下面会改
            next_key_index_temp = rowNum
            if (index + 1) < len(cur_level_key_row):
                next_key_index_temp = cur_level_key_row[index + 1]
            if cur_level == 0:
                arr_data_end = next_key_index_temp
            else:
                for i_temp in range(arr_data_start, next_key_index_temp):
                    if i_temp == rowNum-1:
                        break
                    if (getCellValue(i_temp, cur_level-1) == '' and getCellValue(i_temp+1, cur_level-1) != '') or (isKeyRow(i_temp+1) and getCellValue(i_temp+1, cur_level) == '$$key$$'):
                        arr_data_end = i_temp+1
                        break

            for chi_row_index in range(arr_data_start, arr_data_end):
                colValue = getCellValue(chi_row_index, cur_level)
                if colValue == '':
                    continue
                temp = {}
                tempArr.append(temp)
                for i in range(0,len(column_name_arr)):
                    temp[column_name_arr[i]] = arr_str_to_arr(getCellValue(chi_row_index, i + cur_level) )
                if chi_row_index + 1 < rowNum and isKeyRow(chi_row_index + 1):
                    parentColValues = getColValue(cur_level, chi_row_index + 1, rowNum)
                    not_empty_index = next((j for j, v in enumerate(parentColValues) if v), len(parentColValues))
                    resolveData(
                        cur_level + 1, 
                        chi_row_index + 1, 
                        chi_row_index + not_empty_index + 1, 
                        temp)

cur_level = 0
start_row = 0
end_row = rowNum
json_data = {}

resolveData(cur_level,start_row,end_row,json_data)
          
print(json.dumps(json_data, ensure_ascii=False))

target = "C:\\Users\\cxy\\Desktop\\generate_target.json"
with open(target, "w", encoding='utf-8') as f:
    json.dump(json_data, f, indent=4, ensure_ascii=False)

结果

{
    "userInfos": {
        "userPic": "https://oss.shop.sxmu.com/test/dzpt/头像20.jpeg",
        "nickName": "墨雨无痕",
        "level": "42",
        "userId": "66606024",
        "gaming_career": [
            {
                "gamePic": "https://oss.shop.sxmu.com/test/dzpt/mszb.jpeg",
                "gameName": "魔兽争霸3",
                "level": "42",
                "score": "96800",
                "gaming_career": [
                    {
                        "modePic": "https://oss.shop.sxmu.com/test/dzpt/ch.png",
                        "modeName": "澄海3C",
                        "score": "56800",
                        "gameTimes": "1000"
                    },
                    {
                        "modePic": "https://oss.shop.sxmu.com/test/dzpt/DOTA6.83.png",
                        "modeName": "DOTA 6.83",
                        "score": "40000",
                        "gameTimes": "650"
                    }
                ]
            },
            {
                "gamePic": "https://oss.shop.sxmu.com/test/dzpt/cs.jpg",
                "gameName": "CS",
                "level": "38",
                "score": "76500"
            }
        ]
    },
    "player_list": {
        "star_list": [
            {
                "userPic": "https://oss.shop.sxmu.com/test/dzpt/头像11.jpeg",
                "nickName": "阿海",
                "userDesc": "喜欢跳不上的b小,架不住的a1,最爱的沙鹰,放不开也抓不住。",
                "online": "0"
            },
            {
                "userPic": "https://oss.shop.sxmu.com/test/dzpt/头像12.jpeg",
                "nickName": "醉念",
                "userDesc": "只不过游戏而已,玩的再牛逼又如何",
                "online": "0"
            }
        ],
        "fans_list": [
            {
                "userPic": "https://oss.shop.sxmu.com/test/dzpt/头像16.jpeg",
                "nickName": "亡梦",
                "userDesc": "遗憾与残局皆,与神明画过押。",
                "online": "0"
            }
        ]
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring专题】手写简易Spring容器过程分析——引导篇

目录 前言说在前面阅读准备 思路整理手写源码示例一、手写前的准备1.1 注解1.2 测试Bean1.3 调用实例 二、构造方法&#xff08;构建基本流程&#xff09;三、实现scan()方法3.1 doGetScanPackage()&#xff1a;获取扫描路径3.2 doLoadClassFromDiskAndScan()&#xff1a;从电脑…

【100天精通python】Day34:使用python操作数据库_ORM(SQLAlchemy)使用

目录 专栏导读 1 ORM 概述 2 SQLAlchemy 概述 3 ORM&#xff1a;SQLAlchemy使用 3.1 安装SQLAlchemy&#xff1a; 3.2 定义数据库模型类&#xff1a; 3.3 创建数据表&#xff1a; 3.4 插入数据&#xff1a; 3.5 查询数据&#xff1a; 3.6 更新数据&#xff1a; 3.7 删…

24届最新计算机毕业设计选题推荐 -计算机专业毕业设计题目参考大全

大家好&#xff0c;我们是竹林可以&#xff08;计算机毕ye设ji代做团队&#xff09;&#xff0c;大四的同学马上要开始毕业设计开题啦&#xff0c;大家要好好准备哦。 学长学姐们给大家详细整理了计算机毕设最新选题&#xff0c;我们专注毕ye设ji多年&#xff0c;积累了丰富的…

【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍登场角色应用场景 案例实现案例一类图实现 案例二&#xff1a;借贷平台源码剖析传统方式实现分析状态修改流程类图实现 案例三&#xff1a;金库警报系统系统的运行逻辑伪代码传统实现方式使用状态模式 类图实现分析问题问题一问题二 总结文章说明…

element-ui的el-dialog,简单的封装。

el-dialog是使用率很高的组件 使用el-dialog很多都是按照文档的例子&#xff0c;用一个变量控制是否显示&#xff0c;再来一个变量控制标题。 如果我这个对话框多个地方使用的话还要创建多个变量&#xff0c;甚至关闭之后还要清空一些变量&#xff0c;应该可以简化一点。我写…

数据结构:力扣OJ题(每日一练)

目录 题一&#xff1a;环形链表 思路一&#xff1a; 题二&#xff1a;复制带随机指针的链表 思路一&#xff1a; 本人实力有限可能对一些地方解释的不够清晰&#xff0c;可以自己尝试读代码&#xff0c;望海涵&#xff01; 题一&#xff1a;环形链表 给定一个链表的头节点…

奥威BI数据可视化工具:报表就是平台,随时自助分析

别的数据可视化工具&#xff0c;报表就只是报表&#xff0c;而奥威BI数据可视化工具&#xff0c;一张报表就约等于一个平台&#xff0c;可随时展开多维动态自助分析&#xff0c;按需分析&#xff0c;立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…

Camtasia2023最新专业的电脑屏幕录制和视频剪辑软件

Camtasia专业的屏幕录制和视频剪辑软件3000多万专业人士在全球范围内使用Camtasia展示产品&#xff0c;教授课程&#xff0c;培训他人&#xff0c;以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和&#xff01;Camtasia是一款功能强大的屏幕录制和视频编辑软件…

办理流量卡也是有条件的,这五种情况就不能办理流量卡!

流量卡资费虽然便宜&#xff0c;但也不是谁都可以办得&#xff0c;以下这几种情况是办不了的&#xff01; 看到网上的流量卡资费便宜&#xff0c;也想随手申请一张&#xff0c;别想得太简单了&#xff0c;流量卡也不是那么好办理的&#xff0c;换句话来讲&#xff0c;办理流量…

【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云原生是什么呢?

云原生时代下的Java"拯救者" 在云原生时代&#xff0c;其实Java程序是有很大的劣势的&#xff0c;以最流行的spring boot/spring cloud微服务框架为例&#xff0c;启动一个已经优化好&#xff0c;很多bean需要lazy load的application至少需要3-4秒时间&#xff0c;内…

Chrome小技巧---多用户登录同一网站不串信息

测试中经常需要用到浏览器需要登录多个账号 但是有一个问题就是会串号 通过添加不同的用户再用这用户登录&#xff0c;就不串号了&#xff1a; 还可以在浏览器的偏好设置中添加启动地址 这样每次打开&#xff0c;就进到设置的地址中了

如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库

数据库操作一直是一个比较敏感的话题&#xff0c;动不动“删库跑路”&#xff0c;可见数据库操作对于一个项目而言是非常重要的&#xff0c;我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库&#xff0c;而你们刚好使用的是阿里云的Mongodb&#xff0c;那么这篇文章…

用ThreadLocal做链路追踪(演变升级版)

前言 1、ThreadLocal是线程变量&#xff0c;线程之间彼此隔离&#xff0c;天生线程安全。因为它是跟着线程走的&#xff0c;考虑到这点&#xff0c;它很适合做链路追踪&#xff08;TraceId&#xff09; 2、当我们写的接口接收到其它地方&#xff08;可能是前端、也可能是其它服…

python如何开发一个电商进销存管理系统?

让我们来看一下题主的需求&#xff1a; 管理公司的淘宝天猫平台&#xff0c;后端仓库&#xff0c;采购进行数据同步。其中最主要的还是要对接淘宝API &#xff0c;实现实时订单的通知&#xff0c;同步淘宝订单&#xff0c;管理买家信息&#xff0c;发货&#xff0c;财务统计等…

亚马逊举报差评有什么作用?有没有可以举报差评的软件?

在亚马逊上举报差评具有以下作用&#xff1a; 1、维护信誉和公平性&#xff1a; 举报差评有助于维护亚马逊市场的信誉和公平性。虚假或不当的差评可能会误导其他消费者&#xff0c;影响他们做出购买决策。通过举报这些问题&#xff0c;可以确保评价体现真实的用户体验&#xf…

【SpringCloud技术专题】「Resilience4j入门指南」(1)轻量级熔断框架的入门指南

基础介绍 Resilience4j是一款轻量级&#xff0c;易于使用的容错库&#xff0c;其灵感来自于Netflix Hystrix&#xff0c;但是专为Java 8和函数式编程而设计。轻量级&#xff0c;因为库只使用了Vavr&#xff0c;它没有任何其他外部依赖下。相比之下&#xff0c;Netflix Hystrix…

Beats:使用 Filebeat 将 golang 应用程序记录到 Elasticsearch - 8.x

毫无疑问&#xff0c;日志记录是任何应用程序最重要的方面之一。 当事情出错时&#xff08;而且确实会出错&#xff09;&#xff0c;我们需要知道发生了什么。 为了实现这一目标&#xff0c;我们可以设置 Filebeat 从我们的 golang 应用程序收集日志&#xff0c;然后将它们发送…

大数据培训前景怎么样?企业需求量大吗

大数据行业对大家来说并不陌生&#xff0c;大数据行业市场人才需求量大&#xff0c;越早入行越有优势&#xff0c;发展机会和上升空间等大。不少人通过大数据培训来提升自己的经验和自身技术能力&#xff0c;以此来获得更好的就业机会。 2023大数据培训就业前景怎么样呢?企业需…

落地大模型应知必会(3): 如何构建多任务的LLM应用

编者按&#xff1a;今年以来&#xff0c;大语言模型(LLM)已被广泛应用于各种自然语言处理任务&#xff0c;也越来越多地被用于构建复杂的语言应用。但是构建多任务的 LLM 应用仍面临一定的挑战&#xff0c;需要解决任务组合和调控等问题。 本文内容介绍了构建多任务 LLM 应用可…

win10中Docker安装、构建镜像、创建容器、Vscode连接实例

Docker方便一键构建项目所需的运行环境&#xff1a;首先构建镜像(Image)。然后镜像实例化成为容器(Container)&#xff0c;构成项目的运行环境。最后Vscode连接容器&#xff0c;方便我们在本地进行开发。下面以一个简单的例子介绍在win10中实现&#xff1a;Docker安装、构建镜像…