我正在使用SpreadsheetGear将工作表上的范围复制到另一个工作表的“输入”范围,并手动重新计算WorkbookSet。有没有办法在重新计算后轻松检查是否有任何公式或计算错误?
目标工作簿很复杂,有许多公式跨越依赖于复制的工作表,因此找到任何计算错误的简单全局方法会很有帮助。
答案 0 :(得分:1)
通过“错误”我假设您的意思是Excel公式错误值,例如#NUM!,#VALUE,#NAME?等?遗憾的是,在重新计算后,您无法检查以确定工作簿是否包含其中一个或多个属性。关于执行此操作的唯一方法是手动迭代工作簿中的任何相关单元格并检查ValueType of Error。对于大型复杂的工作簿,我理解这可能不可行。
无论如何,对于这种方法,如果可能的话,我最好的建议是将此错误检查限制在您感兴趣的较小范围或范围集。其次,您可以考虑使用“高性能”API SpreadsheetGear.Advanced。Cells命名空间为这个例程提供了更好的性能,而不是使用传统的IRange接口,这可能会慢一点。下面是一个演示此类方法的示例。您可以根据需要随意修改:
using SpreadsheetGear.Advanced.Cells;
...
private bool RangeContainsErrors(IRange range)
{
// We obtain a "high performance" IValues object by casting a worksheet
// to IValues.
IValues values = (IValues)range.Worksheet;
// Setup some indexes to help clarify and shorten the for loops.
int startRow = range.Row;
int startCol = range.Column;
int endRow = startRow + range.RowCount;
int endCol = startCol + range.ColumnCount;
// Loop through rows of desired range.
for (int row = startRow; row < endRow; row++)
{
// Now loop through columns of desired range.
for (int col = startCol; col < endCol; col++)
{
// Get an IValue object for this cell.
IValue val = values[row, col];
// Check to ensure this cell even as a value and if so, check
// for an Error value type.
if(val != null &&
val.Type == SpreadsheetGear.Advanced.Cells.ValueType.Error)
{
return true;
}
}
}
// If we made it this far there weren't any errors.
return false;
}
答案 1 :(得分:0)
我对这种转移有一些建议。
workbookSet.Calculation = SpreadsheetGear.Calculation.Manual;
并在需要workbookSet.Calculate();
IValue
的方式。从那里,您可以阅读Text
或Number
属性以读出正确的值类型SetText
或SetNumnber
。IValue
将为空!高级界面与常规界面不同,我还没有弄清楚如何按范围名称寻址单元格。看起来接口不允许这样做,您可以通过基于0的行列索引来索引单元格。