私はエクセルファイルをアップロードすることで受け取った番号を格納しなければならない機能に取り組んでいます。これは、Springフレームワークの下でApacheのpoiライブラリを使用してJavaで書かれています(これは無関係です)。apache POIは数値としてテキスト列を読み込みます
私は(カラムがすでにTextに設定されていることに注意してください)をアップロードしようとしているファイル:
コードは以下の通りです:
// function accepts "MultipartFile inputFile"
InputStream is = inputFile.getInputStream();
StreamingReader reader = StreamingReader.builder().rowCacheSize(100).bufferSize(4096).sheetIndex(0)
.read(is);
for (Row row : reader) {
System.out.println("Reading next row.");
System.out.println("row[0] is of type " + row.getCell(0).getCellType());
Cell cell = row.getCell(0);
String value = "";
if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
value = cell.getStringCellValue().replaceAll("[\\D]", "");
} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
value = NumberToTextConverter.toText(cell.getNumericCellValue());
}
System.out.println("Value is " + value);
}
そして私は」出力が下がる:
Reading next row.
row[0] is of type 0 // Which is equals to Cell.CELL_TYPE_NUMERIC
Value is 166609647
I ssueは、 '166609647'の代わりに '0166609647'と読み替える必要があるということです、これはxlsxファイルとして保存され、ファイルを再アップロードすると、これはxlsxファイルにのみ起こります。細胞型。何か案は?
- 考えると答えhttps://stackoverflow.com/a/19401902/1131470は、私たちはシートをストリーミングしている時に取得CellオブジェクトがStreamingCell対象になるだろうとして、サポートされていないDataFormatterクラスを使用しています:重複としてマークされているため
編集getCellStyle()関数を呼び出すと例外がスローされます。
2016年3月29日のよう
クラスStreamingCellがDataFormatterは、どのようなExcelのディスプレイをつかむために、現時点で入手可能な唯一のクラスですDataFormatterをサポートしていないようです。現在のソリューションは、Excelファイル全体をメモリに読み込むことに固執しています。将来誰かが回答を見つけた場合は、ここに回答を投稿してください。私は、現在の解決策が絶対にひどいものであることをとても感謝しています。そのライブラリのバージョンの問題を指摘したアクセルに
2016年3月31日のような特別な感謝は、0.2.12にストリーマのjarファイルを更新することで問題を解決します。ありがとう!
私はそれがhttps://github.com/monitorjbl/excel-streaming-readerであるのかもしれないと思います。したがって、最新版を使用していることを確認してください。 –
@AxelRichterありがとうございます。StreamingCellのクラスを見ていただきありがとうございます。https://github.com/monitorjbl/excel-streaming-reader/blob/master/src/main/java/com/monitorjbl /xlsx/impl/StreamingCell.javaでは、ほとんどの関数がUnsupportedExceptionをスローするようです。選択肢はありませんが、アップロードサイズを制限しながらファイル全体を読み返す必要があります。 –
あなたの言うことは真実ではありません。セルが 'Text'でフォーマットされている場合、OpenXMLではセルの型は' t = "s" 'であり、セルの値は' sharedStrings.xml'を指しています。だから 'row.getCell(0).getCellType()'は0にすることはできませんし、値は166609647にすることはできません。これは、セルが 'Text'としてフォーマットされていない**場合にのみ可能です。次に、フォーマッタが必要になります。 –