回答:
同じ問題がありました。cell.setCellType(Cell.CELL_TYPE_STRING);
文字列値を読み取る前に行ったので、ユーザーがセルをどのようにフォーマットしたかに関係なく、問題が解決しました。
あなたが質問したときに私たちがこのクラスを取り戻したとは思いませんが、今日は簡単な答えがあります。
やりたいことは、DataFormatterクラスを使用することです。これをセルに渡すと、Excelがそのセルに対して表示する内容を含む文字列を返すことが最善です。文字列セルを渡すと、文字列が返されます。フォーマット規則が適用された数値セルを渡すと、それらに基づいて数値がフォーマットされ、文字列が返されます。
あなたのケースでは、数値セルに整数の書式ルールが適用されていると仮定します。これらのセルをフォーマットするようにDataFormatterに要求すると、整数文字列を含む文字列が返されます。
また、多くの人がそうすることを勧めていますcell.setCellType(Cell.CELL_TYPE_STRING)
が、Apache POI JavaDocsはこれを行うべきではないと明確に述べていることに注意してください!こうsetCellType
としてコールすることは、書式設定失うことになるのJavadocを説明し、残りの書式設定で文字列に変換する唯一の方法は使用することですDataFormatterクラスを。
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
以下のコードは、どのタイプのセルでも機能しました。
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);
}
getCreationHelper().createFormulaEvaluator()
メソッドを介して数式エバリュエーターを提供します。この方法では、コードはHSSFFormulaEvaluatorクラスと結合されません。
FormulaEvaluator
このソリューションから簡単に削除できますか?それは目的を果たしますか?
セルのタイプの変更が望ましくない場合は、次の方法をお勧めします。
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() )
数値を正しくフォーマットする必要があります。
2
と2.0
。あなたの解決策はこれをしません。(それでも、Stack Overflowへようこそ!)
ユーザーが数値を入力する前にセルがテキスト形式である限り、POIは値を文字列として取得できるようにします。1つのキーは、セルの左上隅にテキストとして書式設定された小さな緑色の三角形がある場合、その値を文字列として取得できることです(数値のように見えるものがあるときはいつでも、緑色の三角形が表示されます)テキスト形式に強制変換されます)。数値を含むテキスト形式のセルがあるが、POIでこれらの値を文字列として取得できない場合は、スプレッドシートデータに対していくつかのことを行うと、次のことが可能になります。
最後にできることの1つは、POIを使用してExcel 2007スプレッドシートからデータを取得している場合、Cellクラスの「getRawValue()」メソッドを使用できることです。これはフォーマットが何であるかを気にしません。生データの文字列を返すだけです。
Apache POIライブラリを使用してMS Excelの数値セル値を読み取ると、数値として読み取られます。しかし、文字列として読み取ることを希望する場合があります(電話番号など)。これは私がそれをした方法です:
最初のセル= CONCATENATE( "!"、D2)の新しい列を挿入します。D2は電話番号列のセルIDだと思います。最後まで新しいセルをドラッグします。
POIを使用してセルを読み取ると、計算された値ではなく数式が読み取られます。次のようにします。
別の列を追加
手順1で作成した完全な列を選択し、[編集]-> [コピー]を選択します。
手順3で作成した列の一番上のセルに移動し、[編集]-> [形式を選択して貼り付け]を選択します。
開いたウィンドウで、「値」ラジオボタンを選択します
「OK」を選択
今POI APIを使用して読んでください... Javaで読んだ後...最初の文字、すなわち「!」を削除するだけです
私も数千の数値のデータセットで同様の問題を抱えていて、解決する簡単な方法を見つけたと思います。番号の前にアポストロフィを挿入して、別のDBインポートで常に番号がテキストとして認識されるようにする必要がありました。これ以前は、8は8.0としてインポートされていました。
解決:
Hey Prestoすべての数値ですが、テキストとして保存されます。
これらの回答の多くは、古いPOIドキュメントとクラスを参照しています。最新のPOI 3.16では、int型のCellは非推奨になりました
Cell.CELL_TYPE_STRING
代わりに、CellType列挙型を使用できます。
CellType.STRING
pomをpoi依存関係とpoi-ooxml依存関係で新しい3.16バージョンに更新してください。そうしないと、例外が引き続き発生します。このバージョンの1つの利点は、セルの作成時にセルタイプを指定できることです。これにより、前の回答で説明した追加の手順がすべて削除されます。
titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
私はむしろウィルの答えやビナヤック・ドルナラのルートに行きたいですが、残念ながら彼らは私のパフォーマンスにはるかに影響を与えました。私は暗黙のキャストのHACKYソリューションに行きました:
for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...
私がこれを行うことはお勧めしません。私の状況では、システムがどのように機能するかという性質と、信頼できるファイルソースがあったためです。
脚注:numericColumnは、処理されたファイルのヘッダーの読み取りから生成されるintです。
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());
}
私はこれを試しました、そしてそれは私のために働きました
現在のバージョンのPOIでは、このバグが原因で次のようなことはできないようです。
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
まだ優れています。
cell.setCellType(Cell.CELL_TYPE_STRING); 私にとってはうまくいきます
intにキャストしてから.toString()
。醜いですが動作します。