报错信息:
最近打开下载的 Excel,会报如下错误。(xls 格式不受影响)


解决方案:
下载代码(红色为新添代码)
1public void download() 2{ 3 string fileName = "456.zip";//客户端保存的文件名 4 string filePath = AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "/") + "Excel/123.zip"; 5 6 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); 7 8 if (fileInfo.Exists == true) 9 { 10 //每次读取文件,只读取1M,这样可以缓解服务器的压力 11 const long ChunkSize = 1048576; 12 byte[] buffer = new byte[ChunkSize]; 13 14 Response.Clear(); 15 //获取文件 16 System.IO.FileStream iStream = System.IO.File.OpenRead(filePath); 17 //获取下载的文件总大小 18 long dataLengthToRead = iStream.Length; 19 //二进制流数据(如常见的文件下载) 20 Response.ContentType = "application/octet-stream"; 21 //通知浏览器下载文件而不是打开 22 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName)); 23 //加上设置大小下载下来的.xlsx文件打开时才不会报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃” 24 Response.AddHeader("Content-Length", iStream.Length.ToString()); 25 using (iStream)//解决文件占用问题,using 外 iStream.Dispose() 无法释放文件 26 { 27 while (dataLengthToRead > 0 && Response.IsClientConnected) 28 { 29 int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小 30 Response.OutputStream.Write(buffer, 0, lengthRead); 31 Response.Flush(); 32 dataLengthToRead = dataLengthToRead - lengthRead; 33 } 34 iStream.Dispose(); 35 iStream.Close(); 36 } 37 38 Response.Close(); 39 Response.End(); 40 } 41}
给下载加了个长度,解决问题。
Response.AddHeader("Content-Length", iStream.Length.ToString());
原文:asp.net NPOI导出xlsx格式文件,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”