【发布时间】:2015-11-09 04:02:48
【问题描述】:
我正在使用 SpreadsheetGear 将工作表上的范围复制到另一个工作表的“输入”范围中,并手动重新计算 WorkbookSet。有没有办法在重新计算后轻松检查是否有任何公式或计算错误?
目标工作簿很复杂,其中有许多公式跨越依赖于复制的工作表的工作表,因此找到任何计算错误的简单全局方法会很有帮助。
【问题讨论】:
我正在使用 SpreadsheetGear 将工作表上的范围复制到另一个工作表的“输入”范围中,并手动重新计算 WorkbookSet。有没有办法在重新计算后轻松检查是否有任何公式或计算错误?
目标工作簿很复杂,其中有许多公式跨越依赖于复制的工作表的工作表,因此找到任何计算错误的简单全局方法会很有帮助。
【问题讨论】:
我认为“错误”是指 Excel 公式错误值,例如 #NUM!、#VALUE、#NAME? 等?不幸的是,在重新计算后,您无法检查任何属性来确定工作簿是否包含其中的一个或多个。这样做的唯一方法是自己手动遍历工作簿中的任何相关单元格并检查 ValueType 的错误。对于大型而复杂的工作簿,我知道这可能不可行。
无论如何,对于这种方法,如果可能的话,我最好的建议是将此错误检查限制在您感兴趣的较小范围或一组范围内。其次,您可以考虑使用下面的“高性能”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;
}
【讨论】:
我有一些关于这种转移的建议。
workbookSet.Calculation = SpreadsheetGear.Calculation.Manual;
并在需要时使用workbookSet.Calculate(); 显式手动触发计算
IValue。从那里您可以读取Text 或Number 属性以读出正确类型的值SetText或SetNumnber。IValue 将为空!高级界面与常规界面不同,我还没有弄清楚如何通过范围名称来寻址单元格。界面好像不允许这样,你可以按从 0 开始的行列索引来索引单元格。
【讨论】: