Python 如何使用 ExcelWriter 写入现有工作表

Posted

技术标签:

【中文标题】Python 如何使用 ExcelWriter 写入现有工作表【英文标题】:Python How to use ExcelWriter to write into an existing worksheet 【发布时间】:2016-04-17 03:20:09 【问题描述】:

我正在尝试使用 ExcelWriter 将一些信息写入/添加到包含多个工作表的工作簿中。 第一次使用该功能时,我正在使用一些数据创建工作簿。在第二次通话中,我想将一些信息添加到工作簿中不同位置的所有工作表中。

def Out_Excel(file_name,C,col): 
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')
    for tab in tabs:    # tabs here is provided from a different function that I did not write here to keep it simple and clean
        df = DataFrame(C)    # the data is different for different sheets but I keep it simple in this case
        df.to_excel(writer,sheet_name = tab, startcol = 0 + col, startrow = 0)
    writer.save()

在主代码中,我使用不同的 col 两次调用此函数,以在不同的位置打印出我的数据。

Out_Excel('test.xlsx',C,0)
Out_Excel('test.xlsx',D,10)

但问题是这样做的输出只是函数的第二次调用,就好像函数会覆盖整个工作簿一样。我想我需要加载在这种情况下已经存在的工作簿? 有什么帮助吗?

【问题讨论】:

是否要将D 附加到C在同一张表中?或者您想向现有工作簿添加新工作表?如果你想在同一张表中追加,你真的应该在熊猫中追加。 How to write to an existing excel file without overwriting data (using pandas)?的可能重复 【参考方案1】:

使用openpyxl 中的load_book - 请参阅xlsxwriter 和openpyxl 文档:

import pandas as pd
from openpyxl import load_workbook

book = load_workbook('test.xlsx')
writer = pd.ExcelWriter('test.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

df.to_excel(writer, sheet_name='tab_name', other_params)

writer.save()

【讨论】:

感谢您的评论。按照您的建议,我必须第一次创建工作簿,然后在需要时使用 load_book。我这样做了,但出现以下错误:TypeError: copy() got an unexpected keyword argument 'font' 见***.com/questions/30102232/… 只需仔细检查一下,pandas 0.17.1openpyxl 2.3.1 对我来说效果很好。 感谢 Stefan,我已经为此苦苦挣扎了一段时间。我尝试了几次,我得到了一个错误,正如我在之前的 cmets 中提到的那样。我正在使用 openpyxl 2.3.1 和 pandas 0.16.2 。我想我需要找到另一个解决方案。无论如何感谢您的评论 @Stefan 我只是posted a question,最近偶然发现了这篇文章。你能解释一下writer.book = book 正在做什么以及为什么这允许你写入现有的工作簿吗?【参考方案2】:

您也可以尝试使用以下方法来创建您的 Excel 电子表格:

import pandas as pd

def generate_excel(csv_file, excel_loc, sheet_):
    writer = pd.ExcelWriter(excel_loc)
    data = pd.read_csv(csv_file, header=0, index_col=False)
    data.to_excel(writer, sheet_name=sheet_, index=False)
    writer.save()
    return(writer.close())

试试这个,让我知道你的想法。

【讨论】:

我认为这实际上并不能满足问题的要求。【参考方案3】:

Pandas version 0.24.0 添加了 mode 关键字,它允许您附加到 excel 工作簿,而无需跳过我们过去必须做的麻烦。只需使用 mode='a' 将工作表附加到现有工作簿。

来自the documentation:

with ExcelWriter('path_to_file.xlsx', mode='a') as writer:
     df.to_excel(writer, sheet_name='Sheet3')

【讨论】:

有点不清楚 OP 是否想将工作表附加到现有工作簿,但这就是这样做的。如果Sheet3 已存在于现有工作簿中,则会被df 的内容覆盖。 什么是df?我在pandas网站上看到了这个,但也没有说它是从哪里来的 @silence_lamb df 是熊猫 DataFrame 在 Pandas 1.03 (Py 3.8) 上,这给了我 ValueError:xlsxwriter 不支持附加模式。将引擎更改为 openpyxl 至少解决了错误with pd.ExcelWriter(file,engine='openpyxl', mode = 'a') as writer: @T.C.Proctor:在我的情况下,它没有覆盖它,只是在末尾添加了一个 1。因此创建了一个名为 Sheet31 的新工作表

以上是关于Python 如何使用 ExcelWriter 写入现有工作表的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas/ExcelWriter 为单元格中的文本部分着色

python 使用openpyxl来写数据到excel表格

用python写CSVEXCEL文件

使用 Pandas Excelwriter 写入 StringIO 对象?

使用 excelwriter 写入 Excel 文件不提供文件

即使使用追加模式,使用 Excelwriter 将 DataFrame 写入新工作表也会删除所有其他工作表