可以将Excel选项卡读入代码并使用Excel写回相同的选项卡

omvjsjqw  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(133)

我有一段代码,可以使用XlsxWriter创建一个名为file_A的Excel文件。用户给我发了一个名为file_b的excel文件,其中只有一个标签,名为tab_b。他们希望tab_b附加到file_A。这个tab_b包含了很多格式(我认为其中一些福尔斯“丰富”格式),我宁愿不硬编码到代码库中。
有没有办法将tab_b作为某种tab对象上传到代码库中?然后,我可以将此选项卡附加到file_A,所有格式和硬编码都将封装在选项卡对象中。
我们已经在我们的代码库中使用了XlsxWriter和openpyxl,但我不知道它们是否真的适合做这种事情。如果有必要,我对其他模块持开放态度,但它必须与Python兼容。
我们当前如何创建file_A的示例代码如下所示:

writer = pd.ExcelWriter(output_file_path, engine='xlsxwriter')
someDataFrame.to_excel(writer, sheet_name='PreExisting_Tab')
writer.save()

理想情况下,我希望找出的是,下面的伪代码是否有真实的代码:

writer = pd.ExcelWriter(output_file_path, engine='xlsxwriter')
someDataFrame.to_excel(writer, sheet_name='PreExisting_Tab')

tab_b = readTabWithFormattingIntoPython("filePathToFile_B")
tab_b.to_Excel(writer,sheet_name='tab_b')

writer.save()

下面的屏幕截图描述了file_b中的tab_b。

更新感谢@DeepSpace让我注意到StyleFrame。它看起来很有希望,但我最初的概念验证尝试失败了。以下是我尝试的方法(它看起来与您示例中的代码非常相似,但不确定为什么会失败):

from StyleFrame import StyleFrame
    writer = pd.ExcelWriter(output_file_path, engine='openpyxl')

    tab_to_convert= StyleFrame.read_excel(file_B_file_path, read_style=True)

    tab_to_convert.to_excel(writer)
    writer.save()

上述代码的结果是,Excel文件被创建一个工作表,没有数据或格式从文件应该已经读取。在单元格A1中,它说“此工作表包含用于此工作簿的=FDS代码的FactSet XML数据。修改工作表的内容可能会损坏工作簿的FDS功能。”
不确定这是否是它不工作的原因,但我必须在创建编写器时指定“engine ='openpyxl'"。如果我没有指定,它会尝试使用XlsxWriter,但由于AttributeError而失败:“Workbook”对象没有属性“get_sheet_by_name”

第二次更新StyleFrame最终工作。请参阅@DeepSpace的回答中的评论。

kzmpq1sx

kzmpq1sx1#

StyleFrame(作为免责声明,我是作者之一)可以做到这一点。

from StyleFrame import StyleFrame

writer = pd.ExcelWriter(output_file_path)
someDataFrame.to_excel(writer, sheet_name='PreExisting_Tab')

tab_b = StyleFrame.read_excel("filePathToFile_B", read_style=True)
tab_b.to_Excel(writer, sheet_name='tab_b')

writer.save()
gdx19jrr

gdx19jrr2#

关于 “此工作表包含用于此工作簿的=FDS代码的FactSet XML数据。修改工作表的内容可能会损坏工作簿的= FDS功能。" 错误,这是由excel FactSet插件添加的非常隐藏的工作表引起的。你可以查看非常隐藏的工作表,如果你在Excel中打开该文件,然后转到Excel。在项目概述中,您将看到一个名为__FDSCACHE__的文件。您可以删除此工作表或显式定义要打开的工作表,例如

df = pd.read_excel("foo.xlsx", sheet_name='Sheet1')

相关问题