使用 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 的数字呈现):
您好,我正在尝试使用 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 的数字呈现):