web-dev-qa-db-ja.com

Excelセルの数値文字列を(数字ではなく)文字列として読み取るにはどうすればよいですか?

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

    • A1:SomeString

    • A2:2

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

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

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

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

131
joycollector

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

297
wil

質問したときにこのクラスに戻ったとは思いませんが、今日は簡単な答えがあります。

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

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

また、多くの人がcell.setCellType(Cell.CELL_TYPE_STRING)を実行することを提案していますが、 Apache POI JavaDocsは、これを行うべきではないことをはっきりと述べていますsetCellTypename__呼び出しを行うと、フォーマットが失われます。 javadocsが説明するように 残りのフォーマットで文字列に変換する唯一の方法は、 DataFormatterクラス

87
Gagravarr

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

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);

}
46
Vinayak Dornala

セルのタイプを変更することが望ましくない場合は、次のアプローチをお勧めします。

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

NumberToTextConverterは、Excelのルールを使用して、精度を損なうことなくdouble値をテキストに正しく変換できます。

26

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 のその他の例

15
userM1433372

はい、これは完全に動作します

推奨:

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

古い:

cell.setCellType(Cell.CELL_TYPE_STRING);

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

6
Rajesh Mbm

試してください:

new Java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

数値を正しくフォーマットする必要があります。

4
iTake

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

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

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

1
Mark Farnsworth

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

溶液:

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

ちょっとプレストすべての番号が、テキストとして保存されます。

0
Mark Holmes

私はむしろウィルの答えのルート、またはビナヤック・ドルナラに行きたいのですが、残念ながら彼らは私のパフォーマンスに大きく影響しました。私はHACKY暗黙的なキャストの解決策に行きました:

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

これを行うことはお勧めしません。私の状況では、システムがどのように機能し、信頼できるファイルソースがあったために機能しました。

脚注:numericColumnは、処理されたファイルのヘッダーの読み取りから生成されるintです。

0
KeaganFouche

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

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}
0
zawhtut
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());
        }

私はこれを試してみました

0
Prasanna

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

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

  2. これで、POIを使用してセルを読み取ると、計算値の代わりに数式が読み取られます。次の手順を実行します。

  3. 別の列を追加

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

  5. 手順3で作成した列の一番上のセルに移動し、[編集]-> [特殊貼り付け]を選択します。

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

  7. 「OK」を選択します

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

0
Asif Shahzad

これらの回答の多くは、古いPOIのドキュメントとクラスを参照しています。最新のPOI 3.16では、 int型のセル は非推奨になりました

Cell.CELL_TYPE_STRING

enter image description here

代わりに CellType enum を使用できます。

CellType.STRING 

必ず、poi依存関係とpoi-ooxml依存関係を新しい3.16バージョンに合わせてpomを更新してください。そうしないと、例外が引き続き発生します。このバージョンの利点の1つは、セルの作成時にセルタイプを指定できることです。これにより、前の回答で説明した余分な手順がすべて不要になります。

titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
0