最近有一个需求,需要将不同的DataFrame df对象追加写入到同一个Excel Sheet中,比如当前有一个test.xlsx,其中有一个名为sheet1的表格。

尝试1:

如果直接的调用DataFrame的to_excel()方法,如下:

1
2
3
4
d1=pd.DataFrame({"name":['zhang3']})
d2=pd.DataFrame({"name":['li4']})
d1.to_excel("test.xlsx", sheet_name="sheet1")
d2.to_excel("test.xlsx", sheet_name="sheet1")

运行上述代码后,可以发现d2的数据会覆盖掉d1的数据,没有达到追加写的效果,只有覆盖写的效果。

尝试2:

1
2
3
4
5
6
7
writer=pd.ExcelWriter('test.xlsx', engine='openpyxl')
d1.to_excel(writer, sheet_name="sheet1")
writer.save()
writer=pd.ExcelWriter('test.xlsx', engine='openpyxl', mode='a')
d2.to_excel(writer, sheet_name="sheet1")
writer.save()
writer.close()

运行上述代码后,可发现虽然指定sheet_name为”sheet1”,但是test.xlsx可发现两个df并没有写入到sheet1,而是一个写入test.xlsx的sheet1,另一个写入到test.xlsx的sheet11,没有达到目的。

尝试3:

利用如下的append_df_to_excel函数,基于该函数的代码:

1
2
3
    append_df_to_excel('updatewriter.xlsx', d1, sheet_name='sheet1')

    append_df_to_excel('updatewriter.xlsx', d2, sheet_name='sheet1')

运行上述代码,发现d1和d2的数据都写入到test.xlsx的sheet1表格中,具体的实现参考append_df_to_excel的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def append_df_to_excel(filename, df, sheet_name='Sheet1', startrow=None,
                       truncate_sheet=False,
                       **to_excel_kwargs):
    if not os.path.isfile(filename):
        df.to_excel(
            filename,
            sheet_name=sheet_name,
            startrow=startrow if startrow is not None else 0,
            **to_excel_kwargs)
        return
    # ignore \[engine\] parameter if it was passed

    if 'engine' in to_excel_kwargs:
        to_excel_kwargs.pop('engine')

    writer = pd.ExcelWriter(filename, engine='openpyxl', mode='a')
    # try to open an existing workbook
    writer.book = load_workbook(filename)

    # get the last row in the existing Excel sheet
    # if it was not specified explicitly
    if startrow is None and sheet_name in writer.book.sheetnames:
        startrow = writer.book[sheet_name].max_row

    # truncate sheet
    if truncate_sheet and sheet_name in writer.book.sheetnames:
        # index of \[sheet\_name\] sheet
        idx = writer.book.sheetnames.index(sheet_name)

        # remove \[sheet\_name\]
        writer.book.remove(writer.book.worksheets[idx])

        # create an empty sheet \[sheet\_name\] using old index
        writer.book.create_sheet(sheet_name, idx)

    # copy existing sheets
    writer.sheets = {ws.title: ws for ws in writer.book.worksheets}
    if startrow is None:
        startrow = 0

    # write out the new sheet
    df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)

    # save the workbook
    writer.save()
    writer.close()

appendappend_df_to_excel函数源代码下载