Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Excel互操作公式_.net_F#_Excel Interop - Fatal编程技术网

.net Excel互操作公式

.net Excel互操作公式,.net,f#,excel-interop,.net,F#,Excel Interop,我正在使用F#和Excel Interop将数据输出到Excel电子表格。我的第一种方法是单独设置每个单元格: worksheet.Range(range1).Value2 <- "=sum(a1:a10)" worksheet.Range(range2).Value2 <- "=min(a1:a10)" worksheet.Range(range3).Value2 <- "=max(a1:a10)" (* etc *) 但我也遇到了同样的问题:Excel将它们呈现为字符串,

我正在使用F#和Excel Interop将数据输出到Excel电子表格。我的第一种方法是单独设置每个单元格:

worksheet.Range(range1).Value2 <- "=sum(a1:a10)"
worksheet.Range(range2).Value2 <- "=min(a1:a10)"
worksheet.Range(range3).Value2 <- "=max(a1:a10)"
(* etc *)

但我也遇到了同样的问题:Excel将它们呈现为字符串,而不是计算公式。

丹尼尔的答案应该可行,但我发现使用R1C1格式的公式更容易。要使用它,您的代码应该如下所示:

ws.Range(range).FormulaR1C1 <- [| "=sum(R1C1:R10C1)";
                                  "=min(R1C1:R10C1)"; 
                                  "=max(R1C1:R10C1)" |]
然后将其放入公式1c1中:

ws.Range(range).FormulaR1C1 <- formulas

ws.Range(Range).FormulaR1C1假设您的第一种方法有效,您所说的“慢”是指输入(不执行)太慢,那么更新一组这样的单元格可能会更快/更容易

[
范围1,“=总和(a1:a10)”
范围2,“=min(a1:a10)”
范围3,“=最大值(a1:a10)”
...
]

> List.ITER(Fun(Real,Value)-> WorkLabe.Lead(Real.)Value2

如果你不能在Excel中解决你的性能问题,你可能要考虑SpreadsheetGear(http://www.spreadsheetgear.com/)。它几乎复制了整个Excel API,但速度更快。(另一个优点是,如果您正在开发要在服务器上运行的东西,则不必在服务器上安装Excel。)

或者,您可以从fsnip.net上的这个代码片段中获得一些想法,它为Excel实现了一些更高阶的功能。(与使用电子表格相比,这是一个较长的性能测试,尽管这段代码实际上与性能无关。)

您是否尝试过
“=sum($a$1:$a$10)”
?是的,我尝试过,但没有成功。(OP更新)不,它实际上执行起来太慢了。如果一次给Excel一大块数据,而不是一个单元格一个单元格地给它,那么它的效率会更高。不过,这是一个更简洁的好方法。是的,我认为你说的对,ArrayFormula是用于数组公式的。你能解释一下
R2C[0]是什么吗
语法正在执行?我的示例将为标题中的每个单元格插入公式和(currentColumn$2:currentColumn$10)。R2C[0]表示第2行,从当前单元格列(当前列)偏移0的列。以这种方式插入公式比在标题中的每个单元格中循环并为当前列生成和插入公式要快得多。好的,这种表示法是有意义的。但是,我尝试了这种方法,但仍然不适用于我。(OP更新。)也许我做错了?是的,我发现我在做二维数组时会犯这个错误。解决方法是使用数组2D。重要的一步是向上转换到
obj
。一旦你这样做,你甚至可以将公式放入
Value2
,它工作得很好。
worksheet.Range(range).FormulaArray <- [| "=sum(a1:a10)"
                                          "=min(a1:a10)"
                                          "=max(a1:a10)" |]
worksheet.Range(range).FormulaR1C1 <- [| "=sum(R2C[0]:R4C[0])"
                                          "=average(R2C[0]:R4C[0])"
                                          "=min(R2C[0]:R4C[0])"
                                          "=max(R2C[0]:R4C[0])" |]
ws.Range(range).FormulaR1C1 <- [| "=sum(R1C1:R10C1)";
                                  "=min(R1C1:R10C1)"; 
                                  "=max(R1C1:R10C1)" |]
let formulas : obj[] = [| "=sum(R1C1:R10C1)";
                          "=min(R1C1:R10C1)"; 
                          "=max(R1C1:R10C1)" |]
ws.Range(range).FormulaR1C1 <- formulas