使用 Xlsx Writer 在 excel 中的特定列、行中写入嵌套字典

Writing nested dictionary in specific column, row in excel using Xlsx Writer

您好,我正在尝试使用 XlsxWriter 将字典中的数据写入 Excel。

我的进度和预期结果:

我想将这本词典中的其余数据以相同的格式呈现给 Excel 并订购任何人都可以提供帮助。

import datetime
import xlsxwriter

workbook = xlsxwriter.Workbook("ExcelData.xlsx")
worksheet = workbook.add_worksheet()

dic_data = {
    "Client 1": "ACCESS DENIED",
    "Client 2": {
        "last_session_start_date": datetime.datetime(2022, 1, 19, 22, 53, 57),
        "last_session_end_date": datetime.datetime(2022, 1, 19, 22, 55, 40),
        "last_session_order_count": 1,
        "last_session_order_total": 0.0,
        "active_session_start_date": datetime.datetime(2022, 1, 20, 11, 9, 43),
        "active_session_end_date": False,
        "active_session_order_count": 3,
        "Active_session_order_total": 20.0,
    },
}

cell = workbook.add_format(
    {
        "bold": 1,
        "border": 1,
        "fg_color": "green",
        "color": "white",
    }
)

worksheet.merge_range("A1:H1", "Activity Report", cell)
worksheet.merge_range("A2:A3", "client Name", cell)
worksheet.merge_range("B2:E2", "Last Session ", cell)
worksheet.merge_range("F2:H2", " Active Session", cell)
rest_of_rows = [
    "start date",
    "end date",
    "order count",
    "order total",
    "start date",
    "order count",
    "order total",
]

worksheet.write_row(2, 1, rest_of_rows, cell)


for i, (k, v) in enumerate(dic_data.items(), start=3):
    worksheet.write(i, 0, k)


workbook.close()

您没有列名和数据键之间的映射,因此您需要更改它:

rest_of_rows = [
    # header / data field
    ("start date", "last_session_start_date"),
    ("end date", "last_session_end_date"),
    ("order count", "last_session_order_count"),
    ("order total", "last_session_order_total"),
    ("start date", "active_session_start_date"),
    ("order count", "active_session_order_count"),
    ("order total", "active_session_order_total"),
]

worksheet.write_row(2, 1, [row[0] for row in rest_of_rows], cell)

然后,不用 for i, (k, v) 循环,而是使用更具描述性的名称和一个内部循环来查找每列的值。


for y, (name, info) in enumerate(dic_data.items(), start=3):
    worksheet.write(y, 0, name)  # write name
    if isinstance(info, str):  # only a string?
        worksheet.write(y, 1, info)  # write it out
    elif isinstance(info, dict):
        for x, (_header, key) in enumerate(rest_of_rows, 1):  # otherwise look for data per column
            value = info.get(key)
            if value is not None:
                if isinstance(value, datetime.datetime):
                    value = value.isoformat()
                worksheet.write(y, x, value)

输出(由我的 Mac 的数字呈现):