在使用XlsxWriter导出到xlsx时应用样式
我使用pandas的.to_excel方法把一个数据表写成Excel文件。这种方法很好用,即使是有多重索引的数据表,索引的单元格也会合并在一起。
而且如果我用纯XlsxWriter的话,可以对单元格应用各种格式,这样也很好用。
不过,我找不到用pandas的方法来做到这一点。要是能直接传一个包含列名和样式的字典,那就简单多了。
有没有什么办法可以做到这一点呢?
4 个回答
下一个版本的Pandas(2.0)将会加入一个实验性的新功能,允许用户直接把带样式的数据表(DataFrame)导出到Excel文件中,这个功能是通过openpyxl实现的。你可以在这里了解更多信息:http://pandas-docs.github.io/pandas-docs-travis/style.html#Export-to-Excel
下面的方法让我可以在数据框的索引和列名上使用xlsxwriter的格式设置(不过我不能保证这个方法一定有效):
import pandas as pd
import xlsxwriter as xl
# remove pandas header styles
# this avoids the restriction that xlsxwriter cannot
# format cells where formatting was already applied
pd.core.format.header_style = None
# write dataframe to worksheet
writer = pd.ExcelWriter(sumfile, engine='xlsxwriter')
df.to_excel(writer, sheet_name='test')
# create desired xlsxwriter formats
workbook = writer.book
worksheet = writer.sheets['test']
header = workbook.add_format({'bold': True})
index = workbook.add_format({'align': 'left'})
# apply formats to header and index
worksheet.set_row(0, None, header)
worksheet.set_column(0,0, None, index)
如果你只是想给表头添加样式,可以修改 pandas.io.formats.excel.header_style
。当然,这并不是一个通用的解决方案,但对于常见的使用场景来说,这是一个简单的变通办法。
import pandas.core.format
header_style_backup = pandas.io.formats.excel.header_style
try:
pandas.io.formats.excel.header_style = {"font": {"bold": True},
"borders": {"top": "thin", "right": "thin", "bottom": "thin", "left": "thin"},
"pattern": {"pattern": "solid", "fore_colour": 26},
"alignment": {"horizontal": "center", "vertical": "top"}}
df.to_excel(writer, sheet_name=sheetname, startrow=table_startrow)
finally:
pandas.formats.format.header_style = header_style_backup
注意:在之前的pandas版本中,header_style的位置多次发生变化。如果你使用的是旧版本,可以参考以下内容:
版本 < 0.20.0 使用 pandas.formats.format.header_style
版本 < 0.18.0 使用 pandas.core.format.header_style
有没有什么办法可以做到这一点?
目前没有。Pandas里没有像那样的格式化机制来处理Excel输出(除了几个硬编码的格式)。
不过,即使是XlsxWriter,现在也不支持在添加数据后再格式化单元格。这个功能在待办事项列表上。
更新:
作为一个变通办法,我建议你获取底层的工作簿和工作表的引用,然后用来自Pandas数据框的相同数据和XlsxWriter的格式来覆盖你想要格式化的单元格。