宝哥软件园

Asp.net生成Excel文件并下载(更新:解决了用迅雷下载页面而不是文件的问题)

编辑:宝哥软件园 来源:互联网 时间:2021-10-11

这里,我们使用在服务器上创建Excel文件,然后使用文件地址下载的方法。见[原文]。Net创建Excel文件的方法(插入数据、修改格式、生成图表)。首先尝试回应的方法。WriteFile:复制代码如下: file info fi=new file info(excel file);//excelFile是服务器上文件的地址http response contextresponse=httpcontext . current . response;contextResponse。clear();contextResponse。Buffer=truecontextResponse。Charset=' GB2312//设置contextresponse . appendheader(' content-disposition ',string . format(' attachment;filename={0} ',ExcelName));//定义输出文件和文件名contextresponse . appendheader(' content-length ',fi . length . tostring());contextResponse。内容编码=编码。默认;contextResponse。content type=' application/ms-excel ';//将输出文件类型设置为excel文件。contextResponse。WriteFile(fi。全名);contextResponse。flush();contextResponse。end();第一行的excelFile是服务器上Excel文件的地址,如“C: 网站Excelxx.xlsx”。这种方法一般在网上也有提供,但是在实践中出现了意想不到的问题:Chrome下一切正常,Excel文件直接下载到Chrome的默认下载文件夹。image

在Firefox下,因为安装了FlashGot插件,会先选择应用的下载工具:image

这里的显示正常。如果选择“保存文件”,Excel文件也将保存在默认文件夹中。但是,如果您尝试第三方下载工具,如迅雷,将出现以下窗口:image

请注意,在网址列中,视图状态信息将添加在页面的实际地址之后,保存的名称不是Excel文件本身的名称,而是页面的名称。点击确定后,下载的文件再次变成实际文件(有时先变成. zip文件,再变成实际文件)image

在IE7 image下。

先弹出保存对话框,文件正常。还有,因为安装了迅雷,当你点击保存时,会弹出迅雷的下载对话框。与火狐不同,网址后面没有视图状态信息。image

点击确定,下载的页面文件为:image

如果在迅雷的下载对话框中点击取消,将使用IE下载,这里的文件再次正确:image

我怀疑迅雷根据下载对话框中的URL重新请求下载,与发起请求的页面无关,IE不会将ViewState信息传输给迅雷,导致下载的文件不是想要的Excel页面。之后我尝试分段下载,其实是无效的,因为迅雷根本就忽略了你提供给它的下载机制,而在火狐下调用迅雷的时候,因为分段下载的Viewstate不包含Excel文件的完整信息,所以迅雷下载了不完整的文件。最后,我们只能使用最古老的解决方案:响应。重定向(),并转到实际的文件地址。复制代码如下: file infofi=new file info(excel file);HttpResponse contextResponse=HttpContext。当前。响应;contextResponse。重定向(字符串。格式(' ~/Template/{0} ',excelName),false);这样,三种浏览器下的所有测试都是正常的,因为实际文件的地址是被请求的,而实际文件的地址也在迅雷中显示。下载不会有问题。但是这相当于把文件的实际地址告知了客户端,私密性不好。但是这里不需要好的隐私,文件过了一定时间就会被删除,所以问题不大。以上是第一次考虑的结果,不过好像有点懒.后知后觉,既然迅雷其实每次都要重新请求URL,那么我们应该给迅雷传递一个可以生成Excel文件的URL。即点击“生成Excel”按钮,转到另一个导出页面,在该页面的Page_Load方法中完成生成Excel文件和下载Excel文件的步骤。复制代码如下: string filename=request . query string[' filename '];字符串导出名称=请求。查询字符串['导出'];if(fileName!=null){ export ManagEment。create EXcel(FIlename);//先在服务器上创建Excel文件。回应。重定向(字符串。格式(' {0}?导出={1} ',请求。Path.ToString(),fileName));//重定向到此页面,但查询参数更改为导出。} else if(exportName!=null){ export ManagEment。export EXcel(export name);//下载Excel文件。}这里页面跳转两次,第一次是生成Excel,第二次是下载Excel。跳两次的原因是迅雷会抓取最后一个网址。如果生成和下载一起进行,迅雷在下载时会反复生成Excel文件。回应。本文开头介绍的Write方法用于下载Excel文件的代码export manger . export EXcel(export name)。也可以分段下载:复制代码如下: if(fi . length 0){ filestream Sr=new filestream(fi . full name,system.io.filemode.open,system.io.fileaccess.read,system . io . file share . read);int size=1024//设置每次读数的长度。for(int I=0;我菲。长度/尺寸1;I){ byte[]buffer=new byte[size];int length=sr.Read(缓冲区,0,大小);contextResponse。OutputStream.Write(缓冲区,0,长度);} sr.Close()。} else { contextResponse。WriteFile(fi。全名);}这里的结果是Excel只生成一次,保存在服务器中,每次都会下载同一个文件,参数为‘Export’。如果所需文件只是一次性的,需要在每次下载时重新生成,只需要将下载和生成导出页面放在一起即可。然后更改初始响应。将方法写入:复制代码如下: contextResponse。flush();菲。delete();contextResponse。end();也就是说,在清空每个响应后,先删除文件,然后结束响应。这样既可以解决下载工具无法使用的问题,同时又可以保护服务器文件地址的隐私,并且可以分段写入的方式写入大文件,生成的文件可以根据需要立即删除,不占用服务器空间。

更多资讯
游戏推荐
更多+