xlsxwriter动态标头范围的格式



我正在处理一个pandas数据帧,该数据帧具有不同数量的列。我想使用xlsxWriter将其解析为Excel并创建一个工作表。由于列的数量不同,我在创建表时为列名创建了一个列表理解。(这里我刚刚创建了一个示例数据帧,所以不要混淆(

我能以某种方式在该列表理解中添加额外的可选参数以调整表中每个标题的格式吗?例如,将每个页眉从左起缩进2?或者,如果可能的话,根据标题的名称为每列添加不同的格式。

以下是我迄今为止的代码:

writer = pd.ExcelWriter('pandas_table.xlsx', engine='xlsxwriter')
data = [
['Apples', 10000, 5000, 8000, 6000, 8000],
['Pears',   2000, 3000, 4000, 5000, 8000],
['Bananas', 6000, 6000, 6500, 600, 80000],
['Oranges',  500,  300,  200,  700, 8000],
]
#transform the list of values into a dataframe
df = pd.DataFrame(data = data, columns = ['Product', 'Quarter 1', 'Quarter 2', 'Quarter 3', 'Quarter 4', 'wtf' ])
#assign the dataframe to the worksheet Sheet1
df.to_excel(writer, sheet_name='Sheet1', startrow=1, header=False, index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
#define the length of the dataframe for the table format
(max_row, max_col) = df.shape
#list comprehension for the optional columns parameter in add_table
col_settings = [{'header': column} for column in df.columns]     
worksheet.add_table(0, 0, max_row, max_col - 1, {'columns' : col_settings})

为了格式化单列,我做了一个小的变通方法,但也许你也知道一个更平滑的方法。

for i, col in enumerate(df.columns):
if col == 'Quarter 2':
worksheet.set_column(i, i, 18, currency_format)
else:
worksheet.set_column(i, i, 18)

对于比设置列标题名称更复杂的内容,最好使用For循环,而不是列表理解。类似于:

currency_format = workbook.add_format({'num_format': '$#,##0'})
col_settings = []
for column in df.columns:
options = {'header': column}
if column == 'Quarter 2':
options['format'] = currency_format
col_settings.append(options)

然而,这实际上不会格式化列数据,因为它已经由panda编写了。为了使数据格式化工作,您还需要将数据添加到add_table():

worksheet.add_table(0, 0, max_row, max_col - 1, {'data': data, 'columns' : col_settings})

然而,如果你正在这样做,那么使用Panda的to_excel()可能没有太多价值。因此,如果你的变通方法有效,我建议继续使用它。

相关内容

  • 没有找到相关文章

最新更新