在 Python 中使用 openpyxl 编写嵌套字典以实现 excel

问题描述 投票:0回答:1

我想使用 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') 并放置在单独的单元格中

我的输出:

我期望输出如下:

python dictionary openpyxl
1个回答
0
投票

感谢预期结果屏幕截图,我已经很接近了,但无论哪种方式,最简单的可能就是读取字典并在读取时添加到单元格中。

这是一个快速选项,我认为它是正确的,尽管排序方式可能与您的示例不同;

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")

© www.soinside.com 2019 - 2024. All rights reserved.