openpyxl блокирует файл excel после первого чтения

#python #openpyxl

#питон #openpyxl

Вопрос:

Я пытаюсь перезаписать значение в данной ячейке с помощью openpyxl. У меня есть два листа. Один из них называется Raw, он заполняется вызовами API. Во-вторых, это данные, которые поступают с необработанного листа. Два листа имеют совершенно одинаковую форму (столбцы/строки). Я провожу сравнение этих двух, чтобы увидеть, есть ли в Raw задание bay. Если есть — перенесите его в технический паспорт. Если и в необработанных, и в данных отсутствует значение в этом столбце — затем запустите сложный алгоритм (не относящийся к данному вопросу), чтобы назначить номер отсека на основе логики. У меня возникли проблемы с переписыванием Excel с использованием openpyxl.

Вот пример моего кода.

 data_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayData')  raw_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayRaw') no_bay_res = data_df[data_df['Bay assignment'].isnull()].reset_index() #grab rows where there is no bay assignment in a specific column  book = load_workbook("Algo Build v23test.xlsx")  sheet = book["MondayData"]  for index, reservation in no_bay_res.iterrows():  idx = int(reservation['index'])  if pd.isna(raw_df.iloc[idx, 13]):  continue  else:  value = raw_df.iat[idx,13]  data_df.iloc[idx, 13] = value  sheet.cell(idx 2, 14).value = int(value)    book.save("Algo Build v23test.xlsx")  book.close() print(value) #302  

Теперь проблема в том, что кажется, что book.close() не работает. Книга по-прежнему доступна для вызова на python. Теперь он полностью перезаписывает Excel. Однако, если я попытаюсь запустить эти две строки снова

 data_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayData')  raw_df = pd.read_excel('Algo Build v23test.xlsx', sheet_name='MondayRaw')  

Я получаю наборы данных, полные нулевых значений, за исключением значения, которое было заменено. (прикрепил изображение). введите описание изображения здесь Однако, если я открою этот файл Excel вручную из папки и сохраню его (CTRL S) и попробую запустить код еще раз — он будет работать правильно. Самая странная проблема. Мне нужно зациклить приведенный выше код на понедельник-воскресенье, поэтому мне нужно, чтобы он мог снова прочитать данные без повторного сохранения файла вручную.

Ответ №1:

По какой-то причине pandas будет читать все формулы как NaN после того, как файл был использован в скрипте openpyxl, пока файл не будет открыт, сохранен и закрыт. Вот код, который помогает сделать это в сценарии. Однако это происходит довольно медленно.

 import xlwings as xl  def df_from_excel(path, sheet_name):  app = xl.App(visible=False)  book = app.books.open(path)  book.save()  app.kill()  return pd.read_excel(path, sheet_name)