【Python】将.xlsx文件内容读取为json格式 (Execl转换为Json)


 

将execl 表格数据转换为json


方法一:按列读取数据(仅支持单条case)

# coding:utf-8
import ast
import json

import xlrd
import xlwt

from base.logger import *

class execl_tools:

    # 获取xlsx内容
    def get_xlsx_data(self):
        xlsx_pathname = r"../data/test_110.xlsx"
        # 打开xlsx文件
        workbook = xlrd.open_workbook(xlsx_pathname)
        # 根据sheetname获取内容
        sheet = workbook.sheet_by_name("110")
        # 获取总行/列数
        rownum = sheet.nrows
        colnum = sheet.ncols
        logs.debug(f"{sheet.name} sheet总行数:{rownum}")
        logs.debug(f"{sheet.name} sheet总行数:{colnum}")

        # 定义一个list
        content = {}
        # 按列获取数据
        for i in range(colnum):
            col_value = sheet.col_values(i)
            # 列名包含[]时 将value值进行处理
            if '[]' in col_value[0]:
                logs.debug(f"array需要转换为object:{col_value}")
                col_value[0] = str(col_value[0]).replace("[]", "")
                col_value[1] = ast.literal_eval(col_value[1])
            else:
                logs.debug(col_value)
            content.update({col_value[0]: col_value[1]})

        logs.debug(json.dumps(content, ensure_ascii=False))




if __name__ == "__main__":
    execl_tools().get_xlsx_data()

执行结果:

方法二:按行读取数据(支持多条case)

 # 获取xlsx内容
    def get_xlsx_row_data(self):
        xlsx_pathname = r"../data/test_110.xlsx"
        # 打开xlsx文件
        workbook = xlrd.open_workbook(xlsx_pathname)
        # 根据sheetname获取内容
        sheet = workbook.sheet_by_name("110")
        # 获取总行/列数
        rownum = sheet.nrows
        colnum = sheet.ncols
        logs.debug(f"{sheet.name} sheet总行数:{rownum}")
        logs.debug(f"{sheet.name} sheet总行数:{colnum}")

        # 定义一个list
        content = {}
        # 按行读取数据
        for i in range(rownum):
            if i != 0:
                row_key = sheet.row_values(0)
                row_value = sheet.row_values(i)
                # logs.debug(row_key)
                # logs.debug(row_value)
                length = len(row_key)
                for j in range(length):
                    if "[]" in row_key[j]:
                        content.update({str(row_key[j]).replace("[]", ""): ast.literal_eval(row_value[j])})
                    else:
                        content.update({row_key[j]: row_value[j]})

            logs.debug(content)

执行结果:

execl数据:

或者

 # 获取xlsx内容
    def get_xlsx_row_datas(self):
        xlsx_pathname = "../data/test_110.xlsx"
        workbook = xlrd.open_workbook(xlsx_pathname)
        sheet = workbook.sheet_by_name("110110")
        rownum = sheet.nrows
        colnum = sheet.ncols
        content = {}
        # 按行获取数据
        for i in range(rownum):
            if i != 0:
                key = sheet.row_values(0)
                value = sheet.row_values(i)
                length = len(key)

                for j in range(length):
                    if "[" in value[j]:
                        content[key[j]] = ast.literal_eval(value[j])
                    else:
                        content[key[j]] = value[j]
            logs.debug(content)
方法二

execl数据

区分数据


 # 获取xlsx内容
    def get_xlsx_row_datas(self, cmd, casenum=1):
        xlsx_pathname = "../data/test_110.xlsx"

        workbook = xlrd.open_workbook(xlsx_pathname)
        sheet = workbook.sheet_by_name(cmd)
        rownum = sheet.nrows
        # 判断用例执行条数
        if casenum >= rownum:
            rownum = rownum
        else:
            rownum  = casenum+1

        content_list = []
        # 按行获取数据
        for i in range(rownum):
            if i != 0:
                key = sheet.row_values(0)
                value = sheet.row_values(i)
                length = len(key)
                content = {}
                case = {}
                # 获取execl数据转换为dict
                for j in range(length):
                    if "[" in value[j]:
                        content[key[j]] = ast.literal_eval(value[j])
                    elif "case" in key[j]:
                        case[key[j]] = value[j]
                    else:
                        content[key[j]] = value[j]
                content_list.append(content)
                content_list.append(case)
        logs.debug(content_list)

        return content

执行结果:

execl数据: