Python如何使用ExcelWriter将数据写入现有的工作表中。

16

我希望使用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()
在主代码中,我使用不同的列两次调用该函数来在不同的位置打印数据。
Out_Excel('test.xlsx',C,0)
Out_Excel('test.xlsx',D,10)

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


1
你想在“同一工作表”中将 D 追加到 C 吗?还是想在现有的工作簿中添加一个新工作表?如果您想在同一工作表中追加,建议使用 pandas 进行追加。 - T.C. Proctor
1
可能是[如何使用pandas向现有的Excel文件中写入数据而不覆盖原有数据?](https://dev59.com/5WIj5IYBdhLWcg3wfVB8)的重复问题。 - T.C. Proctor
3个回答

19

使用openpyxl库的load_book函数 - 请参阅xlsxwriteropenpyxl文档:

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()得到了一个意外的关键字参数'font'。 - Hamed
我刚刚双重检查了一下,使用 pandas 0.17.1openpyxl 2.3.1 对我来说完全正常。 - Stefan
谢谢Stefan,我已经为此苦苦挣扎了一段时间。我尝试了几次,但是像我在之前的评论中提到的那样,程序出错了。我正在使用openpyxl 2.3.1和pandas 0.16.2。我想我需要找另一个解决方案。不管怎样,还是感谢您的评论。 - Hamed
2
@Stefan,我刚刚发布了一个问题,最近偶然发现了这篇文章。你能解释一下writer.book = book是在做什么以及为什么它允许你写入到现有的工作簿中吗? - MattR
@MattR - writer.book=bookload_book 的结果设置为 writerbook 属性,以便您可以在下一步还生成 sheets 属性后对其进行操作。如果没有 booksheet 属性,则无法添加工作表或保存到 Excel。 - Stefan
显示剩余2条评论

11

Pandas 0.24.0版本增加了mode关键字,可以让你在不必像以前那样费力地跳跃来追加Excel工作簿。只需使用mode='a'即可将工作表添加到现有的工作簿中。

引用文档

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

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

1
您也可以尝试使用以下方法创建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())

尝试一下这个,并让我知道你的想法。


我认为这实际上并没有做出问题所要求的内容。 - T.C. Proctor

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