私はそのような内容のExcelファイルを持っています:
A1:SomeString
A2:2
すべてのフィールドは文字列形式に設定されます。
POIを使用してJavaのファイルを読み取ると、A2が数値セル形式であることがわかります。
.toString()
だけを使用できないことです。値を文字列として読み取るにはどうすればよいですか?
同じ問題がありました。文字列値を読み取る前にcell.setCellType(Cell.CELL_TYPE_STRING);
を実行し、ユーザーがセルをどのようにフォーマットしたかに関係なく問題を解決しました。
質問したときにこのクラスに戻ったとは思いませんが、今日は簡単な答えがあります。
あなたがしたいのは、 DataFormatterクラス を使用することです。これをセルに渡すと、Excelがそのセルに対して表示する内容を含む文字列を返すのが最善です。文字列セルを渡すと、文字列が返されます。書式設定ルールが適用された数値セルを渡すと、それらに基づいて数値が書式設定され、文字列が返されます。
あなたの場合、数値セルには整数書式ルールが適用されていると思います。 DataFormatterにこれらのセルをフォーマットするように要求すると、整数文字列を含む文字列が返されます。
また、多くの人がcell.setCellType(Cell.CELL_TYPE_STRING)
を実行することを提案していますが、 Apache POI JavaDocsは、これを行うべきではないことをはっきりと述べています ! setCellType
name__呼び出しを行うと、フォーマットが失われます。 javadocsが説明するように 残りのフォーマットで文字列に変換する唯一の方法は、 DataFormatterクラス 。
以下のコードは、どのタイプのセルでも機能しました。
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);
}
セルのタイプを変更することが望ましくない場合は、次のアプローチをお勧めします。
if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}
NumberToTextConverterは、Excelのルールを使用して、精度を損なうことなくdouble値をテキストに正しく変換できます。
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
から値を取得する際に問題が発生した場合でも、これは機能します。
試してください:
new Java.text.DecimalFormat("0").format( cell.getNumericCellValue() )
数値を正しくフォーマットする必要があります。
ユーザーが数値を入力する前にセルがテキスト形式である限り、POIでは値を文字列として取得できます。 1つのキーは、テキストとしてフォーマットされたセルの左上隅に小さな緑色の三角形がある場合、その値を文字列として取得できることです(何かが数字のように見える場合は常に緑色の三角形が表示されます)テキスト形式に強制されます)。数値を含むテキスト形式のセルがあるが、POIでこれらの値を文字列としてフェッチできない場合、スプレッドシートデータに対してできることをいくつか行うことができます。
最後にできることの1つは、POIを使用してExcel 2007スプレッドシートからデータを取得する場合、Cellクラスの 'getRawValue()'メソッドを使用できることです。これは、フォーマットが何であるかを気にしません。生データを含む文字列を返すだけです。
私は数千の数値のデータセットでも同様の問題を抱えており、簡単な解決方法を見つけたと思います。数値の前にアポストロフィを挿入して、個別のDBインポートで数値が常にテキストとして認識されるようにする必要がありました。この前に、8という数字が8.0としてインポートされます。
溶液:
ちょっとプレストすべての番号が、テキストとして保存されます。
私はむしろウィルの答えのルート、またはビナヤック・ドルナラに行きたいのですが、残念ながら彼らは私のパフォーマンスに大きく影響しました。私はHACKY暗黙的なキャストの解決策に行きました:
for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...
これを行うことはお勧めしません。私の状況では、システムがどのように機能し、信頼できるファイルソースがあったために機能しました。
脚注:numericColumnは、処理されたファイルのヘッダーの読み取りから生成されるintです。
セルタイプが数値の場合、getStringCellValueはNumberFormatExceptionを返します。セルタイプを文字列に変更したくない場合は、これを行うことができます。
String rsdata = "";
try {
rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
rsdata = cell.getNumericValue() + "";
}
public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
String retVal=null;
try {
FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
Workbook wb=WorkbookFactory.create(fis);
Sheet s=wb.getSheet(sheetname);
Row r=s.getRow(rownum);
Cell c=r.getCell(cellnum);
if(c.getCellType() == Cell.CELL_TYPE_STRING)
retVal=c.getStringCellValue();
else {
retVal = String.valueOf(c.getNumericCellValue());
}
私はこれを試してみました
Apache POIライブラリを使用してMS Excelの数値セル値を読み取ると、数値として読み取られます。ただし、文字列(電話番号など)として読み取る場合もあります。これは私がそれをやった方法です:
最初のセル= CONCATENATE( "!"、D2)で新しい列を挿入します。 D2は電話番号列のセルIDであると想定しています。新しいセルを最後までドラッグします。
これで、POIを使用してセルを読み取ると、計算値の代わりに数式が読み取られます。次の手順を実行します。
別の列を追加
手順1で作成した列全体を選択し、[編集]-> [コピー]を選択します。
手順3で作成した列の一番上のセルに移動し、[編集]-> [特殊貼り付け]を選択します。
開いたウィンドウで、「値」ラジオボタンを選択します
「OK」を選択します
ここで、POI APIを使用して読み取ります... Javaを読み取った後...最初の文字、つまり「!」を削除します
これらの回答の多くは、古いPOIのドキュメントとクラスを参照しています。最新のPOI 3.16では、 int型のセル は非推奨になりました
Cell.CELL_TYPE_STRING
代わりに CellType enum を使用できます。
CellType.STRING
必ず、poi依存関係とpoi-ooxml依存関係を新しい3.16バージョンに合わせてpomを更新してください。そうしないと、例外が引き続き発生します。このバージョンの利点の1つは、セルの作成時にセルタイプを指定できることです。これにより、前の回答で説明した余分な手順がすべて不要になります。
titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);