import json from openpyxl import Workbook from openpyxl.styles import Font, Alignment, Border, Side, PatternFill def json_to_excel(json_file_path, output_excel_path=None): with open(json_file_path, 'r', encoding='utf-8') as f: data = json.load(f) if output_excel_path is None: output_excel_path = json_file_path.rsplit('.', 1)[0] + '.xlsx' wb = Workbook() thin_border = Border( left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin') ) data_field = data.get('Data', {}) if isinstance(data_field, str): data_field = json.loads(data_field) tables_info = data_field.get('prism_tablesInfo', []) for idx, table in enumerate(tables_info): if idx == 0: ws = wb.active ws.title = f"Table_{table.get('tableId', idx)}" else: ws = wb.create_sheet(title=f"Table_{table.get('tableId', idx)}") x_cell_size = table.get('xCellSize', 0) y_cell_size = table.get('yCellSize', 0) cell_infos = table.get('cellInfos', []) grid = {} for cell in cell_infos: xsc = cell.get('xsc', 0) ysc = cell.get('ysc', 0) xec = cell.get('xec', xsc) yec = cell.get('yec', ysc) word = str(cell.get('word', '')) key = (ysc, xsc) grid[key] = { 'word': word, 'xsc': xsc, 'xec': xec, 'ysc': ysc, 'yec': yec, } for cell_info in cell_infos: xsc = cell_info.get('xsc', 0) ysc = cell_info.get('ysc', 0) xec = cell_info.get('xec', xsc) yec = cell_info.get('yec', ysc) word = str(cell_info.get('word', '')) row_start = ysc + 1 col_start = xsc + 1 row_end = yec + 1 col_end = xec + 1 ws.cell(row=row_start, column=col_start, value=word) if xec > xsc or yec > ysc: ws.merge_cells( start_row=row_start, start_column=col_start, end_row=row_end, end_column=col_end, ) for r in range(row_start, row_end + 1): for c in range(col_start, col_end + 1): cell_obj = ws.cell(row=r, column=c) cell_obj.border = thin_border cell_obj.alignment = Alignment( horizontal='center', vertical='center', wrap_text=True, ) cell_obj.font = Font(name='Arial', size=10) from openpyxl.utils import get_column_letter for c in range(1, x_cell_size + 1): ws.column_dimensions[get_column_letter(c)].width = 15 wb.save(output_excel_path) return output_excel_path if __name__ == '__main__': json_path = 'sample.json' out_path = '111.xlsx' result = json_to_excel(json_path, out_path) print(f"Excel saved to: {result}")