【问题标题】:Pandas Excel Writer using Openpyxl with existing workbookPandas Excel Writer 使用 Openpyxl 和现有工作簿
【发布时间】:2017-12-26 11:27:48
【问题描述】:

我有一段时间前的代码,我正在重新用于一项新任务。任务是将新的 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_excel 中的sheetname= 参数中使用的工作表除外。

我查看了xlsxwriter's 文档以及openpyxl's,但似乎无法弄清楚为什么该行给了我预期的输出。有什么想法吗?

编辑:我相信this post 是我最初想法的来源。

【问题讨论】:

  • 如果你不指定这本书已经有数据,我认为熊猫只会使用 writer 将数据写入新书,从而覆盖现有书。
  • 我不知道有办法防止 pandas 覆盖整个工作簿。很高兴知道这一点!
  • @saintsfan342000 很高兴我能帮上忙!我认为这也很整洁。现在它只是深入了解为什么它会起作用,以及在我弄清楚这一点后如何扩展它!
  • 在理解是怎么回事方面,值得注意的是,没有“指定书本已有数据”之类的东西。即使您使用的是 Microsoft 的正版 Excel 程序,每次保存时,它总是写入一个完全全新的文件。 碰巧新文件可以与旧文件具有完全相同的名称,在这种情况下,它似乎文件已“更新” ,但实际上旧文件已被新文件覆盖。

标签: python excel pandas openpyxl xlsxwriter


【解决方案1】:

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])

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2017-10-26
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多