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同级目录下文件(配置那些),其他的需要配置标签:


 
     
        src/main/java
       
          **/*.properties
          **/*.xml
       

       
        false
     

     
        src/main/resources
       
          **/*.properties
          **/*.xml
          **/*.yml
          **/Dockerfile
          **/*.xlsx
       

       
        false
     

 

2. Your InputStream was neither an OLE2 stream, nor an OOXML stream。 
原因是使用maven项目对excel模板做了编译,导致模板无法被poi解析。
解决方法:在pom文件里添加如下配置,打包时不编译excel文件。

    
        
            org.apache.maven.plugins
            maven-resources-plugin
            
                
                    xlsx
                    xls
                

            

        

    

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

你可能感兴趣的:(java,java,excel,poi)