报错信息:
最近打开下载的 Excel,会报如下错误。(xls 格式不受影响)
解决方案:
下载代码(红色为新添代码)
public void download()
{string fileName = "456.zip";//客户端保存的文件名string filePath = AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "/") + "Excel/123.zip";System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);if (fileInfo.Exists == true){//每次读取文件,只读取1M,这样可以缓解服务器的压力const long ChunkSize = 1048576;byte[] buffer = new byte[ChunkSize];Response.Clear();//获取文件System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);//获取下载的文件总大小long dataLengthToRead = iStream.Length;//二进制流数据(如常见的文件下载)Response.ContentType = "application/octet-stream";//通知浏览器下载文件而不是打开 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
//加上设置大小下载下来的.xlsx文件打开时才不会报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”Response.AddHeader("Content-Length", iStream.Length.ToString());using (iStream)//解决文件占用问题,using 外 iStream.Dispose() 无法释放文件
{while (dataLengthToRead > 0 && Response.IsClientConnected){int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小Response.OutputStream.Write(buffer, 0, lengthRead);Response.Flush();dataLengthToRead = dataLengthToRead - lengthRead;}iStream.Dispose();iStream.Close();}Response.Close();Response.End();}
}
给下载加了个长度,解决问题。
Response.AddHeader("Content-Length", iStream.Length.ToString());
原文:asp.net NPOI导出xlsx格式文件,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”