157
  1. 私はそのような内容のExcelファイルを持っています:

    • A1: いくつかの文字列

    • A2: 2

    すべてのフィールドは文字列形式に設定されています。

  2. POIを使用してJavaでファイルを読み取ると、A2が数値セル形式であることがわかります。

  3. 問題は、A2 の値が 2 または 2.0 になる可能性があることです (そして、それらを区別できるようにしたい) ため、単に を使用することはできません.toString()

値を文字列として読み取るにはどうすればよいですか?

4

21 に答える 21

345

私も同じ問題を抱えていました。文字列値を読み取る前に実行しcell.setCellType(Cell.CELL_TYPE_STRING);ました。これにより、ユーザーがセルをどのようにフォーマットしたかに関係なく、問題が解決しました。

于 2010-08-17T15:54:17.963 に答える
113

あなたが質問したとき、私たちはこのクラスを持っていなかったと思いますが、今日は簡単な答えがあります.

あなたがしたいことは、DataFormatter クラスを使用することです。これをセルに渡すと、Excel がそのセルに対して表示する内容を含む文字列が返されるように最善を尽くします。文字列セルを渡すと、文字列が返されます。書式設定ルールが適用された数値セルを渡すと、それらに基づいて数値が書式設定され、文字列が返されます。

あなたの場合、数値セルには整数の書式設定ルールが適用されていると思います。これらのセルをフォーマットするよう DataFormatter に依頼すると、整数文字列を含む文字列が返されます。

また、多くのcell.setCellType(Cell.CELL_TYPE_STRING)が. 呼び出しを行うと、フォーマットが失われます。Javadocでは、フォーマットが残っている String に変換する唯一の方法はDataFormatter クラスを使用することであると説明されています。setCellType

このクラスを使用する簡単な例:

DataFormatter dataFormatter = new DataFormatter();
String formattedCellStr = dataFormatter.formatCellValue(cell);
于 2011-08-17T23:26:25.190 に答える
63

以下のコードは、どのタイプのセルでも機能しました。

InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);

Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();

while(objIterator.hasNext()){

    Row row = objIterator.next();
    Cell cellValue = row.getCell(0);
    objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
    String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);

}
于 2014-07-02T14:37:46.960 に答える
19

Poi の JavaDocs ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) で既に述べたように、以下は使用しないでください。

cell.setCellType(Cell.CELL_TYPE_STRING);

ただし、次を使用します。

DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);

http://massapi.com/class/da/DataFormatter.htmlのその他の例

于 2016-11-11T14:57:36.717 に答える
14

はい、これは完全に機能します

おすすめされた:

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);

年:

cell.setCellType(Cell.CELL_TYPE_STRING);

cell数式から値を取得する際に問題がある場合でも、これは機能します。

于 2013-10-07T04:03:01.893 に答える
1

ユーザーが数値を入力する前にセルがテキスト形式である限り、POIでは値を文字列として取得できます。1つの重要な点は、セルの左上隅にテキストとしてフォーマットされた小さな緑色の三角形がある場合、その値を文字列として取得できることです(緑色の三角形は、数字のように見えるものがあるたびに表示されます)テキスト形式に強制されます)。数値を含むテキスト形式のセルがあるが、POIでそれらの値を文字列としてフェッチできない場合は、スプレッドシートデータに対して次のことを実行できます。

  • セルをダブルクリックして編集カーソルがセル内に表示されるようにしてから、Enterをクリックします(一度に実行できるのは1つのセルのみです)。
  • Excel 2007のテキスト変換機能を使用します(これは、一度に複数のセルで実行できます)。
  • 問題のある値を別の場所に切り取り、スプレッドシートのセルをテキストとして再フォーマットしてから、以前に切り取った値をフォーマットされていない値として適切な領域に貼り付けます。

最後にできることの1つは、POIを使用してExcel 2007スプレッドシートからデータを取得している場合、Cellクラスの「getRawValue()」メソッドを使用できることです。これはフォーマットが何であるかを気にしません。生データを含む文字列を返すだけです。

于 2012-01-12T20:12:07.760 に答える
0

何千もの数値のデータセットでも同様の問題が発生しており、簡単な解決方法を見つけたと思います。別のDBインポートで常に数値がテキストとして表示されるように、数値の前にアポストロフィを挿入する必要がありました。これ以前は、8という数字は8.0としてインポートされていました。

解決:

  • すべてのフォーマットを一般として保持します。
  • ここでは、行1から始まる列Aに数値が格納されていると想定しています。
  • 列Bに'を入力し、必要な数の行をコピーします。ワークシートには何も表示されませんが、セルをクリックすると、数式バーにアポストフが表示されます。
  • 列C:= B1&A1。
  • 列Cのすべてのセルを選択し、[値]オプションを使用して列Dに特殊貼り付けを実行します。

ねえプレストすべての番号がテキストとして保存されます。

于 2011-09-06T09:52:24.497 に答える
0

セル タイプが数値の場合、getStringCellValue は NumberFormatException を返します。セルの種類を文字列に変更したくない場合は、これを行うことができます。

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}
于 2014-08-13T03:19:15.823 に答える
0

Apache POI ライブラリを使用して MS Excel の数値セル値を読み取ると、数値として読み取られます。しかし、文字列として読みたい場合もあります (例: 電話番号など)。これが私がやった方法です:

  1. 最初のセル =CONCATENATE("!",D2) で新しい列を挿入します。D2 は電話番号列のセル ID だと思います。新しいセルを最後までドラッグします。

  2. POI を使用してセルを読み取ると、計算値ではなく式が読み取られます。次のようにします。

  3. 別の列を追加

  4. 手順 1 で作成した完全な列を選択し、[編集] -> [コピー] を選択します。

  5. 手順 3. で作成した列の先頭セルに移動し、[編集] -> [形式を選択して貼り付け] を選択します。

  6. 開いたウィンドウで、「値」ラジオボタンを選択します

  7. 「OK」を選択

  8. POI API を使用して読み取ります ... Java で読み取った後 ... 最初の文字、つまり「!」を削除するだけです。

于 2010-12-12T18:05:00.383 に答える
-1

とにかくExcelワークシートを管理していますか?ユーザーが入力を提供するためのテンプレートはありますか?その場合は、入力セルをコード形式でフォーマットすることができます。

于 2009-12-02T00:12:48.380 に答える
-1

このバグの事実に基づいて、これはPOIの現在のバージョンでは実行できないようです:

https://issues.apache.org/bugzilla/show_bug.cgi?id=46136

はまだ優れています。

于 2010-09-24T18:29:10.700 に答える
-2

同じ問題があり、値を入力するにユーザーにセルを「テキスト」としてフォーマットするように強制しました。そうすれば、Excel は偶数をテキストとして正しく格納します。フォーマットが後で変更された場合、Excel は値の表示方法のみを変更しますが、値が再度入力されない限り (たとえば、セル内で Return キーを押すなど)、値の保存方法は変更されません。

Excel が値をテキストとして正しく保存したかどうかは、セルに数値が含まれているがテキストとして書式設定されていると Excel が判断した場合に、セルの左上隅に小さな緑色の三角形が表示されることで示されます。

于 2009-07-30T10:24:41.863 に答える
-2

cell.setCellType(Cell.CELL_TYPE_STRING); 私にとってはうまくいっています

于 2015-05-23T20:43:20.530 に答える