Apache POI读取xlsx输入流问题

时间:2017-05-15 15:54:56

标签: java apache-poi dropwizard

请忽略这个问题:我最后的愚蠢解析错误。

我有一个允许文件上传的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()

,则相同的代码可以正常工作

有人遇到过同样的问题吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

我前一段时间遇到过类似的问题。我所做的只是拒绝使用Workbook.create(InputStream inp)方法。据我所知,这种方法即将被弃用。 The official documentation告诉我:

  1. Workbook.create(InputStream inp)消耗更多Workbook.create(File file)的内存。这就是为什么使用第二种方法要好得多。

  2. Workbook.create(InputStream inp)需要inp来支持marking and reseting或将其包含在PushbackInputStream中。这不是很棘手,但为什么要这样做,如果我们可以从File创建一个新的InputStream并使用更多内存有效的方法?

  3. 为了正确释放资源,Workbook应在使用后关闭。使用Workbook.create(File file)也需要这样做,因此在此使用Workbook.create(InputStream inp)没有任何利润。

  4. 毕竟,Apache POI的作者建议尽可能使用Workbook.create(File file)方法代替Workbook.create(InputStream inp)