私はそのような内容のExcelファイルを持っています:
A1: いくつかの文字列
A2: 2
すべてのフィールドは文字列形式に設定されています。
POIを使用してJavaでファイルを読み取ると、A2が数値セル形式であることがわかります。
- 問題は、A2 の値が 2 または 2.0 になる可能性があることです (そして、それらを区別できるようにしたい) ため、単に を使用することはできません
.toString()
。
値を文字列として読み取るにはどうすればよいですか?
私はそのような内容のExcelファイルを持っています:
A1: いくつかの文字列
A2: 2
すべてのフィールドは文字列形式に設定されています。
POIを使用してJavaでファイルを読み取ると、A2が数値セル形式であることがわかります。
.toString()
。値を文字列として読み取るにはどうすればよいですか?
私も同じ問題を抱えていました。文字列値を読み取る前に実行しcell.setCellType(Cell.CELL_TYPE_STRING);
ました。これにより、ユーザーがセルをどのようにフォーマットしたかに関係なく、問題が解決しました。
あなたが質問したとき、私たちはこのクラスを持っていなかったと思いますが、今日は簡単な答えがあります.
あなたがしたいことは、DataFormatter クラスを使用することです。これをセルに渡すと、Excel がそのセルに対して表示する内容を含む文字列が返されるように最善を尽くします。文字列セルを渡すと、文字列が返されます。書式設定ルールが適用された数値セルを渡すと、それらに基づいて数値が書式設定され、文字列が返されます。
あなたの場合、数値セルには整数の書式設定ルールが適用されていると思います。これらのセルをフォーマットするよう DataFormatter に依頼すると、整数文字列を含む文字列が返されます。
また、多くの人cell.setCellType(Cell.CELL_TYPE_STRING)
が. 呼び出しを行うと、フォーマットが失われます。Javadocでは、フォーマットが残っている String に変換する唯一の方法はDataFormatter クラスを使用することであると説明されています。setCellType
このクラスを使用する簡単な例:
DataFormatter dataFormatter = new DataFormatter();
String formattedCellStr = dataFormatter.formatCellValue(cell);
以下のコードは、どのタイプのセルでも機能しました。
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);
}
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);
はい、これは完全に機能します
おすすめされた:
DataFormatter dataFormatter = new DataFormatter();
String value = dataFormatter.formatCellValue(cell);
年:
cell.setCellType(Cell.CELL_TYPE_STRING);
cell
数式から値を取得する際に問題がある場合でも、これは機能します。
ユーザーが数値を入力する前にセルがテキスト形式である限り、POIでは値を文字列として取得できます。1つの重要な点は、セルの左上隅にテキストとしてフォーマットされた小さな緑色の三角形がある場合、その値を文字列として取得できることです(緑色の三角形は、数字のように見えるものがあるたびに表示されます)テキスト形式に強制されます)。数値を含むテキスト形式のセルがあるが、POIでそれらの値を文字列としてフェッチできない場合は、スプレッドシートデータに対して次のことを実行できます。
最後にできることの1つは、POIを使用してExcel 2007スプレッドシートからデータを取得している場合、Cellクラスの「getRawValue()」メソッドを使用できることです。これはフォーマットが何であるかを気にしません。生データを含む文字列を返すだけです。
何千もの数値のデータセットでも同様の問題が発生しており、簡単な解決方法を見つけたと思います。別のDBインポートで常に数値がテキストとして表示されるように、数値の前にアポストロフィを挿入する必要がありました。これ以前は、8という数字は8.0としてインポートされていました。
解決:
ねえプレストすべての番号がテキストとして保存されます。
セル タイプが数値の場合、getStringCellValue は NumberFormatException を返します。セルの種類を文字列に変更したくない場合は、これを行うことができます。
String rsdata = "";
try {
rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
rsdata = cell.getNumericValue() + "";
}
Apache POI ライブラリを使用して MS Excel の数値セル値を読み取ると、数値として読み取られます。しかし、文字列として読みたい場合もあります (例: 電話番号など)。これが私がやった方法です:
最初のセル =CONCATENATE("!",D2) で新しい列を挿入します。D2 は電話番号列のセル ID だと思います。新しいセルを最後までドラッグします。
POI を使用してセルを読み取ると、計算値ではなく式が読み取られます。次のようにします。
別の列を追加
手順 1 で作成した完全な列を選択し、[編集] -> [コピー] を選択します。
手順 3. で作成した列の先頭セルに移動し、[編集] -> [形式を選択して貼り付け] を選択します。
開いたウィンドウで、「値」ラジオボタンを選択します
「OK」を選択
POI API を使用して読み取ります ... Java で読み取った後 ... 最初の文字、つまり「!」を削除するだけです。
とにかくExcelワークシートを管理していますか?ユーザーが入力を提供するためのテンプレートはありますか?その場合は、入力セルをコード形式でフォーマットすることができます。
このバグの事実に基づいて、これはPOIの現在のバージョンでは実行できないようです:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
はまだ優れています。
同じ問題があり、値を入力する前にユーザーにセルを「テキスト」としてフォーマットするように強制しました。そうすれば、Excel は偶数をテキストとして正しく格納します。フォーマットが後で変更された場合、Excel は値の表示方法のみを変更しますが、値が再度入力されない限り (たとえば、セル内で Return キーを押すなど)、値の保存方法は変更されません。
Excel が値をテキストとして正しく保存したかどうかは、セルに数値が含まれているがテキストとして書式設定されていると Excel が判断した場合に、セルの左上隅に小さな緑色の三角形が表示されることで示されます。
cell.setCellType(Cell.CELL_TYPE_STRING); 私にとってはうまくいっています