我如何计算 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" 是什么意思,为了速度请参考这个答案的第一部分。
我尝试了 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" 是什么意思,为了速度请参考这个答案的第一部分。