当前位置:   article > 正文

SpringBoot + Dubbo + Excel生成并下载问题汇总:_your inputstream was neither an ole2

your inputstream was neither an ole2

SpringBoot + Dubbo + Excel生成并下载问题汇总:


1. ClassPathResource 读不到src/main/resources下的 templates/excel下的excel模板文件。(excel是我在templates下自己新建的目录)
解决方法:挪到templates下解决
疑问:为什么templates/excel下不行?待研究考证

下面是网上看别人的一些分析,待研究。

因为我知道Resource resource = new ClassPathResource("templateFile/test.xlsx");就是到classPath*(注意这里有个*)下去找,然后就去项目本地的目录下找classPath下是否有这个文件(maven的classPath在 “target\classes”目录下),就发现并没有这个文件在。

后面仔细想想这是Maven项目啊,所以就找pom.xml文件去看看,突然想起:maven默认只会加载classPath同级目录下文件(配置那些),其他的需要配置<resources>标签:

<build>
  <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <!--是否替换资源中的属性-->
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
          <include>**/*.yml</include>
          <include>**/Dockerfile</include>
          <include>**/*.xlsx</include>
        </includes>
        <!--是否替换资源中的属性-->
        <filtering>false</filtering>
      </resource>
  </resources>
</build>

2. Your InputStream was neither an OLE2 stream, nor an OOXML stream。 
原因是使用maven项目对excel模板做了编译,导致模板无法被poi解析。
解决方法:在pom文件里添加如下配置,打包时不编译excel文件。
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <configuration>
                <nonFilteredFileExtensions>
                    <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                    <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                </nonFilteredFileExtensions>
            </configuration>
        </plugin>
    </plugins>
</build>

3. WorkbookFactory.create(fis)报org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)空文件异常。
前提:我用的是dubbo微服务,服务生产端写好Workbook后返回给服务消费端,消费端再调用wb.write(response.getOutputStream());写入response对象返回给前端,这样写就出现空文件异常。
解决方法:服务生产端将wb写入自己new的ByteArrayOutputStream然后生成一个byte[]数组返回给服务消费端,消费端拿到数组后写入HttpServletResponse的输出流中。
疑问:dubbo不支持这种包含流对象的rpc调用吗?待研究考证
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();, wb.write(outputStream); 然后byte[] bt = outputStream.toByteArray(); 最后 OutputStream out = response.getOutputStream(); out.write(bt);
一下代码是参考别人的代码仅供查看!
        Workbook wb = ReflectExcelUtils.INSTANCE.getWorkBook(serviceExcelInfoList, ServiceExcelInfo.class);
        ResponseUtil.asFileDownload(response,filename);
       
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        wb.write(outputStream);

        ByteArrayInputStream tempIn = new ByteArrayInputStream(outputStream.toByteArray());
        response.setHeader("Content-Length", String.valueOf(tempIn.available()));
        OutputStream out = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int a;
        while ((a = tempIn.read(buffer)) != -1) {
            out.write(buffer, 0, a);
        }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/195434
推荐阅读
相关标签
  

闽ICP备14008679号