import json import os import sys from natsort import natsorted from openpyxl import Workbook from openpyxl.styles import Alignment from openpyxl.styles import Border, Side, PatternFill from openpyxl.styles import Font from openpyxl.utils import get_column_letter from Util.PgUtil import * # pip install natsort # pip install openpyxl # comfyUi的提示词所在位置 comfyUiPrompts = [ { "file": "16.json", # 文件名称 "prompt": ['333', 'inputs', 'text'] # 正向提示词位置 } , { "file": "17.json", # 文件名称 "prompt": ['447', 'inputs', 'text'] # 正向提示词位置 } , { "file": "19.json", # 文件名称 "prompt": ['113', 'inputs', 'text'] # 正向提示词位置 } , { "file": "20.json", # 文件名称 "prompt": ['113', 'inputs', 'text'] # 正向提示词位置 } , { "file": "22.json", # 文件名称 "prompt": ['131', 'inputs', 'String'] # 正向提示词位置 } , { "file": "23.json", # 文件名称 "prompt": ['63', 'inputs', 'tags'] # 正向提示词位置 }, { "file": "24.json", # 文件名称 "prompt": ['21', 'inputs', 'tags'] # 正向提示词位置 } , { "file": "25.json", # 文件名称 "prompt": ['186', 'inputs', 'text'] # 正向提示词位置 } , { "file": "26.json", # 文件名称 "prompt": ['79', 'inputs', 'text_positive'] # 正向提示词位置 } , { "file": "27.json", # 文件名称 "prompt": ['89', 'inputs', 'text'] # 正向提示词位置 } ] def merge_cell(col_num): # 获取指定列数据 col_list = [cell[0].value for cell in ws.iter_rows(min_row=2, min_col=col_num, max_col=col_num)] # 合并单元格的逻辑 merge_ranges = [] start_index = 0 current_value = col_list[0] for i in range(1, len(col_list)): if col_list[i] != current_value: end_index = i - 1 if end_index >= start_index: merge_ranges.append((start_index, end_index)) current_value = col_list[i] start_index = i # 合并单元格和设置对齐 col_letter = get_column_letter(col_num) for start, end in merge_ranges: merge_range = f"{col_letter}{start + 2}:{col_letter}{end + 2}" ws.merge_cells(merge_range) for row in ws[merge_range]: for cell in row: cell.alignment = Alignment(horizontal="center", vertical="center") def setCell(cellIdx, text, font): ws[cellIdx] = text ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center') if __name__ == '__main__': # 指定目录路径 directory = '../JSON/' # 获取目录下的所有文件和目录的完整路径 entries = [entry for entry in os.listdir(directory)] # 使用natsort进行自然排序 sorted_entries = natsorted(entries) # 设置字体加粗和颜色 headFont = Font(bold=True) headFont.size = 15 font = Font() font.size = 13 # 创建一个新的工作簿 wb = Workbook() # 选择默认工作表 ws = wb.active # 给工作表命名 ws.title = "绘鸭AI模板情况报表" # 向工作表中添加数据 setCell('A1', '模板编号', headFont) setCell('B1', '模板名称', headFont) setCell('C1', '模板类型', headFont) setCell('D1', '提示词模板', headFont) setCell('E1', '提示词样例', headFont) # 获取列的维度对象 col_dimension = ws.column_dimensions # 设置列宽,参数为列标识(如'A')和宽度 col_dimension['A'].width = 12 # 设置A列的宽度为12 col_dimension['B'].width = 30 # 设置B列的宽度为30 col_dimension['C'].width = 20 # 设置C列的宽度为30 col_dimension['D'].width = 60 # 设置C列的宽度为30 col_dimension['E'].width = 60 # 设置D列的宽度为80 # 创建边框样式 border = Border(left=Side(border_style='thin', color="000000"), right=Side(border_style='thin', color="000000"), top=Side(border_style='thin', color="000000"), bottom=Side(border_style='thin', color="000000")) # 填充颜色 fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") # 遍历entries,打印出所有文件和目录 rowIdx = 0 for entry in sorted_entries: if '.json' in entry: # 读取文件内容到JSON对象中 json_file_path = directory + entry # 用于存储JSON文件内容的变量 modelData = None # 打开并读取JSON文件 with open(json_file_path, 'r', encoding='utf-8') as file: # 加载JSON文件内容到data变量中,json.load()自动将JSON字符串转换为Python字典 modelData = json.load(file) # 模板编号 model_id = entry.lower().replace('.json', '').replace("../json/", '') # 模板名称 sql = "select model_name from t_hy_model where model_id=%s" % model_id res = execute_query(sql) model_name = res[0][0] # 区别对待 if 'prompts' in modelData: for x in modelData['prompts']: rowIdx = rowIdx + 1 # 1、WEBUI模板 # 写入模板编号 cellIdx = 'A' + str(rowIdx + 1) ws[cellIdx] = model_id ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center') # 模板名称 cellIdx = 'B' + str(rowIdx + 1) ws[cellIdx] = model_name ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center') # 模板类型 cellIdx = 'C' + str(rowIdx + 1) ws[cellIdx] = 'WebUI' ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center') # 写入提示词 cellIdx = 'D' + str(rowIdx + 1) ws[cellIdx] = x ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) # print(json_file_path + " WEBUI模板!") else: # 2、COMFYUI模板 for x in comfyUiPrompts: if x['file'] == model_id + '.json': l1 = x['prompt'][0] l2 = x['prompt'][1] l3 = x['prompt'][2] break # 写入模板编号 rowIdx = rowIdx + 1 cellIdx = 'A' + str(rowIdx + 1) ws[cellIdx] = model_id ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center') # 模板名称 cellIdx = 'B' + str(rowIdx + 1) ws[cellIdx] = model_name ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center') # print(json_file_path + " COMFYUI模板!") # 模板类型 cellIdx = 'C' + str(rowIdx + 1) ws[cellIdx] = 'ComfyUI' ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center') # 写入提示词 try: cellIdx = 'D' + str(rowIdx + 1) ws[cellIdx] = modelData[l1][l2][l3] ws[cellIdx].font = font ws[cellIdx].alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) except Exception as err: print("Error:" + str(rowIdx)) print("model_id=" + model_id) sys.exit(0) # 设置第一行到第10行的边框和填充颜色 idx = 0 for row in ws.iter_rows(min_row=1, max_row=rowIdx + 1, max_col=ws.max_column): idx = idx + 1 for cell in row: cell.border = border # 应用边框 if idx == 1: cell.fill = fill # 应用填充颜色 # 设置所有行的行高为55 for row in range(1, ws.max_row + 1): # 假设ws.max_row是工作表的最大行数 ws.row_dimensions[row].height = 55 # 将第一列由上到下按内容一致性合并 merge_cell(1) # 将第二列由上到下按内容一致性合并 merge_cell(2) # 保存 wb.save('绘鸭AI模板.xlsx') wb.close() print("恭喜,所有操作成功完成!")