web-dev-qa-db-ja.com

セルの書式をテキストに設定する方法

Apache-POI 3.14を使用しています。セルを「テキスト」形式にロックダウンする必要があります。私のセルのデータはすべて数字である可能性がありますが、それでも文字列と見なされます。セルを書き込むときは、次のようにします。

cell.setCellValue("001");
cell.setCellType(Cell.CELL_TYPE_STRING);

Excelで出力ブックを開くと、セルに正しい値( "001")が含まれ、隅に小さな緑色の三角形が表示されます。感嘆符にカーソルを合わせると、吹き出しテキストThe number in this cell is formatted as text or preceded by an apostropheが表示されます。セルのフォーマット(右クリック->セルのフォーマット)を見ると、「カテゴリ」が「一般」と表示されています。これは「テキスト」であると思っていました。

ユーザーが数字のみを入力してセルの値を変更すると、問題が発生します。 「カテゴリ」は「一般」であるため、値は数値として入力および表示され、先行ゼロが削除されて右揃えされます。

Excelの[セルの書式設定]ダイアログと同じ結果を得るにはどうすればよいですか?

11
Steve H.

あなたはセルフォーマットをテキストに設定することを試みることができます

DataFormat fmt = wb.createDataFormat();
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(
    fmt.getFormat("@"));
cell.setCellStyle(cellStyle);

注:CellStylesは、該当するすべてのセルで再利用する必要があります。セルごとに新しいセルを作成しないでください。

.xlsx形式の「エラーを無視する」機能を使用することもできますが、サポートはまだ完全には行われていません。一部の Issue 46136 および Issue 58641 を参照してください進行中の議論。

追加情報については、 このMSDNページ も参照してください。

12
centic

HSSFの場合

    DataFormat fmt = workbook.createDataFormat();
    CellStyle textStyle = workbook.createCellStyle();
    textStyle.setDataFormat(fmt.getFormat("@"));
    sheet.setDefaultColumnStyle(0, textStyle);

列スタイル全体をTextに設定し、カテゴリをTextに設定するだけです。

ただし、XSSF形式を使用している場合は機能しません(私はApache Poi 3.15を使用しており、機能しませんでした)。この場合、上記のコードに加えて、テキストとして扱いたい各セルにスタイルを設定しました。

cell.setCellStyle(textStyle);

エラーについては、使用できます

sheet.addIgnoredErrors(new CellRangeAddress(0,9999,0,9999),IgnoredErrorType.NUMBER_STORED_AS_TEXT );

行0から9999まで、列0から9999までのNUMBER_STORED_AS_TEXTエラーは無視され、表示されません。

4

OPがApacheソリューションを求めているように見えます。いくつか検索した後、私はこの答えを見つけました:

HSSFCellStyle style = book.createCellStyle();
style.setDataFormat(BuiltInFormats.getBuiltInFormat("text"));
2

これをテストする手段はありませんが、テンプレートを使用してみましたか?すべてのセルがテキストとしてフォーマットされた空のExcelファイルですか?

0
Sebastian B

この場合、Apache-POI 3.15を使用しており、同じ問題が発生したため、スタイルでデータを検証しました。0より大きい数値と文字列が必要です。

try {
    if (Integer.parseInt(field + "") >= 0) {
        int valor = Integer.parseInt(field + "");
        cell.setCellValue(valor); //Int
    }
} catch (NumberFormatException nfe) {
    // no int
    try {
        if (Double.parseDouble(field + "") >= 0) {
            double valor = Double.parseDouble(field + ""); //double
            cell.setCellValue(valor);
        }
    } catch (NumberFormatException nfe2) {
        cell.setCellValue(field + ""); //String
    }
}
0
Algorithm

Apache POI 4.0.1の場合:

XSSFSheet sheet = workbook.createSheet("MySheetName");
sheet.addIgnoredErrors(new CellRangeAddress(0, 9999, 0, 9999), IgnoredErrorType.NUMBER_STORED_AS_TEXT);

シートを org.Apache.poi.xssf.usermodel.XSSFSheet にキャストし、 org.Apache.poi.ss.usermodel.Sheet にキャストしないように注意してください。それ以外の場合、メソッドはaddIgnoredErrorsは不明です。

0
Laurent