【发布时间】:2018-07-24 10:43:49
【问题描述】:
我正在开发一个功能,我必须存储通过上传 Excel 文件收到的数字。它是用 Java 编写的,使用 apache poi 库,在 Spring 框架下(无关紧要)。
我正在尝试上传的文件(请注意,该列已设置为文本):
代码如下:
// 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 166609999
问题是我需要将其读取为“0166609999”而不是“166609999”,奇怪的是,如果我将其保存为 xls 格式并重新上传文件,我对检测其单元格类型没有任何问题。有什么想法吗?
因被标记为重复而编辑:
- 给定答案https://stackoverflow.com/a/19401902/1131470 使用 DataFormatter 类,当我们流式传输工作表时不支持该类,因为检索到的 Cell 对象将是 StreamingCell 对象,如果我们调用 getCellStyle() 函数,则会引发异常。
截至 2016 年 3 月 29 日
似乎StreamingCell 类不支持DataFormatter,其中DataFormatter 是目前唯一可以获取Excel 显示内容的类。因此,当前的解决方案将坚持将整个 Excel 文件读入内存。如果将来有人找到答案,您可以在此处发布答案,我将不胜感激,因为当前的解决方案绝对是一个糟糕的解决方案。
截至 2016 年 3 月 31 日
特别感谢 Axel 指出其库版本问题,将流媒体 jar 文件更新到 0.2.12 解决了该问题。谢谢!
【问题讨论】:
-
我怀疑它可能位于github.com/monitorjbl/excel-streaming-reader。因此,请确保您使用的是最新版本。
-
@AxelRichter 非常感谢您指出,是的,当我查看 StreamingCell github.com/monitorjbl/excel-streaming-reader/blob/master/src/… 的类时,似乎大多数函数都会抛出 UnsupportedException。别无选择,但我必须在限制上传大小的同时重新阅读整个文件。
-
你说的不可能是真的。如果单元格格式为
Text,那么对于OpenXML,单元格的类型为t="s",并且单元格的值指向sharedStrings.xml。所以row.getCell(0).getCellType()不能为 0 且值不能为 166609647。这仅适用于单元格不格式为Text的情况。然后,只有这样,你才需要一个格式化程序。 -
我还没有将其解压缩为 zip 并查看 Xml 文件。但我已将文件托管在dropbox.com/s/hjz0dletdq3qk1i/test_formatted_number.xlsx?dl=0,您可以抓取并查看您希望的类型,感谢您的帮助 =)
标签: java excel apache apache-poi