请忽略这个问题:我这边出现愚蠢的解析错误。
我有一个 API,它允许文件上传并使用 Apache POI 读取文件(如果文件类型不是 .xlsx,则抛出异常)。但是,似乎 WorkbookFactory.create(inputstream) 没有生成正确的文件。当我在代码中读取文件时,在读取应存在数据的单元格时会得到 null
值。
代码如下:
@POST
@Path("<path>")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response submitFile(@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail verticalId) {
try {
StringBuilder fileNameBuilder = new StringBuilder();
String[] names = fileDetail.getFileName().replace(" ", "_").split("\\.");
Contents contents = fileParser.parse(uploadedInputStream);
return Response.ok().build();
}
public class XlsxParser implements FileParser {
public Content parse(File file) throws IOException InvalidFileFormatException{
Content content = new Content();
Workbook file;
try {
designFile = WorkbookFactory.create(file);
} catch (InvalidFormatException exception) {
throw new InvalidFileFormatException("Invalid file format. Expected file type is .xlsx");
}
Sheet sheet = file.getSheetAt(0);
Iterator<Row> rowIterator = sheet.rowIterator();
Row row = rowIterator.next();
int cellCount = row.getPhysicalNumberOfCells();
return content;
}
}
如果我首先从 inputstream
创建一个 .xlsx
文件,然后将 File
对象传递给 WorkbookFactory,则相同的代码可以正常工作。创建()
有人遇到过同样的问题吗?感谢您的帮助。
最佳答案
我之前也遇到过类似的问题。我所做的只是拒绝使用 Workbook.create(InputStream inp) 方法。据我所知,这种方法即将被弃用。 The official documentation告诉我们:
Workbook.create(InputStream inp)
比Workbook.create(File file)
消耗更多内存。这就是为什么使用第二种方法要好得多。
<Workbook.create(InputStream inp)
需要inp
支持 marking and reseting或被包裹成PushbackInputStream 。这并不是很棘手,但是如果我们可以从InputStream
创建一个新的File
并使用更节省内存的方法,为什么要这样做呢?为了正确释放资源,
Workbook
应在使用后关闭。使用Workbook.create(File file)
也需要这样做,因此在这里使用Workbook.create(InputStream inp)
没有任何好处。毕竟,Apache POI 的作者建议使用
Workbook.create(File file)
方法,而不是Workbook.create(InputStream inp)
。可能。
关于java - Apache POI 读取 xlsx 输入流问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43983928/