pandas xlsxwriter,格式标题

Ego*_*kov 22 python format excel pandas xlsxwriter

我正在使用xlsxwriter保存pandas DataFrame to_excel.我已经设法格式化我的所有数据(设置列宽,字体大小等),除了更改标题的字体,我找不到这样做的方法.这是我的例子:

import pandas as pd
data = pd.DataFrame({'test_data': [1,2,3,4,5]})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

data.to_excel(writer, sheet_name='test', index=False)

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

font_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10})
header_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10, 'bold': True})

worksheet.set_column('A:A', None, font_fmt)
worksheet.set_row(0, None, header_fmt)

writer.save()
Run Code Online (Sandbox Code Playgroud)

试图为标题设置格式的倒数第二行什么都不做.

jez*_*ael 32

我认为您需要先重置默认标题样式,然后您可以更改它:

pd.core.format.header_style = None
Run Code Online (Sandbox Code Playgroud)

全部一起:

import pandas as pd

data = pd.DataFrame({'test_data': [1,2,3,4,5]})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

pd.core.format.header_style = None

data.to_excel(writer, sheet_name='test', index=False)

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

font_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10})
header_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10, 'bold': True})

worksheet.set_column('A:A', None, font_fmt)
worksheet.set_row(0, None, header_fmt)

writer.save()
Run Code Online (Sandbox Code Playgroud)

jmcnamara解释,谢谢:

在Excel中,单元格格式覆盖行格式会覆盖列格式.pd.core.format.header_style将转换为格式并应用于标题中的每个单元格.因此,默认值不能被覆盖set_row().设置pd.core.format.header_styleNone表示标题单元格没有用户定义的格式,因此可以覆盖它set_row().

编辑:在版本中0.18.1你必须改变

pd.core.format.header_style = None
Run Code Online (Sandbox Code Playgroud)

至:

pd.formats.format.header_style = None
Run Code Online (Sandbox Code Playgroud)

编辑:从版本0.20再次改变

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None
Run Code Online (Sandbox Code Playgroud)

谢谢krvkir.

  • 它看起来像在pandas 0.18.1中它们将`pd.core.format`移动到`pd.formats`模块,所以现在应该写`pd.formats.format.header_style = None`. (6认同)
  • 好的解决方法.只是一些背景来解释为什么这样做.在Excel中,单元格格式覆盖行格式会覆盖列格式."pd.core.format.header_style"将转换为格式并应用于标题中的每个单元格.因此,`set_row()`不能覆盖默认值.将`pd.core.format.header_style`设置为`None`意味着标题单元格没有用户定义的格式,因此可以覆盖格式. (5认同)
  • 这不再适用于Pandas 0.24 (2认同)

Iro*_*ard 25

对于发现此帖并使用Pandas 0.20.1的任何人的更新.

现在似乎是必需的代码

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None
Run Code Online (Sandbox Code Playgroud)

显然excel子模块不是自动导入的,所以pandas.io.formats.excel.header_style = None单独尝试就会引发子模块AttributeError.


eli*_*liu 6

对于熊猫 0.24:

以下不再起作用:

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None
Run Code Online (Sandbox Code Playgroud)

相反,创建一个单元格格式对象,并使用新的单元格格式对象一次一个单元格重写第一行的内容(您的标题)。
现在,你是未来的证明。

使用以下伪代码:

# [1] write df to excel as usual
writer = pd.ExcelWriter(path_output, engine='xlsxwriter')
df.to_excel(writer, sheet_name, index=False)

# [2] do formats for other rows and columns first

# [3] create a format object with your desired formatting for the header, let's name it: headercellformat

# [4] write to the 0th (header) row **one cell at a time**, with columnname and format
for columnnum, columnname in enumerate(list(df.columns)):
    worksheet.write(0, columnnum, columnname, headercellformat)
Run Code Online (Sandbox Code Playgroud)


小智 5

在 pandas 0.20 中,已接受答案的解决方案再次发生了变化。

应设置为 None 的格式可以在以下位置找到:

pandas.io.formats.excel.header_style
Run Code Online (Sandbox Code Playgroud)


小智 5

熊猫0.25的另一种选择(可能也是0.24)。可能不是最好的方法,但是它对我有用。

import pandas.io.formats.excel
pandas.io.formats.excel.ExcelFormatter.header_style = None
Run Code Online (Sandbox Code Playgroud)