我正在用ASP.NETMVC创建一个ExcelElectron 表格.

当我设置具有范围的公式时

cell.Formula = "=SUM(FLOOR(I2:I12/2,0.01))";  

Excel在该范围前添加@

=SUM(FLOOR(@I2:I13/2,0.01))

Excel无法计算此公式,它显示为#VALUE!

我怎么能在没有得到@符号的情况下设置这个公式呢?

推荐答案

我无法访问您正在使用的Excel版本(2013),但以下是我对您所看到的问题的理解.如果你只是说FLOOR(I2:I13/2,0.01),那么预期的行为是模棱两可的:

  • 较早版本的Excel会将其视为"隐式交集",并假定它取单元格in the same row as the current cell的值的下限,在I2:I13的范围内.
  • 较新版本的Excel将在当前单元格下面的单元格中创建一个"dynamic array", causing the formula to "spill over",从I2:I13开始 for each 单元格创建一个楼层单元格.

当Excel添加对动态数组的支持时,他们更改了公式语言以消除两种行为的歧义:

Excel升级后的公式语言与旧语言几乎相同,只是它使用@运算符来指示可能发生隐式交集的位置,而旧语言则以静默方式执行此操作.因此,在动态数组Excel.It's important to note that your formulas will continue to calculate the same way they always have中打开时,您可能会注意到@‘S出现在一些公式中.

https://support.microsoft.com/en-au/office/implicit-intersection-operator-ce3be07b-0101-4450-a24e-c1c999be2b34

如果在新版本的Excel中打开较旧的Excel文件,您将看到他们在范围前添加了一个@符号,以表明它使用隐式交集行为--@符号告诉新版本的Excel使用与旧版本相同的行为.因此,我可以使用FLOOR(@I2:I13/2,0.01)来模拟旧的Excel行为:

  • 如果我把它放在从213的一行上,这将给出第I列中的值在该行的下限.
  • 如果我把它放在任何其他行上,当前行超出范围,我将得到#VALUE!.

suspect(但无法测试),保存文件与公式中的@仍然会留下文件向后兼容的旧版本,因为它应该使用预先存在的行为.

现在,如果我使用公式SUM(FLOOR(@I2:I13/2,0.01)),它不会给出从I2I3的所有楼层的总和:它给出的是与当前单元格相同行的single cell层的总和.因为只有一个单元格,所以总和等于该单元格的FLOOR(@I2:I13/2,0.01).由于这模仿了旧版本的Excel的行为,我猜这就是为什么您会看到#VALUE!的结果:您的单元格在2到13的范围之外的行中.

换句话说,我认为你看到的是你试图使用的公式的自然结果,即使你在Excel 2013中手动将原始公式输入到该单元格中,你也会看到同样的行为.

另一方面,SUMPRODUCT function意味着要在数组上执行操作,我认为这是您想要的工作方式.如果您使用SUMPRODUCT(FLOOR(I2:I13/2,0.01)),这应该不会触发隐式交集,因此它不会添加@符号,您应该得到给定范围内所有单元格的楼层总和.SUMPRODUCT可以追溯到Excel2007.

Csharp相关问答推荐

FromServices不使用WebAppliationFactory程序>

数组被内部函数租用时,如何将数组返回给ArrayPool?

C#中使用BouncyCastle计算CMac

Microsoft. VisualBasic. FileIO. FileSystem. MoveFile()对话框有错误?

在发布表单时绑定包含附加(嵌套)列表的对象列表的正确语法是什么

如何注册实现同一接口的多个服务并注入到控制器构造函数中

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

在.NET核心项目中创建Startup.cs比在Program.cs中注册服务好吗?

Rx.Net窗口内部可观测数据提前完成

C#-VS2022:全局使用和保存时的代码清理

自定义列表按字符串的部分排序

有条件地定义预处理器指令常量

为什么我的用户界面对象移动到略低于实际目标?

如何使用EPPlus C#在单个单元格中可视化显示多行文字

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

使用未赋值的、传递的局部变量

Maui:更改代码中的绑定字符串不会更新UI,除非重新生成字符串(MVVM)

如何正确地在VB中初始化类?

从MudAutoComplete打开对话框,列表仍然可见

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序