请忽略这个问题:我最后的愚蠢解析错误。
我有一个允许文件上传的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;
}
}
如果我首先从.xlsx
创建inputstream
文件,然后将File
对象传递给WorkbookFactory.create()
有人遇到过同样的问题吗?谢谢你的帮助。
答案 0 :(得分:3)
我前一段时间遇到过类似的问题。我所做的只是拒绝使用Workbook.create(InputStream inp)
方法。据我所知,这种方法即将被弃用。 The official documentation告诉我:
Workbook.create(InputStream inp)
消耗更多Workbook.create(File file)
的内存。这就是为什么使用第二种方法要好得多。
Workbook.create(InputStream inp)
需要inp
来支持marking and reseting或将其包含在PushbackInputStream中。这不是很棘手,但为什么要这样做,如果我们可以从File
创建一个新的InputStream
并使用更多内存有效的方法?
为了正确释放资源,Workbook
应在使用后关闭。使用Workbook.create(File file)
也需要这样做,因此在此使用Workbook.create(InputStream inp)
没有任何利润。
毕竟,Apache POI的作者建议尽可能使用Workbook.create(File file)
方法代替Workbook.create(InputStream inp)
。