#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)