熊猫中的 Xlsxwriter 和熊猫锁定之外

Posted

技术标签:

【中文标题】熊猫中的 Xlsxwriter 和熊猫锁定之外【英文标题】:Xlsxwriter in pandas and outside of pandas lockout 【发布时间】:2018-05-07 06:03:09 【问题描述】:

我正在使用 xlsxwriter 引擎通过 pandas.to_excel() 将一些数据框推送到 excel 工作表中,但我需要在每个表格上方添加一个标题。

这是我想要达到的结果的示例:

我没有看到任何方法可以使用 Pandas 的 ExcelWriter 对象来简单地操作每个单元格的内容,当我尝试这样做时,我得到:

例外:Sheetname 'sample',忽略大小写,已在使用中。

我猜 xlsxwriter 会自己锁定它。这是一个例子:

xlsx_writer = pd.ExcelWriter(
    get_target_filepath(xlsx_name),
    engine='xlsxwriter'
)

workbook = xlsx_writer.book
worksheet = workbook.add_worksheet(sheet_name)

worksheet.write(1, 1, 'ABC')

_, sample_table = dataframe_tuples[0]
sample_table.to_excel(xlsx_writer, startrow=3, startcol=2, sheet_name=sheet_name)

我可以保存数据帧并使用 openpyxl 重新检查它,但我非常不喜欢它们进行格式化的方式,我接下来必须这样做,如果我在 xlsxwriter 中对其进行格式化,然后使用 openpyxl 重新打开它,它无法保存正确格式化,openpyxl 毁了它。

我无法将 excel 本身放到服务器上以使用 VBA 宏进行样式设置。

有什么办法可以解决这个问题,还是我只是做错了什么?

【问题讨论】:

【参考方案1】:

您可以通过从 pandas 获取工作表引用并在其上调用标准 XlsxWriter 方法来执行以下操作。像这样:

import pandas as pd


# Create some Pandas dataframes from some data.
df1 = pd.DataFrame('Data': [11, 12, 13, 14])
df2 = pd.DataFrame('Data': [21, 22, 23, 24])

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('pandas_example.xlsx', engine='xlsxwriter')

# Position the dataframes in the worksheet.
df1.to_excel(writer, sheet_name='Sheet1', index=False, startrow=2)
df2.to_excel(writer, sheet_name='Sheet1', index=False, startrow=9)

# Get the worksheet object.
worksheet = writer.sheets['Sheet1']

# Write some titles above the dataframes.
worksheet.write(1, 0, 'Some random title 1')
worksheet.write(8, 0, 'Some random title 2')

# Close the Pandas Excel writer and output the Excel file.
writer.save()

另见Working with Python Pandas and XlsxWriter。

输出:

【讨论】:

这会在“Sheets1”和我使用的任何替换上引发 KeyError。我也不明白如果没有用,为什么我们会得到 book 对象。代码中还有一些分号,所以我只是删除了它们。我尝试使用“工作簿”来调用表格字典,但它没有属性“表格”,所以我猜不是这样。 我修复了示例中的小问题。此示例中不需要工作簿对象。我没有也不应该在工作表名称上获得KeyError。我使用 Pandas 0.20.1 和 XlsxWriter 1.0.2 附加了输出。 有趣的是,当我从新创建的 ExcelWriter.sheets 打印密钥时,它是空的。熊猫 0.20.3 XlsxWriter 1.0.2 另外,请查看我链接到的 XlsxWriter 文档部分。它回答了(我认为)您的基本问题,即在使用 Pandas 时如何访问底层 xlsxwriter 工作簿/工作表。 我检测到错误。在调用 pandas to_excel 之前,我似乎无法获得工作表。之后,工作表“存在”。所以执行顺序是我的问题。谢谢你,很高兴见到 xlsxwriter 项目的策划者!【参考方案2】:

尝试使用多级列:

In [137]: df
Out[137]:
   A  B  C
0  1  2  3
1  4  5  6
2  7  8  9

In [138]: df.columns = pd.MultiIndex.from_product([['Caption'], df.columns])

In [139]: df
Out[139]:
  Caption
        A  B  C
0       1  2  3
1       4  5  6
2       7  8  9

In [140]: df.to_excel('c:/temp/a.xlsx')

结果:

【讨论】:

这是一种非常有趣的开箱即用方法,我喜欢它!它也有效,但解决方案非常具体,我认为它一般不会解决这类问题,即“在 xlsxwriter 引擎上与 xlsxwriter 和 pandas 一起工作”。

以上是关于熊猫中的 Xlsxwriter 和熊猫锁定之外的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框的列索引中获取字符串列表

大熊猫无格式导出到excel

PySpark:读取 pyspark 框架中的 csv 数据。为啥它在框架中显示特殊字符?除了使用熊猫之外,以表格形式显示的任何方式[重复]

ModuleNotFoundError:databricks 中没有名为“xlsxwriter”的模块

如何用熊猫把传说放在情节之外

如何用熊猫把传说放在情节之外