python - Pandas 编写的公式未评估并在 Office 365 中触发错误警告

标签 python excel pandas

我正在编写一个 excel 公式,用 pandas 0.25.0 从另一张表中引用一张表,但是当我打开 excel 文件时,它没有被正确评估。

如果我使用 LibreOffice 打开文件,单元格显示 Err:501,而在 Office 365 中,它表示文件中存在错误并尝试修复它,但修复后单元格为空。

公式没有错,因为如果我在 LibreOffice Calc 中编辑单元格,输入一个空格并将其删除,然后回车(回车),公式就会突然起作用。

我尝试将公式作为字符串直接写入单元格或数据框中,并使用 DataFrame.write_formula,但均无效。

这里是一个公式的例子:

='my data'.$E4*'my data'.B4

或者在 python 中定义:

cell_value = '=\'my data\'.$E4*\'my data\'.B4'

我制作了一个包含多个工作表的 excel 文件,如下所示:

excel_writer = pd.ExcelWriter(out_file_path, engine='xlsxwriter')
df_data.to_excel(excel_writer, sheet_name="my data")
df_formulas.to_excel(excel_writer, sheet_name="calculated data")

它是这样用 ExcelWriter 写入单元格的:

worksheet = excel_writer.sheets['calculated data']
worksheet.write_formula(cell_index, cell_value)

或者在编写 df_formulas 时简单地使用 df 保存公式的字符串。

两者的结果相同。

如果有人遇到过类似的问题,请帮忙。

最佳答案

公式需要采用美式语法(参见 XlsxWriter 文档中的 Working with Formulas)。在这种情况下,公式应该是(使用“!”而不是“。”):

cell_value = '=\'my data\'!$E4*\'my data\'!B4'

# Or changing quotes to make it clearer:

cell_value = "='my data'!$E4 * 'my data'!B4"

更新。这是一个工作示例:

import pandas as pd

df_data = pd.DataFrame([[10, 20, 30, 20, 15],
                        [10, 20, 30, 20, 15],
                        [10, 20, 30, 20, 15],
                        [10, 20, 30, 20, 15]])

df_formulas = pd.DataFrame()

excel_writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

df_data.to_excel(excel_writer, sheet_name="my data")
df_formulas.to_excel(excel_writer, sheet_name="calculated data")


cell_value = "='my data'!$E4 * 'my data'!B4"

worksheet = excel_writer.sheets['calculated data']
worksheet.write_formula(0, 0, cell_value)

excel_writer.save()

输出:

enter image description here

关于python - Pandas 编写的公式未评估并在 Office 365 中触发错误警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163760/

相关文章:

Excel - 根据相邻单元格值选择单元格

python - Pandas dataframe,如何在单行中设置多个列值?

python - 为什么 pandas apply lambda 比这里的循环慢?

python - 在 Python 中,如何通过标识符的绝对完全限定名称来引用标识符?

python - Pandas:使用合并单元格读取 Excel

python - 如何在不输入所有列名称的情况下使用 pyodbc 执行许多插入?

python - 仅保存 pandas df 中的非空条目值和列号,每行仅保存一个非空值

python - 尝试使用 kerberos 票证进行身份验证时出现 GSSException : No credential found for: 1. 2.840.113554.1.2.2

python - 根据列表中的每个第 n 个元素对字典进行排序

vba - Excel VBA - 比较同一列中的行