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实现点击按钮,下载文件

最新文章

  1. java基础1.-------抽象类,抽象方法
  2. 小白如何进入IOS,答案就在这里
  3. PAT 1019. 数字黑洞 (20)
  4. 【翻译十一】java-原子性操作
  5. 转载:ODS简介
  6. 用O(1)的时间复杂度,找到栈和队列中的最小(大)值
  7. 使用C语言在Win控制台中输出带颜色的文字
  8. Hopfield模型
  9. centos 6.X 安装node
  10. JavaScript IDE 大盘点,让选择不再难
  11. UVALive 2323 Modular Multiplication of Polynomials(模拟)
  12. css解决内联元素间的空白间隔
  13. Unit 3.标签的分类和嵌套规则
  14. Jenkins系列之二——centos 6.9 + JenKins 安装
  15. day5 五、数字类型、字符串,列表类型的基本操作和内置方法
  16. tabel 选中行变色和取当前选中行值等问题
  17. 一个洛谷Material化的Stylish美化主题
  18. vue权限路由实现方式总结二
  19. Python爬虫scrapy-redis分布式实例(一)
  20. 12、Node.js 路由

热门文章

  1. Google&#39;s C++ coding style
  2. MUI ajax数据请求(list)
  3. nodeJS基础----&gt;nodeJS的使用(一)
  4. type 、instanceof、in 和 hasOwnproperty
  5. javascript:;禁用a标签默认功能的缺点。
  6. String() 函数把对象的值转换为字符串。
  7. IDEA Tomcat部署时war和war exploded区别以及平时踩得坑
  8. Linux下使用iotop检测磁盘io使用情况
  9. Scala面向对象和模式匹配
  10. MegaCli 监控raid状态 限戴尔服务器