【问题标题】:Pandas: how to format both rows and columns when exporting to Excel (row format takes precedence)?Pandas:导出到 Excel 时如何格式化行和列(行格式优先)?
【发布时间】:2017-10-13 18:02:15
【问题描述】:

我正在使用 pandas 和 xlsxwriter 将一些数据帧导出并格式化为 Excel。

xlsxwriter 文档提到: http://xlsxwriter.readthedocs.io/worksheet.html?highlight=set_column

A row format takes precedence over a default column format

优先级意味着,如果您将 B 列格式化为百分比,然后将第 2 行设置为粗体,则单元格 B2 将不会以 % 为粗体 - 它只会以粗体显示,但不会以 % 为单位!

我在下面提供了一个示例。 有办法解决吗?也许是 xlsxwriter 以外的引擎?将数据框导出到 excel 后,是否可以通过某种方式应用格式?

我是先格式化行再格式化列,反之亦然。

下面的示例中没有显示,但在我的代码中,我将多个数据帧(全部具有相同的列)导出到同一个 Excel 表中。数据框相当于 Excel 数据透视表,底部有一个“总计”行。我希望标题行和总行加粗,并且每一列都有特定的格式,具体取决于数据(%、数千、数百万等)。示例代码如下。

想法?谢谢!

import pandas as pd

writer = pd.ExcelWriter('test.xlsx')
wk = writer.book.add_worksheet('Test')

fmt_bold = writer.book.add_format({'bold':True})
fmt_pct = writer.book.add_format({'num_format': '0.0%'})

wk.write(1,1,1)
wk.write(2,1,2)

wk.set_column(1,1, None, fmt_pct)
wk.set_row(1,None, fmt_bold)

writer.close()

【问题讨论】:

    标签: python pandas export-to-excel openpyxl xlsxwriter


    【解决方案1】:

    正如@jmcnamara 所说,openpyxl 提供了不同的格式化选项,因为它本质上允许您在工作表中处理数据框。注意。 openpyxl 不支持行或列格式。

    openpyxl dataframe_to_rows() 函数将数据帧逐行转换为值生成器,允许您应用任何您喜欢的格式或附加处理。

    【讨论】:

    • 谢谢。也许是我,但这些观点在 openpyxl 和 xlsxwriter 的文档中都不是很清楚。具体来说,我发现说优先级就像在 Excel 中一样具有误导性,因为在 Excel 中,您可以在不删除现有格式的情况下应用格式,例如如果 B 列的格式为 %,您可以选择第 2 行,使其变为粗体,B2 将变为粗体并以 % 为单位。你不能用这些包做到这一点,所以,不,它们不模仿 Excel
    • 我需要查看 win32com 模块。一个一个地重新格式化每个单元格会很痛苦。我希望我可以导出到 Excel 并使用 xlsxwriter 应用列格式,然后重新打开同一个文件并使用 win32com 应用行格式。
    • 无论您采用哪种方式,格式都是始终逐个单元格的; Excel 建议的行和列格式具有误导性。 win32com 很慢,最好用 xlwings,但是 openpyxl 中的命名样式很快。
    【解决方案2】:

    在这种情况下,您需要创建另一种格式,该格式是行格式和列格式的组合,并将其应用于单元格。

    为此,您需要遍历数据框并直接调用 XlsxWriter,而不是使用 Pandas-Excel 接口。

    或者,您也可以使用 OpenPyXL 作为 pandas Excel 引擎。在使用 OpenPyXL 时,最新版本的 Pandas 界面添加了在写入数据框后向 Excel 数据添加格式的功能。

    【讨论】:

    • 那么,如果我理解正确,您的意思是,我需要逐个单元格地应用格式设置吗?换句话说,没有办法只说:B 列以 % 表示,第 2 行以粗体表示,B2 以粗体表示,%,如果我要在 Excel 中手动打开文件,我会怎么做?相反,我需要想出一个脚本来设置:B2:粗体和 %,仅 C2 粗体,B3:仅 %,等等。另外,当您说迭代时,您的意思是迭代以应用格式,还是编写数据帧一个单元一个单元,而不是依赖 to_excel() 方法?
    • 你说 OpenPyXL 允许你在写入数据帧后添加格式,但我已经用 XlsxWriter 这样做了,所以我有点困惑。我使用以 xlsxwriter 为引擎的 to_excel() 方法将数据框导出到 excel,然后使用 set_format() 和 set_column 将格式应用于我已经导出到 Excel 的数据框。
    • PS 或者我可以使用 win32com 模块从 Python 中控制 Excel?基本上我想要的是模仿手动使用 Excel 时发生的情况,即添加而不是替换格式。
    • “我需要逐个单元格地应用格式设置吗?” 是的。 “这里不能说...”。正确的。 “您的意思是迭代以应用格式,还是逐个单元格地写入数据帧”。是的,如果您想使用 XlsxWriter,您需要逐个单元格地写入数据。
    • ...但我已经在使用 XlsxWriter 执行此操作,所以我有点困惑。 OpenPyXL 允许您将格式添加到单元格中,而不是写入数据。 XlsxWriter 没有,你必须同时写入数据和格式。另见Pandas doc on Excel styles
    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多