将 Pandas 个带公式的 DataFrame 保存到 xlsx 文件
Save Pandas DataFrames with formulas to xlsx files
在 Pandas DataFrame 中,我有一些 "cells" 带有值,一些需要包含 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 文件?
在使用 table.to_excel(writer, sheet_name=...)
编写 df 后,我使用 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()
文档是 here。
由于您使用的是 xlsxwriter,因此默认情况下会将字符串解析为公式 ("strings_to_formulas: Enable the worksheet.write() method to convert strings to formulas. The default is 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()
产生以下输出:
- 您需要照常保存,请记住将公式写成字符串。
- 您也可以将 f 字符串与变量一起使用。
writer = pd.ExcelWriter(FILE_PATH ,mode='a', if_sheet_exists='overlay')
col_Q_index = 3
best_formula = f'=max(L1,N98,Q{col_Q_index})'
formula_df = pd.DataFrame([[best_formula]])
formula_df.to_excel(writer, sheet_name=SHEET_NAME, startrow=i, startcol=17, index=False, header=False)
writer.save()
在 Pandas DataFrame 中,我有一些 "cells" 带有值,一些需要包含 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 文件?
在使用 table.to_excel(writer, sheet_name=...)
编写 df 后,我使用 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()
文档是 here。
由于您使用的是 xlsxwriter,因此默认情况下会将字符串解析为公式 ("strings_to_formulas: Enable the worksheet.write() method to convert strings to formulas. The default is 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()
产生以下输出:
- 您需要照常保存,请记住将公式写成字符串。
- 您也可以将 f 字符串与变量一起使用。
writer = pd.ExcelWriter(FILE_PATH ,mode='a', if_sheet_exists='overlay')
col_Q_index = 3
best_formula = f'=max(L1,N98,Q{col_Q_index})'
formula_df = pd.DataFrame([[best_formula]])
formula_df.to_excel(writer, sheet_name=SHEET_NAME, startrow=i, startcol=17, index=False, header=False)
writer.save()