poi导出excel打开文件时部分内容有问题

Posted steveshao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poi导出excel打开文件时部分内容有问题相关的知识,希望对你有一定的参考价值。

问题描述:JavaWeb项目,ssm框架,从tomcat9.0.30换到weblogic10.3.6.0后,poi导出excel,打开文件时部分内容有问题;

解决:

  response.addHeader("Content-Length", "" + outfile.length()); 

  替换成:
  response.setHeader("Content-Length", "" + outfile.length()); 

分析一:   

    addHeader方法添加两个完全一样的信息时,总是为响应增加新的头部

    setHeader()添加两个完全一样的信息时,总是用新值去替换旧值

分析二:

    我用F12看了我这个下载方法的响应头

Response Headers:
    Content-Disposition: attachment;filename=项目设置-1592298665653.xlsx
    Content-Length: 4909
    Content-Type: application/octet-stream
    Date: Tue, 16 Jun 2020 09:11:05 GMT
    Transfer-Encoding: chunked

setHeader方法中,并没有最后标红的Transfer-Encoding: chunked,而在addHeader方法中是有这个方法的;

(这:我的response中并没有设置Transfer-Encoding这个字段,setHeader也只是覆盖了Content-Length,这是为什么。。。我tm太菜了嘛。。。)

分析三:

  这次只能分析Transfer-Encoding: chunked了:

分块编码(Transfer-Encoding: chunked)

1、Transfer-Encoding,是一个 HTTP 头部字段(响应头域),字面意思是「传输编码」。最新的 HTTP 规范里,只定义了一种编码传输:分块编码(chunked)。

2、分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。

3、数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。

4、具体方法
a)在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,报文中的实体需要改为用一系列分块来传输。

b)每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的 CRLF(
),也不包括分块数据结尾的 CRLF。

c)最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。

  big old: 看懂了吗?

  me: 没有

  big old: 呵呵(sb)

  大概意思是说:这东西是http的数据传输机制,一块块的传,不用考虑发送内容的总大小;

  me: 但是为什么生成的文件比不加Transfer-Encoding: chunked大了些,以至于打开文件时部分内容有问题(明明addHeader方法也设置了Content-Length)?

  big old: 

 

 

参考文章1:https://www.cnblogs.com/raychou1995/p/10201878.html

参考文章2:https://www.jianshu.com/p/da01a20a515e

 

  我也不知道为啥了,big old 来捶我吧!

 

以上是关于poi导出excel打开文件时部分内容有问题的主要内容,如果未能解决你的问题,请参考以下文章

急!!!java用poi导出excel文件,打开导出的文件时报错“文件错误,数据可能丢失”

关于 java poi 导出excel时 导出多个sheet的问题

关于 java poi 导出excel时 导出多个sheet的问题

poi导出excel问题

java 写excel 文件的问题,写完后 就把原来的内容清除了

java poi 在服务器生成excel文件