使用Openpyxl和现有工作簿的Pandas Excel写入器

9

我有一段时间以前写的代码,现在要重新使用它来完成一个新任务。任务是将一个新的DataFrame写入一个现有的Excel文件中的一个新工作表。但是有一部分代码我不太理解,但它确实让代码“正常运行”。

可行:

from openpyxl import load_workbook
import pandas as pd
file = r'YOUR_PATH_TO_EXCEL_HERE'

df1 = pd.DataFrame({'Data': [10, 20, 30, 20, 15, 30, 45]})
book = load_workbook(file)
writer = pd.ExcelWriter(file, engine='openpyxl')
writer.book = book # <---------------------------- piece i do not understand
df1.to_excel(writer, sheet_name='New', index=None)
writer.save()

这行代码 writer.book=book 让我感到困惑。如果没有这行代码,Excel 文件将删除除在 df1.to_excelsheetname= 参数中使用的工作表之外的所有其他工作表。

我查看了 xlsxwriteropenpyxl 的文档,但似乎无法弄清楚为什么那行代码会给我期望的输出。有什么想法吗?

编辑:我相信 这篇帖子 是我最初得到这个想法的地方。


1
我认为Panda将使用writer将数据写入新的工作簿,因此如果您没有指定该工作簿已经有数据,它将覆盖现有的工作簿。 - T4rk1n
我不知道有一种方法可以防止pandas覆盖整个工作簿。这是非常好的知识! - saintsfan342000
@saintsfan342000 很高兴我能帮到你!我也觉得这很有趣。现在只需要找出为什么它有效以及在我弄清楚后如何扩展它就可以了! - MattR
1
就理解正在发生的事情而言,值得注意的是,“指定书籍已经有数据”这样的事情根本不存在。即使您使用微软的正版Excel程序,每次保存时,它都会始终写入全新的文件。恰好这个全新的文件可以与旧文件具有完全相同的名称,在这种情况下,似乎文件已被“更新”,但实际上是新文件覆盖了旧文件。 - John Y
1个回答

5
在ExcelWriter的源代码中,使用openpyxl初始化空工作簿并删除所有工作表。因此您需要明确地添加它。
class _OpenpyxlWriter(ExcelWriter):
    engine = 'openpyxl'
    supported_extensions = ('.xlsx', '.xlsm')

    def __init__(self, path, engine=None, **engine_kwargs):
        # Use the openpyxl module as the Excel writer.
        from openpyxl.workbook import Workbook

        super(_OpenpyxlWriter, self).__init__(path, **engine_kwargs)

        # Create workbook object with default optimized_write=True.
        self.book = Workbook()

        # Openpyxl 1.6.1 adds a dummy sheet. We remove it.
        if self.book.worksheets:
            try:
                self.book.remove(self.book.worksheets[0])
            except AttributeError:

                # compat
                self.book.remove_sheet(self.book.worksheets[0])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接