一、需求
将excel表格中的行转换为字典格式,为下一步处理数据做准备。自己python代码能力不强,把需求告诉通义千问大模型,提示词如下:
第一次提示词:
你是Python专家,擅长编写python程序,尤其在自动化办公excel处理方面经验丰富。我有一个需求,需要将excel工作表的列抬头字段与行列内容转换成字典格式,请给出程序代码。
以上提示词生成的python代码对于第一行、第二行都作为title,并且有些一二行做了合并的情况考虑不全,所以再次给大模型发需求:
在实际表格中,第一行和第二行都是列头,有的进行了合并,有的没有进行合并,这种情况在程序中如何实现?
大模型再次输出,中间过程有报错,将报错直接贴给大模型就行。
经过几遍调试后,大模型的输出达到了要求,满足了需求。
二、大模型输出
import pandas as pd
from openpyxl import load_workbook
import json
from datetime import datetimedef Read_excel_file(file_path):import pandas as pdfrom openpyxl import load_workbookimport jsonfrom datetime import datetime# 读取Excel文件sheet_name = 0 # 第一个工作表,也可以指定工作表名称如 'Sheet1'# 使用openpyxl加载工作簿(非只读模式)wb = load_workbook(file_path)ws = wb.active if sheet_name == 0 else wb[sheet_name]# 获取合并单元格的范围merged_cells = ws.merged_cells.ranges# 使用pandas读取Excel文件df = pd.read_excel(file_path, sheet_name=sheet_name, header=None)# 获取前两行作为列头header1 = df.iloc[0].tolist()header2 = df.iloc[1].tolist()# 处理合并单元格def get_merged_header(merged_cells, col_idx):for cell_range in merged_cells:min_col, max_col, min_row, max_row = cell_range.boundsif min_col <= col_idx + 1 <= max_col and min_row <= 1 <= max_row:return df.at[0, min_col - 1] # 返回合并单元格的第一个单元格的内容return None# 合并两行的列头,并处理nanfull_header = []for i in range(len(header1)):merged_header = get_merged_header(merged_cells, i)# 处理nanif pd.isna(header2[i]):full_header.append(merged_header if merged_header is not None else header1[i])else:if merged_header is not None:full_header.append(f"{merged_header} {header2[i]}")else:full_header.append(header2[i])# 更新DataFrame的列名df.columns = full_header# 删除前两行(列头)df = df.drop([0, 1]).reset_index(drop=True)# 将DataFrame中的datetime对象转换为字符串def convert_to_str(value):if pd.isnull(value):return "无"if isinstance(value, (pd.Timestamp, datetime)):return value.strftime('%Y/%m/%d') # 你可以根据需要调整日期格式return value# 应用转换函数到DataFrame的所有元素df = df.applymap(convert_to_str)# 将空字符串替换为“无”df = df.replace('', '无')# 将DataFrame转换为字典列表rows_as_dicts = df.to_dict(orient='records')return rows_as_dicts# 打印结果for row in rows_as_dicts:print(row)# 自定义JSON序列化函数def custom_serializer(obj):if isinstance(obj, (pd.Timestamp, datetime)):return obj.strftime('%Y/%m/%d')raise TypeError(f"Object of type {type(obj)} is not JSON serializable")# 如果需要保存到文件,可以使用以下代码output_file = 'output{}.json'.format(unit)with open(output_file, 'w', encoding='utf-8') as f:json.dump(rows_as_dicts, f, ensure_ascii=False, indent=4, default=custom_serializer)print(f"数据已保存到: {output_file}")if __name__ == '__main__':file_path_all = r'C:\Users\CEC-User\Desktop\202409\汇总不算数据库.xlsx'rows_as_dicts_all = Read_excel_file(file_path_all)for row in rows_as_dicts_all:print(row)