赞
踩
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);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。