我使用SpreadsheetGear将工作表上的范围复制到另一个工作表的“输入”范围中,并手动重新计算WorkbookSet。在重新计算后,是否有一种容易检查公式或计算错误的方法?
目标工作簿非常复杂,包含许多依赖于复制的工作表的公式,因此,使用一种简单的全局方法来定位任何计算错误都是有帮助的。
发布于 2014-12-30 18:20:18
所谓“错误”,我猜想您指的是Excel公式错误值,例如#NUM!、#值、#NAME?等等?不幸的是,在重新计算之后,您无法检查工作簿是否包含其中的一个或多个属性。要做到这一点,唯一的方法是自己手动迭代工作簿中的任何相关单元,并检查错误的ValueType。对于一个庞大而复杂的工作簿,我理解这可能是不可行的。
无论如何,对于这种方法,我最好的建议是,如果可能的话,将此错误检查限制在您感兴趣的较小范围或范围内。其次,您可以考虑使用SpreadsheetGear.Advanced.单元格命名空间下的“高性能”API来提高这个例程的性能,而不是使用传统的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;
}
发布于 2015-11-08 20:02:48
对于这样的调动,我有一些建议。
workbookSet.Calculation = SpreadsheetGear.Calculation.Manual;
时,可以显式地手动设置workbookSet.Calculate();
和触发器计算。IValue
。从这里可以读取Text
或Number
属性来读取正确的值类型。SetText
或SetNumnber
。IValue
将为空!高级接口与常规接口不同,我还没有弄清楚如何通过范围名称来寻址单元格。看起来接口不允许这样做,您可以通过基于0的行列索引来索引单元格。
https://stackoverflow.com/questions/27698466
复制相似问题