Pandas xlsxwriter,格式化表头 - 而不是工作表头

40

我正在使用xlsxwriter将pandas DataFrame保存为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()

倒数第二行尝试设置标题格式,但实际上无效。

7个回答

51

我认为你需要先重置默认的标题样式,然后才能进行更改:

pd.core.format.header_style = None

总之:

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()

感谢jmcnamara的解释:

在Excel中,单元格格式优先于行格式,行格式优先于列格式。将 pd.core.format.header_style 转换为格式,并应用于标题中的每个单元格。因此,默认设置不能被 set_row() 覆盖。将 pd.core.format.header_style 设置为 None 意味着标题单元格没有用户定义的格式,因此可以被 set_row() 覆盖。

编辑:在版本 0.18.1 中,您需要进行更改。

pd.core.format.header_style = None

至:

pd.formats.format.header_style = None

编辑:从0.20版本开始,这又发生了变化。

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None

感谢krvkir

编辑:从版本0.24开始,这是必需的

import pandas.io.formats.excel
pandas.io.formats.excel.ExcelFormatter.header_style = None

感谢Chris Vecchio


1
这个答案应该更新以反映Chris Vecchio在下面的贡献:https://dev59.com/jloV5IYBdhLWcg3wGrmI#58033197 - rahlf23

31

对于任何使用Pandas 0.20.1的读者,这里有一个更新。

现在所需的代码似乎是:

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None

显然excel子模块不会自动导入,所以仅尝试使用pandas.io.formats.excel.header_style = None将会引发一个AttributeError错误。


24

针对Pandas 0.25(可能也适用于0.24),还有另一种选项。这可能不是最佳的方法,但对我有效。

import pandas.io.formats.excel
pandas.io.formats.excel.ExcelFormatter.header_style = None

6

对于pandas 0.24版本:

以下内容已经不再适用:

import pandas.io.formats.excel
pandas.io.formats.excel.header_style = None

相反,创建单元格格式对象,并使用新的单元格格式对象逐个重写第一行内容(标题)中的每个单元格。
现在,你是未来的保障。

使用以下伪代码:

# [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)

1
这是根据文档(https://xlsxwriter.readthedocs.io/example_pandas_header_format.html)推荐的方法。此外,它可以防止格式化整行(直到XFD列)。 - naccode

4
在 pandas 0.20 中,被接受的答案的解决方案又发生了变化。
应设置为“None”的格式可以在以下位置找到:
pandas.io.formats.excel.header_style

1
如果您不想为整个pandas设置标题样式,您还可以向ExcelWriter传递header=False来代替:
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(3, 5), 
                  columns=pd.date_range('2019-01-01', periods=5, freq='M'))

file_path='output.xlsx'
writer = pd.ExcelWriter(file_path, engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', header=False, index=False )
workbook = writer.book
fmt = workbook.add_format({'num_format': 'mm/yyyy', 'bold': True})
worksheet = writer.sheets['Sheet1']
worksheet.set_row(0, None, fmt)
writer.save()

-1

很遗憾,add_format不再可用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接