【问题标题】:How to prevent Excel/XlsxWriter randomly adding @ character in my formulas如何防止 Excel/XlsxWriter 在我的公式中随机添加 @ 字符
【发布时间】:2022-03-12 04:27:05
【问题描述】:

上下文

我使用 将一些数据从 代码写入 xlsx 文件。
我需要使用计算特定列(包含时间值)平均值的公式填充单元格。

问题描述

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

不得不像这样手动修复我的公式真的很烦人,因为我有很多类似的平均计算因此而被破坏。
我读到是 Excel 添加了它,所以似乎无法通过 xlsxwriter API 以编程方式从我的 python 代码中防止这种不良行为。

问题

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

到目前为止我已经尝试过什么

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


示例

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

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

=AVERAGE(TIMEVALUE(B2:B8))

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

=AVERAGE(TIMEVALUE(@B2:B8))

这使得计算的结果变成:

#VALUE!

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

【问题讨论】:

  • @BigBen 是的,我已经找到了那种答案,但它在 VBA 中。
  • @Fareanor @ 是隐式交集运算符。 BigBen 的观点是,您的问题的解决方案是写信给.Formula2 而不是.Formula。如果 xlswriter (还)不支持,那是 xlswriter 的失败,而不是 Excel。

标签: xlsxwriter python python excel xlsxwriter


【解决方案1】:

一般来说,如果 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 中提供以下输出(请注意,它不再具有 @ 或数组公式大括号 {}):

【讨论】:

  • 感谢您的回答。 write_array_formula() 不接受单个单元格(在您的示例中为 A1),而是接受一个范围(输入参数)。奇怪的是你的例子有效(它不适合我)。也许是因为我使用的是行列版本。无论如何,我尝试按照您的建议在我的公式周围添加括号 {},它似乎有效!
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2014-06-13
  • 1970-01-01
  • 2019-01-29
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多