2014-12-30 1 views
1

Я использую SpreadsheetGear, чтобы скопировать диапазон с рабочего листа на «входной» диапазон другого рабочего листа и вручную пересчитать WorkbookSet. Есть ли способ легко проверить, есть ли какая-либо формула или ошибки вычисления после пересчета?В SpreadsheetGear, как проверить формулу или ошибки расчета?

Рабочая тетрадь назначения сложна со многими формулами, охватывающими рабочие листы, которые зависят от скопированных данных, поэтому было бы полезно использовать простой глобальный способ определения ошибок вычисления.

ответ

1

«Ошибка» Предполагаю, вы имеете в виду значение ошибки формулы Excel, например #NUM !, #VALUE, #NAME ?, etc? К сожалению, нет свойства, которое вы можете проверить, чтобы определить, содержит ли книга одну или несколько из них после пересчета. Единственный способ сделать это - это вручную выполнить итерацию через любые соответствующие ячейки в книге и проверить значение 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; 
} 
+0

Да, я хотел обнаружить любые ошибки формулы. Спасибо за пример кода и подтверждаем, что нет «глобального» индикатора таких ошибок. –

0

У меня есть несколько советов для такой передачи.

  1. Немного по теме, но установить workbookSet.Calculation = SpreadsheetGear.Calculation.Manual; и расчет запуска явно вручную всякий раз, когда вам нужно с ответом workbookSet.Calculate();
  2. @ Тим Андерсена показывает, как получить доступ к IValue. Оттуда вы можете прочитать Text или Number property, чтобы узнать правильный тип значения
  3. Вы можете сказать SetText или SetNumnber, если хотите установить.
  4. Если ячейка пуста, IValue будет просто нулевой!

Интерфейс Advanced отличается от обычного, я не понял, как обращаться с ячейками по именам диапазонов. Похоже, интерфейс не позволяет этого, вы можете индексировать ячейки по индексам столбцов строки на 0.

Смежные вопросы