Openpyxl:将上一张表删除的现有工作簿写入

问题描述 投票:0回答:2

我正在开发一个写入现有 .xlsx 文件的函数。 我的环境是: 赢10 Win32 上的 Python 3.10.9(标签/v3.10.9:1dd9be6,2022 年 12 月 6 日,20:01:21)[MSC v.1934 64 位 (AMD64)] openpyxl 3.1.2 熊猫 2.0.0 当我试图写一张新纸时,之前的纸消失了

你能帮我看看哪里出了问题吗? 谢谢

import pandas as pd
from openpyxl import load_workbook, Workbook


def write_resolution(df, file_name, sheet_name):
    if os.path.isfile(file_name):
        workbook = load_workbook(file_name)
    else:
        workbook = Workbook()      
    writer = pd.ExcelWriter(file_name, engine='openpyxl')
    writer.workbook  = workbook

    if sheet_name in workbook.sheetnames:
        del workbook[sheet_name]
    
    worksheet = workbook.create_sheet(sheet_name,-1)         
    worksheet=workbook.active
    df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    workbook.save(file_name)
    writer.close()

我在下面试过:

  1. 一开始没有文件,我写到sheet1,成功
  2. 然后我写到sheet2。 sheet2成功了,sheet1却不见了
python-3.x openpyxl
2个回答
0
投票

问题似乎与 worksheet=workbook.active 行有关。此行将活动工作表设置为您刚刚创建的工作表,因此当您保存工作簿时,只会保存您刚刚创建的工作表。

要解决此问题,您可以删除该行并将活动工作表明确设置为您在写入数据之前刚刚创建的工作表。这是修改后的代码:

import os
import pandas as pd
from openpyxl import load_workbook, Workbook


def write_resolution(df, file_name, sheet_name):
    if os.path.isfile(file_name):
        workbook = load_workbook(file_name)
    else:
        workbook = Workbook()      
    writer = pd.ExcelWriter(file_name, engine='openpyxl')
    writer.book  = workbook

    if sheet_name in workbook.sheetnames:
        del workbook[sheet_name]
    
    worksheet = workbook.create_sheet(sheet_name,-1)
    workbook.active = worksheet  # set the active sheet to the sheet you just created
    df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    workbook.save(file_name)
    writer.close()

在这里,我们将活动工作表设置为我们刚刚使用

workbook.active = worksheet
创建的工作表。这样可以确保在您调用
workbook.save(file_name)
.

时保存两张表

希望对您有所帮助!如果您还有其他问题,请告诉我。


0
投票

似乎会有很多打开和关闭文件 应该只需要创建一个

writer
并将每个数据帧写入其
sheet name
.
如果 excel 文件不存在,则使用
ExcelWriter
将由
mode='w'
创建。如果它确实存在,那么它将被附加到使用
mode='a'
所以再次使用不同的工作表名称运行代码会将这些工作表添加到现有工作簿中。

import os
import pandas as pd

### Example dataframes row and column write
df_list = [[[1, 2, 3, 4, 5]], [6, 7, 8, 9, 0], ['a', 'b', 'c', 'd']]
### Excel file name
file_name = 'df_file.xlsx'

### Set to ExcelWriter mode based on the existance of the Excel file
if not os.path.isfile(file_name):
    mode = 'w'
else:
    mode = 'a'

### Create writer and write each dataframe to it's own sheet
### Since this is a context manager no need to close/save the writer
with pd.ExcelWriter(file_name, mode=mode) as writer:
    for enum, d in enumerate(df_list, 10):
        df = pd.DataFrame(d)
        df.to_excel(writer, sheet_name=f'Sheet{enum}', index=False, header=False)
© www.soinside.com 2019 - 2024. All rights reserved.