python - 将 Openpyxl 与现有工作簿一起使用的 Pandas Excel Writer

标签 python excel pandas openpyxl xlsxwriter

我有一段时间前的代码,我正在为一项新任务重新使用这些代码。任务是将新的 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这是我最初想法的来源。

最佳答案

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

关于python - 将 Openpyxl 与现有工作簿一起使用的 Pandas Excel Writer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45220247/

相关文章:

python - Flask-SQLAlchemy 中的 LocalProxy 对象

python - 如何使用 flask-security 在登录时运行自定义代码

python - 如何不将 date_string 转换为 pandas 中的日期?

vba - 使用 vba 将多行复制到另一张工作表中的单列中

excel - 网络日功能

python - Plotly:如何使用 Pandas 数据框定义桑基图的结构?

vba - 如何使用VBA对同一范围进行条件格式化

python - 需要替换 Pandas 中已弃用和已删除的 API

python - 从 Pandas DataFrame 中仅过滤掉真实值,返回 (Row,Col) 的元组

python - 如何安装 Python Pandas ?