Поврежденная книга при написании с помощью openpyxl в pandas

#python #excel #pandas #dataframe #openpyxl

Вопрос:

Я написал ниже код для записи в рабочую книгу с использованием панд. Идея состоит в том, чтобы добавить новый лист в книгу, если он с таким же именем уже существует, в противном случае создайте новую книгу.

 import pandas as pd
from pathlib import Path
from openpyxl import load_workbook

xls = pd.ExcelFile("test.xlsx")
df = pd.read_excel(xls, "Sheet1")

op_name = "op.xlsx"
my_file = Path(op_name)
if my_file.exists():
    book = load_workbook(my_file)
    writer = pd.ExcelWriter(op_name, engine='openpyxl', mode='a')
    writer.book = book
    df.to_excel(writer, sheet_name="r2")
else:
    writer = pd.ExcelWriter(op_name, engine='openpyxl')
    df.to_excel(writer, sheet_name="r1")
writer.save()
writer.close()
 

Однако при открытии выходной книги я получаю следующую ошибку:

Мы обнаружили проблему с некоторым контентом в ‘op.xlsx». Вы хотите, чтобы мы постарались восстановить как можно больше?

Я перепробовал несколько вариантов этого кода, но ничего не помогло. Любые предложения о том, как решить эту проблему, будут высоко оценены.

Комментарии:

1. без воспроизводимого примера вам будет трудно помочь

2. @Roim Ошибку можно воспроизвести, запустив код, опубликованный в моем посте

3. с любым файлом excel? или это зависит от test.xlsx?

4. Вы можете использовать любой файл Excel. Мой тестовый файл состоит из двух строк и двух столбцов, остальное все пусто

5. Голосовать против, потому что это невозможно воспроизвести. Предоставьте xlsx, с которым у вас возникли проблемы.

Ответ №1:

Привет, какую версию pandas вы использовали, если версия pandas >= 1.2 эта ошибка произошла, как указано в этом отчете об ошибке в >GitHub. Снизьте версию pandas до 1.1.5 или, если вы особенно используете эту более новую версию, пожалуйста, отредактируйте файл библиотеки python, как показано ниже.

в pandas/io/excel/_openpyxl.py добавьте следующие строки

 self.handles.handle.seek(0)
self.handles.handle.truncate()
 

ниже этой строки

 self.book = load_workbook(self.handles.handle)
 

Это исправление предназначено только для библиотек pandas >= 1.2.

Ответ №2:

op_name это только имя файла. my_file переменная имела путь к файлу. ExcelWriter() принимает параметр пути к файлу, а не имя файла.

Попробуй writer = pd.ExcelWriter(my_file, engine='openpyxl', mode='a')