我想使用 openpyxl 将嵌套字典写入工作表,其中键应用作标头,值也是一个内部字典,其中包含列表值以及它们所在的标头的记录.
我的代码无法实现完整的场景,但我能够将数据划分为我想要的所需阶段,但问题是空白单元格和我想要划分的列表值,如下所示:
LKP_GetData -> ('FIL_UpdateChangedRecord', 'EXP_DetectChanges') in stage3 which has list values should be broken to LKP_GetData -> ('FIL_UpdateChangedRecord') and LKP_GetData -> ('EXP_DetectChanges') in stage 3 and placed in individual cells. Same goes with other such data in other stages
我的代码:
import openpyxl
# Your nested dictionary
nested_dict = {
0: {'DIM_NRC_CUSTOMER_TMP': ['SQ_DIM_NRC_CUSTOMER_TMP'], 'SAT_CONTACT': ['SQ_HUB_CUSTOMER'], 'SAT_CUSTOMER_DERIVED': ['SQ_HUB_CUSTOMER'], 'SAT_CUSTOMER': ['SQ_HUB_CUSTOMER'], 'SAT_CUSTOMER_PREDICTED': ['SQ_HUB_CUSTOMER'], 'HUB_CUSTOMER': ['SQ_HUB_CUSTOMER']},
1: {'SQ_DIM_NRC_CUSTOMER_TMP': ['UPDTRANS'], 'SQ_HUB_CUSTOMER': ['LKP_SH_MOBILE_PH_NO', 'EXP_PREPARE_DATA', 'lkp_LNK_CUSTOMER_CUST_GROUP', 'LKP_CIS_CUSTOMER', 'lkp_REF_EARLY_ADOPTERS', 'LKP_GPRS_USAGE_AVG', 'LKP_EMP_FLAG', 'lkp_SH_MOBILE_PH_Active', 'exp_MOBILE_PH_NO']},
2: {'UPDTRANS': ['DIM_NRC_CUSTOMER_Update'], 'LKP_SH_MOBILE_PH_NO': ['EXP_PREPARE_DATA'], 'EXP_PREPARE_DATA': ['FIL_InsertNewRecord', 'FIL_UpdateChangedRecord', 'EXP_DetectChanges', 'LKP_GetData'], 'lkp_LNK_CUSTOMER_CUST_GROUP': ['EXP_PREPARE_DATA'], 'LKP_CIS_CUSTOMER': ['EXP_PREPARE_DATA'], 'lkp_REF_EARLY_ADOPTERS': ['EXP_PREPARE_DATA'], 'LKP_GPRS_USAGE_AVG': ['EXP_PREPARE_DATA'], 'LKP_EMP_FLAG': ['EXP_PREPARE_DATA'], 'lkp_SH_MOBILE_PH_Active': ['EXP_PREPARE_DATA'], 'exp_MOBILE_PH_NO': ['lkp_SH_MOBILE_PH_Active']},
3: {'FIL_InsertNewRecord': ['UPD_ForceInserts'], 'FIL_UpdateChangedRecord': ['UPD_ChangedUpdate'], 'EXP_DetectChanges': ['FIL_InsertNewRecord', 'FIL_UpdateChangedRecord'], 'LKP_GetData': ['FIL_UpdateChangedRecord', 'EXP_DetectChanges']},
4: {'UPD_ForceInserts': ['DIM_NRC_CUSTOMER_Insert'], 'UPD_ChangedUpdate': ['DIM_NRC_CUSTOMER_TMP_Insert']}
}
# Create a new Excel workbook
workbook = openpyxl.load_workbook("C:\\Desktop\\multiple_sheets_details_new.xlsx")
sheet = workbook.create_sheet(title = "MAPPING",index=0)
# Write headers
headers = [f'Stage{i}' for i in nested_dict.keys()]
sheet.append(headers)
# Write data to Excel
for key in set(key for inner_dict in nested_dict.values() for key in inner_dict):
row_data = []
for inner_dict in nested_dict.values():
if key in inner_dict and isinstance(inner_dict[key], list):
row_data.append(f'{key} -> {tuple(inner_dict[key])}')
else:
row_data.append(inner_dict.get(key, [""])[0])
sheet.append(row_data)
# Save the workbook
workbook.save("C:\\Desktop\\multiple_sheets_details_new.xlsx")
问题是我得到的输出中每列记录(第 0 阶段、第 1 阶段等)中都有空白单元格,我希望它们在每列中按顺序排列,没有任何空白单元格。此外,列表值应分解为同一列中的键值记录。喜欢
阶段 3 中具有列表值的 LKP_GetData -> ('FIL_UpdateChangedRecord', 'EXP_DetectChanges') 应分解为阶段 3 中的 LKP_GetData -> ('FIL_UpdateChangedRecord') 和 LKP_GetData -> ('EXP_DetectChanges') 并放置在单独的单元格中
我的输出:
我期望输出如下:
感谢预期结果屏幕截图,我已经很接近了,但无论哪种方式,最简单的可能就是读取字典并在读取时添加到单元格中。
这是一个快速选项,我认为它是正确的,尽管排序方式可能与您的示例不同;
import openpyxl
from openpyxl.utils.cell import get_column_letter
from openpyxl.styles import Font
# Your nested dictionary
nested_dict = {
0: {'DIM_NRC_CUSTOMER_TMP': ['SQ_DIM_NRC_CUSTOMER_TMP'], 'SAT_CONTACT': ['SQ_HUB_CUSTOMER'],
'SAT_CUSTOMER_DERIVED': ['SQ_HUB_CUSTOMER'], 'SAT_CUSTOMER': ['SQ_HUB_CUSTOMER'],
'SAT_CUSTOMER_PREDICTED': ['SQ_HUB_CUSTOMER'], 'HUB_CUSTOMER': ['SQ_HUB_CUSTOMER']},
1: {'SQ_DIM_NRC_CUSTOMER_TMP': ['UPDTRANS'],
'SQ_HUB_CUSTOMER': ['LKP_SH_MOBILE_PH_NO', 'EXP_PREPARE_DATA', 'lkp_LNK_CUSTOMER_CUST_GROUP',
'LKP_CIS_CUSTOMER', 'lkp_REF_EARLY_ADOPTERS', 'LKP_GPRS_USAGE_AVG', 'LKP_EMP_FLAG',
'lkp_SH_MOBILE_PH_Active', 'exp_MOBILE_PH_NO']},
2: {'UPDTRANS': ['DIM_NRC_CUSTOMER_Update'], 'LKP_SH_MOBILE_PH_NO': ['EXP_PREPARE_DATA'],
'EXP_PREPARE_DATA': ['FIL_InsertNewRecord', 'FIL_UpdateChangedRecord', 'EXP_DetectChanges', 'LKP_GetData'],
'lkp_LNK_CUSTOMER_CUST_GROUP': ['EXP_PREPARE_DATA'], 'LKP_CIS_CUSTOMER': ['EXP_PREPARE_DATA'],
'lkp_REF_EARLY_ADOPTERS': ['EXP_PREPARE_DATA'], 'LKP_GPRS_USAGE_AVG': ['EXP_PREPARE_DATA'],
'LKP_EMP_FLAG': ['EXP_PREPARE_DATA'], 'lkp_SH_MOBILE_PH_Active': ['EXP_PREPARE_DATA'],
'exp_MOBILE_PH_NO': ['lkp_SH_MOBILE_PH_Active']},
3: {'FIL_InsertNewRecord': ['UPD_ForceInserts'], 'FIL_UpdateChangedRecord': ['UPD_ChangedUpdate'],
'EXP_DetectChanges': ['FIL_InsertNewRecord', 'FIL_UpdateChangedRecord'],
'LKP_GetData': ['FIL_UpdateChangedRecord', 'EXP_DetectChanges']},
4: {'UPD_ForceInserts': ['DIM_NRC_CUSTOMER_Insert'], 'UPD_ChangedUpdate': ['DIM_NRC_CUSTOMER_TMP_Insert']}
}
# Create a new Excel workbook
# workbook = openpyxl.load_workbook("C:\\Desktop\\multiple_sheets_details_new.xlsx")
workbook = openpyxl.load_workbook("new.xlsx")
sheet = workbook.create_sheet(title="MAPPING", index=0)
# Write headers
headers = [f'Stage{i}' for i in nested_dict.keys()]
sheet.append(headers)
for col, inner_dict in enumerate(nested_dict.values(), 1):
row = 2 # Start from row 2
sheet.cell(row=row-1, column=col).font = Font(bold=True) # Bold the header cells
sheet.column_dimensions[get_column_letter(col)].width = 60 # Set a larger column width
for key in inner_dict:
sheet.cell(row=row, column=col).value = key
value = inner_dict[key]
for item in value:
sheet.cell(row=row, column=col).value = f"{key} ---> {str(item)}"
row += 1
# Save the workbook
workbook.save("C:\\Desktop\\multiple_sheets_details_new.xlsx")