Файл Excel поврежден после заполнения данных с помощью panda

#python #excel #pandas #openpyxl #xlsm

Вопрос:

Итак, очевидно, что это очень простая задача, но по какой-то причине это доставляет мне проблемы.

Вот код:

     marcacoes = pd.read_excel(file_loc, sheet_name="MONITORAMENTO", index_col=None, na_values=['NA'], usecols ="AN")
    x=0
    while x < len(statusclientes):
        if (statusclientes.iloc[x][0] == "Offline"):
            p=marcacoes.iloc[x][0]
            p=p 1
            marcacoes.iat[x,0]= p
            tel_off.append(telclientes.iloc[x][0])
        if (statusclientes.iloc[x][0] == "Indefinido"):
            tel_off.append(telclientes.iloc[x][0])
        x=x 1
    y=0
    with pd.ExcelWriter(file_loc,mode='a',if_sheet_exists='replace') as writer:  
        marcacoes.to_excel(writer, sheet_name='MONITORAMENTO',startcol=37,startrow=5)
        writer.save()
 

Но проблема в том, что:

 with pd.ExcelWriter(file_loc,mode='a',if_sheet_exists='replace') as writer:  
        marcacoes.to_excel(writer, sheet_name='MONITORAMENTO',startcol=37,startrow=5)
        writer.save()
 

Так как код прекрасно работает и без него.
Эти конкретные строки должны сбрасывать фрейм данных «marcacoes» в существующий файл excel, заменяя другой существующий столбец в файле, но всякий раз, когда я запускаю этот код, существующий файл excel повреждается.

Я почти уверен, что здесь мне не хватает некоторых основных принципов работы с пандами, но я не могу найти, где в документации рассматривается эта проблема.

Редактировать:

Я попробовал следующий код:

 wb = openpyxl.load_workbook(file_loc)
        ws = wb['MONITORAMENTO']
        startcol = 37
        startrow = 5
        k=0
        while k < len(marcacoes):
            ws.cell(startrow, startcol).value = marcacoes.iloc[k][0]
            startrow  =1
            k =1
wb.save(file_loc)
 

но происходит то же самое, теперь это вызвано строкой «wb.save(file_loc)».

Ответ №1:

Вы могли бы попробовать использовать openpyxl как таковой:

 from openpyxl import load_workbook

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

marcacoes.to_excel(writer, sheet_name='MONITORAMENTO', startcol=37, startrow=5)
writer.save()
 

Я использовал этот подход пару раз, и в целом он дает хорошие результаты.

Также убедитесь, что ваш начальный файл не поврежден. Ошибка повреждения также может быть вызвана изображениями, сводными таблицами, проверкой данных или внешними подключениями.

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

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

2. Не могли бы вы предоставить рабочие листы с некоторыми образцами данных?

3. Я вроде как догадался ! Вы были правы, порча вызвана чем — то на простынях. Я попробовал образец с теми же данными и форматом, но без изображений и т. Д., И это сработало

4. Проблема сейчас в том, что я не могу определить, что является причиной коррупции

5. Я постараюсь опубликовать образец, но данные немного конфиденциальны

Ответ №2:

Ладно, я все понял.

Фактическая проблема возникла из-за загрузки рабочей книги. в документации говорится, что если вы хотите загрузить xlsm-файлы с макросами, вы должны указать в аргументе функции.

 wb = load_workbook(filename=file_loc, read_only=False, keep_vba=True)
 

Теперь он будет экономить правильно, не развращая.