Я пытаюсь автоматизировать генерацию некоторых отчетов. Моим первым подходом было прочитать файл csv с обновленными данными, а затем с помощью панд сгенерировать весь Excel с помощью сводных таблиц.
Это была не лучшая идея из-за сложности отчетов, поэтому я решил, что буду использовать базовый шаблон и помещать обработанные данные в лист в новый файл на основе шаблона. Этот подход работал хорошо, за исключением того, что он требует слишком много ресурсов (оперативной памяти и времени), но до сегодняшнего дня, когда я получил «ошибку памяти», это не было проблемой.
После поиска решения я обнаружил объем данных, которые я выгружал, и сам шаблон был основной причиной проблемы.
Вот упрощенный подход к тому, что я сейчас делаю:
# Load the data
data = pd.read_csv(data_path)
# Do some processing to agregate data
processed_data = process_data(data)
# Open the template
wb = load_workbook(template_path, keep_vba=True)
# Copy to the template the processed data
processed_data_rows = dataframe_to_rows(processed_data, index=False)
ws = self.wb['data']
for r_idx, row in enumerate(processed_data_rows, 1):
for c_idx, value in enumerate(row, 1):
if value is None:
ws.cell(row=r_idx, column=c_idx, value='')
else:
ws.cell(row=r_idx, column=c_idx, value=value)
# Save the data to the new file
wb.save(path)
В своем поиске я обнаружил, что могу использовать некоторые оптимизации чтения / записи с read_only и write_only, но не смог найти способ скопировать листы из загруженного шаблона в отчет Excel, который я создаю в новом файле .
Есть идеи, как решить эту проблему?
PS: загруженный CSV - это около 30 тыс. Строк и 140 столбцов.
Редактировать: Размер выходного файла составляет около 12 МБ (даже близко к 1,80 ~ 2,3 ГБ, который использует скрипт)