0

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

当我通过 for() 或 Foreach() 获取 Cells[,].value 时。所以我认为在Calculate() & get 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(?)
}

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

4

1 回答 1

0

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

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

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 方法,因为您已经在单元格中有所需的值。
当您需要更新、重新计算电子表格中的公式时,您应该调用Calculate 方法,例如在您添加或修改某些单元格值之后。

最后,关于您的问题,很难理解,但是:

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

  • 或者你们知道预计算功能或获得更多速度?
    我不知道“预计算函数”是什么意思,关于速度,请参考这个答案的第一部分。

于 2018-05-11T10:21:13.670 回答