#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)
Теперь он будет экономить правильно, не развращая.