1

私は Java POI をしばらく使用していますが、新しい問題に遭遇しました。誰かが解決策を見つけたのではないかと思っています。

スプレッドシートを読み取るときは、適切な読み取り方法を使用するためにセルの種類を知る必要があります。

したがって、セルの種類を取得してから、適切な読み取りメソッドを呼び出してセルの内容を取得します。

これは、値が数値である FORMULA セルを除くすべてのセルで機能します。文字なら普通に読めます。ただし、結果の値が数値の場合、セルから得られるのは空白の文字列だけです。

私は POI の Javadoc を調べて、正しいデータ型 (HSSFRichTextString) を使用していますが、まだ満足していません。

誰にも解決策がありますか?

PSこのPOIの動作は、セルの値プロパティにデフォルト設定するなど、任意のセルタイプの文字列表現を返すデフォルトの cell.toString() メソッドが必要であるため、私を悩ませます。(「値」を選択できるペーストスペシャルのようなものです)。

PPS: 質問どおり - Java 6 (1.6.0_06) と poi-3.0.2-FINAL-20080204.jar を使用しています

4

4 に答える 4

3
 FileInputStream fis = new FileInputStream("c:/temp/test.xls");
    Workbook wb = new HSSFWorkbook(fis); //or new XSSFWorkbook("c:/temp/test.xls")
    Sheet sheet = wb.getSheetAt(0);
    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

    // suppose your formula is in B3
    CellReference cellReference = new CellReference("B3"); 
    Row row = sheet.getRow(cellReference.getRow());
    Cell cell = row.getCell(cellReference.getCol()); 

    CellValue cellValue = evaluator.evaluate(cell);

    switch (cellValue.getCellType()) {
        case Cell.CELL_TYPE_BOOLEAN:
            System.out.println(cellValue.getBooleanValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            System.out.println(cellValue.getNumberValue());
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println(cellValue.getStringValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_ERROR:
            break;

        // CELL_TYPE_FORMULA will never happen
        case Cell.CELL_TYPE_FORMULA: 
            break;
    }

ここから無断転載

于 2009-02-09T05:03:13.933 に答える
2

そのセルをテキストに変換するだけです..コピー「特殊貼り付け」を使用して...次のようにしました....

のポイント # 2 からお読みください。

http://www.asif-shahzad.com/2010/12/how-to-read-numbers-as-string-value-in.html

于 2010-12-12T18:34:14.887 に答える
1

POI がうまくいかない場合は、Andy Khan の JExcelを試してください。私はそれが好きです。

于 2009-02-09T10:57:58.650 に答える
1

createFormulaEvaluator を使用する代わりに、SetCellType(CellType.STRING) を使用してから StringCellValue にアクセスすることもできます。数式エバリュエーター (NPOI を使用) に WORKDAY() 関数が含まれていると、問題が発生しました。

于 2012-08-13T16:44:15.617 に答える