2012-11-24 137 views
2

我正在使用NPOI從Excel 2003文件中讀取數據。這些文件包含這樣的公式:SUM('1:2'!$ C $ 17)。 NPOI認可了這樣的公式,例如SUM('1'!$ C $ 17)(不含表2)並評估無效結果。 我使用NPOI從一個例子常規代碼,就像NPOI不評估3d公式

foreach (var row in docRows) 
      { 
       sb.AppendFormat("{0}\t", SomeCode); 
       rowCounter += 1; 
       sb.AppendFormat("{0}\t", rowCounter); 
       foreach (var col in docColumns) 
       { 
        ICell cell = sheet.GetRow(row).GetCell(col); 

        sb.AppendFormat("{0}\t", GetExcelCellValue(cell)); 
       } 
       sb.AppendLine(); 
      } 
private string GetExcelCellValue(ICell cell) 
     { 
      string cellValue = string.Empty; 
      IFormulaEvaluator evaluator = _hssfworkbook.GetCreationHelper().CreateFormulaEvaluator(); 
      evaluator.Evaluate(cell); 

      switch (evaluator.EvaluateInCell(cell).CellType) 
      { 
       case CellType.BLANK: 
        cellValue = string.Empty; 
        break; 
       case CellType.BOOLEAN: 
        cellValue = string.Empty; 
        break; 
       case CellType.NUMERIC: 
        cellValue = Convert.ToString(cell.NumericCellValue); //This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number. 
        break; 
       case CellType.STRING: 
        throw new ArgumentNullException(); 
        cellValue = cell.StringCellValue; 
        break; 
       case CellType.ERROR: 
        cellValue = string.Empty; 
        break; 
       case CellType.FORMULA: 

        break; 

      } 
      return cellValue; 
     } 

回答

0

我剛剛遇到了這個問題,我通過

switch (cell.CellType) 
       { 
        case CellType.Blank: 
         cellValue = ""; 
         break; 
        case CellType.Boolean: 
         cellValue = cell.BooleanCellValue.ToString(); 
         break; 
        case CellType.Formula: 

         cellValue = cell.NumericCellValue.ToString(); 
         break; 
        case CellType.Numeric: 
         cellValue = cell.NumericCellValue.ToString(); 
         break; 
        case CellType.String: 
         cellValue = cell.StringCellValue; 
         break; 
       } 
解決它