java - Apache POI 读取 xlsx 输入流问题

标签 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;
    }
} 

如果我首先从 inputstream 创建一个 .xlsx 文件,然后将 File 对象传递给 WorkbookFactory,则相同的代码可以正常工作。创建()

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

最佳答案

我之前也遇到过类似的问题。我所做的只是拒绝使用 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 。这并不是很棘手,但是如果我们可以从 InputStream 创建一个新的 File 并使用更节省内存的方法,为什么要这样做呢?

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

  4. 毕竟,Apache POI 的作者建议使用 Workbook.create(File file) 方法,而不是 Workbook.create(InputStream inp) 。可能。

关于java - Apache POI 读取 xlsx 输入流问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43983928/

相关文章:

java - 上传到S3时如何设置内容类型和内容编码?

java - 为什么 catch block 在 Java 中未初始化变量时出错

java - Maven,更改配置文件的顺序会导致不同的构建目录结构

java - 可以在同一个 xls 表上读取和写入吗?

java - 如何在运行时检查子类是否是类的实例?

java - 使用 XSSFSheetXMLHandler 获取样式信息

java - 未报告的异常。必须被捕获或宣布被抛出

java - 在 Dropwizard 中设置必填配置字段

java - 如何使用内存中的 H2 数据库测试 JDBI DAO?

java - Jersey 2.x 带有属性的自定义注入(inject)注释