Сохранение Pandas DataFrames с формулами в файлы xlsx

В Pandas DataFrame у меня есть несколько «ячеек» со значениями, а некоторые должны содержать формулы Excel. Я читал, что я могу получить формулы с

link = 'HYPERLINK("#Groups!A' + str(someInt) + '"; "LINKTEXT")'
xlwt.Formula(link)

и сохранить их в кадре данных.

Когда я пытаюсь сохранить свой фрейм данных в виде файла xlsx с помощью

writer = pd.ExcelWriter("pandas" + str(fileCounter) + ".xlsx", engine = "xlsxwriter")
df.to_excel(writer, sheet_name = "Paths", index = False)
# insert more sheets here
writer.save()

я получаю сообщение об ошибке:

TypeError: Unsupported type <class 'xlwt.ExcelFormula.Formula'> in write()

Итак, я попытался записать свою формулу в виде строки в свой фрейм данных, но Excel хочет восстановить содержимое файла, а затем заполняет все ячейки формулы 0.

Редактировать: мне удалось заставить его работать с обычными строками, но, тем не менее, было бы интересно найти решение для формул xlwt.

Итак, мой вопрос: как сохранить кадры данных с формулами в файлы xlsx?


person Samuel Blickle    schedule 15.07.2018    source источник
comment
@Parfait Я хочу добавить гиперссылки на другие ячейки в df.   -  person Samuel Blickle    schedule 15.07.2018
comment
добавлен пример содержимого формулы.   -  person Samuel Blickle    schedule 15.07.2018


Ответы (2)


После написания df с использованием table.to_excel(writer, sheet_name=...) я использую write_formula(), как в этом примере (отредактировано, чтобы добавить полный цикл). Чтобы написать все формулы в вашем фрейме данных, прочитайте каждую формулу в вашем фрейме данных.

 # replace the right side below with reading the formula from your dataframe
 # e.g., formula_to_write = df.loc(...)`

 rows = table.shape[0]
 for row_num in range(1 + startrow, rows + startrow + 1):
    formula_to_write = '=I{} * (1 - AM{})'.format(row_num+1, row_num+1) 
    worksheet.write_formula(row_num, col, formula_to_write)`

Позже в коде (кажется, один из них может быть избыточным, но я его не искал): writer.save() workbook.close()

Документация находится здесь.

person David Gaertner    schedule 15.07.2018

Поскольку вы используете xlsxwriter, строки по умолчанию анализируются как формулы ("strings_to_formulas: Enable the worksheet.write() для преобразования строк в формулы. Значение по умолчанию — True"), поэтому вы можете просто указать формулы как строки в вашем фрейме данных.

Пример столбца формулы, который ссылается на другие столбцы в вашем фрейме данных:

d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
writer = pd.ExcelWriter("foo.xlsx", engine="xlsxwriter")
df["product"] = None
df["product"] = (
    '=INDIRECT("R[0]C[%s]", 0)+INDIRECT("R[0]C[%s]", 0)'
    % (
        df.columns.get_loc("col1") - df.columns.get_loc("product"),
        df.columns.get_loc("col2") - df.columns.get_loc("product"),
    )
)
df.to_excel(writer, index=False)
writer.save()

Производит следующий вывод:

Пример вывода в LibreOffice

person Motin    schedule 23.09.2019