【问题标题】:Xlsxwriter - Trouble formatting pandas dataframe cells using xlsxwriterXlsxwriter - 使用 xlsxwriter 格式化 pandas 数据框单元格时出现问题
【发布时间】:2017-02-16 14:08:23
【问题描述】:

我有一张来自 pandas 数据框的 Excel 表格。然后我使用 Xlsxwriter 添加公式、新列和格式。问题是我似乎只能格式化我使用 xlsxwriter 编写的内容,而没有来自数据框的内容。所以我得到的是这样的half formatted table

从图像中可以看出,数据框中的两列保持不变。它们必须具有某种覆盖我的默认格式。

由于我不知道如何将工作表转换回数据框,所以下面的代码显然是完全错误的,但这只是为了说明我在寻找什么。

export = "files/sharepointExtract.xlsx"
df = pd.read_excel(export)# df = dataframe

writer = pd.ExcelWriter('files/new_report-%s.xlsx' % (date.today()), engine = 'xlsxwriter')
workbook = writer.book

# Code to make the header red, this works fine because 
# it's written in xlsxwriter using write.row()

colour_format = workbook.add_format()
colour_format.set_bg_color('#640000')
colour_format.set_font_color('white')
worksheet.set_row(0, 15, colour_format)

table_body_format = workbook.add_format()
table_body_format.set_bg_color('blue')

for row in worksheet.rows:
  row.set_row(0,15, table_body_format)

这段代码给出了一个属性错误,但即使没有 for 循环,我们也只能得到图像中可以看到的内容。

【问题讨论】:

  • 您能否将编写数据的代码部分也包含在内,以便我们了解它与样式的关系?
  • “他们必须有某种覆盖我的默认格式。”那是正确的。 Pandas 中有默认的列/标题格式,它覆盖通过 XlsxWriter 接口应用的行/列格式。据我所知,没有任何公共 api 可以更改该格式(datetime_formatdate_format 除外)。
  • @ASGM 更新了代码以包含我写入数据的位置
  • 太棒了 - 你也可以发布错误吗?

标签: python excel pandas xlsxwriter


【解决方案1】:

以下应该有效:

import pandas as pd
from datetime import date

export = "files/sharepointExtract.xlsx"
df = pd.read_excel(export)

writer = pd.ExcelWriter('files/new_report-{}.xlsx'.format(date.today()), engine ='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', startrow=1 , startcol=0, header=False, index=False, encoding='utf8')  

workbook = writer.book
worksheet = writer.sheets['Sheet1']

# Code to make the header red background with white text
colour_format = workbook.add_format()
colour_format.set_bg_color('#640000')
colour_format.set_font_color('white')

# Code to make the body blue    
table_body_format = workbook.add_format()
table_body_format.set_bg_color('blue')

# Set the header (row 0) to height 15 using colour_format
worksheet.set_row(0, 15, colour_format)
# Set the default format for other rows
worksheet.set_column('A:Z', 15, table_body_format)

# Write the header manually
for colx, value in enumerate(df.columns.values):
    worksheet.write(0, colx, value)
  
writer.save()

当 Pandas 用于编写标头时,它使用自己的格式样式覆盖底层 xlsxwriter 版本。最简单的方法是阻止它写入标题并让它从行1 开始(而不是0)写入其余数据。这样可以避免格式被更改。然后,您可以使用数据框中的列值轻松编写自己的标题。

【讨论】:

  • 我看到您建议同时使用 set_row 和 set_column 来添加格式。 set_column 不会覆盖 set_row 命令的格式吗?
  • set_column() 用于提供默认格式。用于标头的set_row() 会覆盖默认值。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多