【小坑】java下载excel文件
excel文件的导入导出是很常见的功能,这次做了个下载的功能,踩了一些坑,记下来避免以后重复踩……
1、inputstream序列化问题
Could not write JSON document: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer
客户端调取服务端上传,从前台获取的file文件中拿到inputstream,做一些判断后(格式校验、大小校验等)将inputstream作为参数传给服务端报如下错误:
Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON document: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
因为输入流InputStream序列化错误。计算机传输数据实际上是二进制的传输,将inputstream转化为字节数组就可以通过网络流进行传输了,使用byte[] 来替代InputStream。
2、读取resources下的xlsx文件
将xlsx文件放项目resources目录下,通过以下代码本地调试通过:
InputStream templateStream = ClassUtils.getDefaultClassLoader().getResourceAsStream(TEMPTALTE); int len = templateStream.available(); byte[] readBuf = new byte[len]; templateStream.read(readBuf, 0, len);
将inputstream读入到readBuf里,再将readBuf传给服务端。本地测试通过,放到测试环境,于是开始了填坑……
3、java.util.zip.ZipException: invalid stored block lengths
(参考:Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths)
是因为打为jar包时对resources资源文件进行了转码压缩,直接读取inputstream使用无法识别。将jar包解压缩,打开里面的xlsx文件,报错提示:
按文中办法添加maven插件,打包时对xls和xlsx文件不进行转码压缩。
<plugin> <groupId>org.apache.maven.plugins</groupId> <version>2.6</version> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> <nonFilteredFileExtensions> <nonFilteredFileExtension>xlsx</nonFilteredFileExtension><!--xlsx结尾的文件不压缩--> </nonFilteredFileExtensions> </configuration> </plugin>
添加排除xlsx打包压缩之后,从打完的jar包解压缩出的xlsx可以正常打开。
4、read读取的问题
由提示信息得知:这个问题报的是格式或扩展名的问题。而扩展名是没有问题了,经检查发现是格式的问题,本地调试的时候读取的是正确完整的byte[]数据,测试环境读取的不全或没有读取数据。
查看inputstream的 read(byte b[], int off, int len) 方法
* Reads up to <code>len</code> bytes of data from the input stream into
* an array of bytes. An attempt is made to read as many as
* <code>len</code> bytes, but a smaller number may be read.
* The number of bytes actually read is returned as an integer.
修改如下:
InputStream templateStream = ClassUtils.getDefaultClassLoader().getResourceAsStream(TEMPLATE); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; int num = -1; while((num = templateStream.read(buffer)) != -1){ baos.write(buffer, 0, num); } baos.flush(); baos.toByteArray(); baos.close();
5、excel单元格包含换行
读取excel到json,然后通过fastjson反序列化为list对象。当excel单元格包含换行符时报错:(参考:用java导入导出excel如何去掉软回车和硬回车)
Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value excel
一种方法是替换掉excel的特殊字符
for(int i=10;i<14;i++) { str = str.replaceAll(String.valueOf((char)i), ""); }
另一种方法是正则替换
//空格\t、回车\n、换行符\r、制表符\t Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(str); dest = m.replaceAll("");
6、ajax下载
由于ajax函数的返回类型只有xml、text、json、html等类型,没有“流”类型,所以通过ajax去请求该接口是无法下载。查看XHR,可以看到返回的报文体。
- window.open("下载文件的后端接口")
- 构建一个表单实现下载
(参考:JS实现点击按钮,下载文件)
- java 下载样板Excel文件
- java 通用文件下载 excel,pdf,word,jpg
- java 利用 poi 生成 Excel文件与spring使用文件流形式下载文件
- Java导出页面数据或数据库数据至Excel文件并下载,采用JXL技术,小demo(servlet实现)
- Java通用的Excel文件生成工具类,支持生成文件和浏览器直接下载
- java 下载文件 例:excel
- JXL生成的excel文件+JAVA文件下载功能
- Java通用的Excel文件生成工具类,支持生成文件和浏览器直接下载(未测试)
- java 多excel下载 打成zip压缩包 程序中创建文件 响应到浏览器
- java 动态生成多个excel文件打成zip包供用户下载
- java 多excel下载 打成zip压缩包 程序中创建文件 响应到浏览器(二)
- jsp里使用java excel api实现文件下载
- java --struts2数据库导出Excel文件,下载提示
- java使用freemarker模版下载成Excel文件
- java 通用文件下载 excel,pdf,word,jpg,exe,rar
- java下载excel文件在firefox中文件名为乱码
- JAVA JXL -----excel文件生成、在线打开和下载
- java实现赋值excel模板,并在新文件中写入数据,并且下载
- Java Excel文件下载
- java 中 excel生成并文件下载保存到本地(三)