0

次のコードがあります

public boolean processCell(boolean hasData, StringBuffer rowData, Cell cell)
 {
  switch (cell.getCellType())
  {
   case Cell.CELL_TYPE_FORMULA:
   {
    try
    {
     this.evaluator.clearAllCachedResultValues();
     switch (this.evaluator.evaluateFormulaCell(cell))
     {
      case XSSFCell.CELL_TYPE_NUMERIC:
      {
       if (DateUtil.isCellDateFormatted(cell))
       {
        logger.warn(cell.getCellFormula());

        rowData.append(dateFormat.format(cell.getDateCellValue()));
        hasData = true;
       }
       else
       {
        rowData.append(numberFormat.format(cell.getNumericCellValue()));
        hasData = true;
       }
       break;
      }
      case XSSFCell.CELL_TYPE_STRING:
      {
       String stringVal = cell.getStringCellValue().trim().replaceAll("\n", "");
       if (stringVal.trim().equalsIgnoreCase("Total MoU/active customer"))
       {
        logger.warn("Last -  KPI ::" + stringVal);
        this.finalRecord = true;
       }
       rowData.append(stringVal);
       hasData = true;
       break;
      }
      case XSSFCell.CELL_TYPE_BOOLEAN:
      {
       rowData.append(cell.getBooleanCellValue());
       hasData = true;
       break;
      }
      case XSSFCell.CELL_TYPE_ERROR:
      {
       int eval = cell.getErrorCellValue();
       if (eval == DIVIDE_BY_ZERO)
        rowData.append("0");
       hasData = true;
       break;
      }
      case XSSFCell.CELL_TYPE_BLANK:
      {
       rowData.append("");
       hasData = true;
       break;
      }
     }
    }
    catch (java.lang.IllegalArgumentException e)
    {

     logger.error("  Formula [ " + (cell.getRowIndex() + 1) + "," + (cell.getColumnIndex() + 1) + " ]  "
       + e.getMessage());
     rowData.append("CellError");
     this.STATUS = FAILURE;
     hasData = true;
     break;
    }
    catch (java.lang.IllegalStateException e)
    {

     logger.error("  Formula [ " + (cell.getRowIndex() + 1) + "," + (cell.getColumnIndex() + 1) + " ]  "
       + e.getMessage());
     rowData.append("CellError");
     this.STATUS = FAILURE;
     hasData = true;
     break;
    }
    catch (java.lang.RuntimeException e)
    {
     this.STATUS = FAILURE;
     logger.error("  Formula [ " + (cell.getRowIndex() + 1) + "," + (cell.getColumnIndex() + 1) + " ]  "
       + e.getMessage());
     rowData.append("MissingFileError");
     hasData = true;
     break;
    }
    break;
   }
   case XSSFCell.CELL_TYPE_BLANK:
   {
    rowData.append("");
    hasData = true;
    break;
   }
   case XSSFCell.CELL_TYPE_NUMERIC:
   {
    if (DateUtil.isCellDateFormatted(cell))
    {
     rowData.append(dateFormat.format(cell.getDateCellValue()));
     hasData = true;
    }
    else
    {
     rowData.append(numberFormat.format(cell.getNumericCellValue()));
     hasData = true;
    }
    break;
   }
    // Formula evaluation ends here
   case XSSFCell.CELL_TYPE_STRING:
   {
    String stringVal = cell.getStringCellValue().trim().replaceAll("\n", "");
    if (stringVal.trim().equalsIgnoreCase("Total MoU/active customer"))
    {
     logger.warn("Last -  KPI ::" + stringVal);
     this.finalRecord = true;
     ;
    }
    rowData.append(stringVal);
    hasData = true;
    break;
   }
   case XSSFCell.CELL_TYPE_ERROR:
   {
    int eval = cell.getErrorCellValue();
    if (eval == DIVIDE_BY_ZERO)
     rowData.append("0");
    hasData = true;
    break;
   }
   case XSSFCell.CELL_TYPE_BOOLEAN:
   {
    rowData.append(cell.getBooleanCellValue());
    hasData = true;
    break;
   }
  }
  rowData.append(FIELD_SEPARATOR);
  return hasData;
 }

プログラムを実行すると。日付列には一連の日付があります。数式のない最後の日付は 2009 年 12 月 31 日です Excel シートの oj+1 のセル参照 oj は 2010 年 1 月 1 日ですが、Excel シートでは 2009 年 4 月 29 日を取得しました このセルに数式を印刷して見つけましたpoi 3.6 のセル参照が間違っていることがわかりました。oj+1 の代わりに NE+1 を与える

問題を解決するのを手伝ってください

4

2 に答える 2

3

あなたの例は不完全であるため、あなたの結果を再現することはできません。期待される結果を生成するsscceを次に示します。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;

public class POIExcelReader {

    public static void main(String[] args) throws IOException {
        InputStream myxls = new FileInputStream("test.xls");
        HSSFWorkbook book = new HSSFWorkbook(myxls);
        FormulaEvaluator eval =
            book.getCreationHelper().createFormulaEvaluator();
        HSSFSheet sheet = book.getSheetAt(0);
        for (Row row : sheet) {
            for (Cell cell : row) {
                printCell(cell, eval);
                System.out.print("; ");
            }
            System.out.println();
        }
        myxls.close();
    }

    private static void printCell(Cell cell, FormulaEvaluator eval) {
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BLANK:
                System.out.print("EMPTY");
                break;
            case Cell.CELL_TYPE_STRING:
                System.out.print(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.print(cell.getDateCellValue());
                } else {
                    System.out.print(cell.getNumericCellValue());
                }
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                System.out.print(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA:
                System.out.print(cell.getCellFormula());
                CellValue cellValue = eval.evaluate(cell);
                switch (cellValue.getCellType()) {
                    case Cell.CELL_TYPE_NUMERIC:
                        double v = cellValue.getNumberValue();
                        if (DateUtil.isCellDateFormatted(cell)) {
                            System.out.print(" = "
                                + DateUtil.getJavaDate(v, true));
                        } else {
                            System.out.print(" = " + v);
                        }
                        break;
                }
                break;
            default:
                System.out.print("DEFAULT");
        }
    }
}
2010 年 1 月 10 日日曜日 00:00:00 EST。1+1 = 2.0; 123.1; 文字列1; 真実;
A1+1 = 2010 年 1 月 11 日月曜日 00:00:00 EST; 2+2 = 4.0; 123.2; 文字列 2; 間違い;
A2+1 = 2010 年 1 月 12 日火曜日 00:00:00 EST; 3+3 = 6.0; 123.3; 文字列 3; 真実;

補遺: 結果は Apache POI 3.8b3 で検証されました。

于 2010-01-16T23:18:36.963 に答える
1

私が読んでいたワークブックがハードコードされた値から、 E7+7 と次のセル F7+7 のように互いに依存する評価された日付値に切り替わるという同様の問題がありました。一気に5年も跳ね上がる…

次のように値を読み取る前に、各セルで evalInCell を使用して修正しました。

if (cell.getCellType() == Cell.CELL_TYPE_FORMULA)
{
     cell = eval.evaluateInCell(cell);
}

お役に立てれば!

于 2013-01-22T00:59:16.597 に答える