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

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);
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值