【问题标题】:Xlsxwriter in pandas and outside of pandas lockout熊猫中的 Xlsxwriter 和熊猫锁定之外
【发布时间】: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 宏进行样式设置。

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

【问题讨论】:

    标签: python excel pandas xlsxwriter


    【解决方案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 一起工作”。
    猜你喜欢
    • 2022-12-11
    • 2013-09-26
    • 2014-01-07
    • 1970-01-01
    • 2020-07-27
    • 2014-02-19
    • 2013-02-21
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多