11

apache poi xssf を使用して、Excel ファイルを XML に解析しようとしています。セルがあり、その中に何が入っているのかわからないので、そこから文字列を取得したいだけです。しかし、私が使用するとき

cell.getStringCellValue()

例外がスローされますが、このように文書化されているため、それほど驚くことではありません。そのため、天気をチェックすることで、それが数値またはテキストセルであることに対処しています。しかし、数式セルをどうするか。次のような数字が含まれる場合があります

= A2 + B2

合計 (例: 4) または別のテキストへの参照を与えるもの

= C2

「ハンス」のようなテキストを指すもの。

セルに実際に何が入っているかを知るにはどうすればよいですか?また、セルから文字列を取得するにはどうすればよいですか?

4

4 に答える 4

26

Excel は一部のセルを文字列として保存しますが、ほとんどのセルは特別な書式設定ルールが適用された数値として保存されます。cell.getCellType()生の値を取得する場合は、他のいくつかの回答が示しているように、に基づいて switch ステートメントを使用します。

ただし、必要なものがセルの文字列であり、セル + セル型にすべての書式設定規則を適用することに基づいて、Excel が表示するものと同じものを表示する場合、Apache POI にはそれを行うクラスがあります - DataFormatter

あなたがする必要があるのは、次のようなものです:

 Workbook wb = WorkbookFactory.create(new File("myfile.xls"));
 DataFormatter df = new DataFormatter();

 Sheet s = wb.getSheetAt(0);
 Row r1 = s.getRow(0);
 Cell cA1 = r1.getCell(0);

 String asItLooksInExcel = df.formatCellValue(cA1);

セルの種類が何であれ、DataFormatter は、Excel で適用されるルールを使用して、適切に書式設定された文字列を最後に返すことで、可能な限り書式を設定します。

于 2014-02-04T10:46:28.093 に答える
1

以下のようにCELLタイプのチェックを追加できます:

switch(cell.getCellType()) {
                case Cell.CELL_TYPE_BOOLEAN:
                    System.out.print(cell.getBooleanCellValue() + "\t\t");
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    System.out.print(cell.getNumericCellValue() + "\t\t");
                    break;
                case Cell.CELL_TYPE_STRING:
                    System.out.print(cell.getStringCellValue() + "\t\t");
                    break;
            }
于 2014-02-03T21:49:30.820 に答える
0

これを試してみてください

           case Cell.CELL_TYPE_FORMULA:
                    switch (cell.getCachedFormulaResultType()) {
                        case Cell.CELL_TYPE_STRING:
                            System.out.println(cell.getRichStringCellValue().getString());
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                System.out.println(cell.getDateCellValue() + "");
                            } else {
                                System.out.println(cell.getNumericCellValue());
                            }
                            break;
                    }
                    break;
于 2014-02-04T09:56:13.880 に答える