我如何计算 Worksheet.Calculate() 之后的值?

how can i calculated values after Worksheet.Calculate()?

我尝试了 Gembox.SpreadSheet 的试用版。

当我通过 for() 或 Foreach() 获取 Cells[].value 时。 所以我认为在 Calculate() 和获取 Cell[].value 之后,但这种方式也需要相同的时间。 当我获取 Cell[].value.

时需要重新计算
workSheet.Calcuate(); <- after this, values are Calculated, am i right?
for( int i =0; i <worksheet.GetUsedCellRange(true).LastRowIndex+1;++i)
{
    ~~~~for Iteration~~~
     var value =  workSheet.Cells[i,j].Value; <- re-Calcuate value(?)
}

所以这是一个问题。 我可以获得计算值吗?或者你们知道预计算功能或获得更多速度?

很抱歉,我不确定你到底在问什么,你能否尝试重新表述你的问题以便更容易理解?

不过,这里有一些信息,我希望你会觉得有用。
要遍历所有单元格,您应该使用以下方法之一:

1.

foreach (ExcelRow row in workSheet.Rows)
{
    foreach (ExcelCell cell in row.AllocatedCells)
    {
        var value =  cell.Value;
        // ...
    }
}

2.

for (CellRangeEnumerator enumerator = workSheet.Cells.GetReadEnumerator(); enumerator.MoveNext(); )
{
    ExcelCell cell = enumerator.Current;
    var value = cell.Value;
    // ...
}

3.

for (int r = 0, rCount = workSheet.Rows.Count; r < rCount; ++r)
{
    for (int c = 0, cCount = workSheet.CalculateMaxUsedColumns(); c < cCount; ++c)
    {
        var value = workSheet.Cells[r, c].Value;
        // ...
    }
}

我相信他们都会有差不多的表现。
但是,根据电子表格的内容,最后一个可能会慢一些。这是因为它不会只遍历分配的单元格。

例如,假设您有一个包含 2 行的电子表格。第一行是空的,没有数据,第二行有 3 个单元格。现在,如果您使用 1. 或 2. 方法,那么您将仅遍历第二行中的那 3 个单元格,但如果您使用 3. 方法,那么您将遍历第一行中的 3 个单元格(以前未分配,现在它们是因为我们访问了它们)然后通过第二行中的 3 个单元格。

现在关于计算,请注意,当您使用某些 Excel 应用程序保存文件时,它会在其中保存最后计算的公式值。在这种情况下,您不必调用 Calculate 方法,因为单元格中已有所需的值。
当您需要更新、重新计算电子表格中的公式时,您应该调用计算方法,例如在您添加或修改了一些单元格值之后。

最后,关于你的问题,虽然很难理解,但是:

  • 我可以得到计算值吗?
    是的,那行代码 var value = workSheet.Cells[i,j].Value; 应该给你计算值,因为你在它之前使用了 Calculate 方法。但是,如果 GemBox.Spreadsheet 的计算引擎目前不支持您的公式,那么它将无法计算该值。您可以找到当前支持的 Excel 公式函数列表 here.

  • 或者你们知道预计算功能或获得更多速度?
    我不知道 "pre-Calculate function" 是什么意思,为了速度请参考这个答案的第一部分。