如何防止 Excel/XlsxWriter 在我的公式中随机添加 @ 字符

How to prevent Excel/XlsxWriter randomly adding @ character in my formulas

上下文

我使用 to write some data into an xlsx file from a 代码。
我需要用计算特定列(包含时间值)的平均值的公式填充单元格。

问题描述

我注意到当我尝试使用 Excel 打开我的文档时,它会自动在我的范围之前添加一个“@”符号,这使得我的公式计算失败...
如果我手动删除这个额外的“@”,该公式将按预期完美运行。

像这样手动修复我的公式真的很烦人,因为我有很多类似的平均计算因此而被破坏。
我读到是 Excel 添加了它,因此似乎无法通过我的 python 代码和 xlsxwriter API.

以编程方式防止这种不良行为

问题

有人知道是否有办法阻止 Excel 对我的公式进行任何修改吗?

到目前为止我尝试了什么

我已经尝试 "protect" 我的所有工作表(将它们设为只读),但它似乎只适用于用户,不适用于 Excel...


例子

这是我的问题的一个例子(为了让这些纯文本负载更容易理解)。

从我的python代码中,如果我写下下面的公式:

=AVERAGE(TIMEVALUE(B2:B8))

打开文档后,Excel自动更改公式为:

=AVERAGE(TIMEVALUE(@B2:B8))

使得计算结果变为:

#VALUE!

如果我通过手动恢复我的公式(手动编辑单元格并删除“@”)撤消 Excel 所做的操作,我将得到我预期的所需计算平均值。

一般情况下如果Excel在XlsxWriter写的公式中插入一个@就说明这个公式是数组公式,应该写成worksheet.write_array_formula()(虽然有一些注意事项,见下文)。

因此,使用您的示例的变体:

import xlsxwriter

workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet()

worksheet.write_array_formula('A1', '=AVERAGE(TIMEVALUE(B1:B6))')

worksheet.write_column('B1', ['2:30'] * 6)

workbook.close()

输出:

但是,Excel 的最新版本引入了动态公式和动态数组。我认为您在这里看到的是 Implicit intersection operator: @我目前正在努力支持 XlsxWriter 中的动态公式和数组,但仍在调查中

更新

从 2021 年 5 月发布的 1.4.1 版开始,XlsxWriter 支持 dynamic arrays 因此可以将上面的示例更改为使用 write_dynamic_array_formula(),如下所示:

worksheet.write_dynamic_array_formula('A1', '=AVERAGE(TIMEVALUE(B1:B6))')

这将在 Excel 365 中给出以下输出(请注意,它不再具有 @ 或数组公式大括号 {}):