asp.net mvc 图片路径EXCEL到指定路径

Copyright ©
Yuucn Inc.&&All rights reserved.
电脑学习网-安全?专业?价值&&&&版权所有
工信部备案:
全国服务热线:&&400-000-1493&&&&侵权投诉专线:&&027-您现在的位置: &
Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法。 生成Excel文件的方法,见:【原】.Net创建Excel文件(插入数据、修改格式、生成图表)的方法 先试用Response.WriteFile的方法:   复制代码 代码如下:  FileInfo fi = new FileInfo(excelFile);//excelFile为文件在服务器上的地址 HttpResponse contextResponse = HttpContext.Current.R contextResponse.Clear(); contextResponse.Buffer = contextResponse.Charset = "GB2312"; //设置了类型为中文防止乱码的出现 contextResponse.AppendHeader("Content-Disposition", String.Format("filename={0}", excelName)); //定义输出文件和文件名 contextResponse.AppendHeader("Content-Length", fi.Length.ToString()); contextResponse.ContentEncoding = Encoding.D contextResponse.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 contextResponse.WriteFile(fi.FullName); contextResponse.Flush(); contextResponse.End();
其中第一行的excelFile为Excel文件在服务器上的地址,比如:“C:\Website\Excel\xx.xlsx”。 这种方法也是网上一般提供的方法,但在实际操作中,却出现了意向不到的问题: 在Chrome下 一切正常,Excel文件直接下载到Chrome的默认下载文件夹中。
  在Firefox下
  由于安装了FlashGot插件,会先选择应用的下载工具:
  在这里显示是正常的,如果选择“保存文件”,Excel文件也会被保存到默认文件夹中,但如果试用第三方下载工具,比如迅雷,会出现如下窗口:
  注意到网址一栏,会在页面实际地址后添加ViewState信息,而另存名称也不是Excel文件本身的名称,而是页面的名称。
  点击确定后,被下载的文件又变成了实际文件(有时会先变成.zip文件,再变为实际文件)
  在IE7下
  会先弹出保存对话框,文件正常,同样因为装了迅雷的缘故,点保存时,弹出迅雷的下载对话框,和Firefox下不同,网址后面没有ViewState信息。
  点确定,下载的则是页面文件:
  如果在迅雷的下载对话框中点取消,则会使用IE的下载,这里的文件又是正确的了:
  怀疑迅雷是根据下载对话框中的网址重新请求下载,与发起请求的页面已经无关,而IE又不会把ViewState信息传到迅雷中,导致下载的文件不是想要的Excel页面。
  之后又尝试了分段下载的方式,其实也是无效的,因为迅雷根本不理会你提供给它的下载机制,而且这样在Firefox下调用迅雷时,由于分段下载的Viewstate并不包含Excel文件的完整信息,迅雷下载下的也是残缺的文件。
  最后只能采用最老土的解决方法:Response.Redirect(),转向实际文件地址。  复制代码 代码如下:  FileInfo fi = new FileInfo(excelFile); HttpResponse contextResponse = HttpContext.Current.R contextResponse.Redirect(string.Format("~/Template/{0}", excelName), false);
这样在三个浏览器下测试都正常了,因为请求的是实际文件的地址,在迅雷中显示的也是实际文件的地址。下载就不会出现问题。但这样相当于告知客户端用户文件的实际地址,隐私性不佳。但好在这里并不需要太好的隐私性,而且文件会在一定时间之后删除,所以倒并不是太大的问题了。 上面是第一次考虑的结果,似乎还是有些懒了…… 事后考虑,既然每次迅雷实际都是重新请求URL,那么我们就应该给迅雷传入一个能生成Excel文件的URL。 即,在点击“生成Excel”按钮的时候,转向另一个Export页面,在这个页面的Page_Load方法中完成生成Excel文件、下载Excel文件的步骤。   复制代码 代码如下:  String fileName = Request.QueryString["FileName"]; String exportName = Request.QueryString["Export"]; if(fileName != null) { ExportManger.CreateExcel(fileName);//先在服务器端创建Excel文件。 Response.Redirect(String.Format("{0}?Export={1}",Request.Path.ToString(),fileName));//重定向到本页面,但Query参数变为Export。 } else if(exportName != null) { ExportManger.ExportExcel(exportName);//下载Excel文件。 }
这里页面跳转了两次,第一次是生成Excel,第二次是下载Excel。 之所以跳转两次,是因为迅雷会捕获最后的URL,如果生成和下载放在一起进行,那么迅雷下载时会重复再生成一遍Excel文件。下载Excel文件的代码ExportManger.ExportExcel(exportName)就使用了本文开头介绍的Response.Write方法,也可以用分段下载的方法:   复制代码 代码如下:  if(fi.Length & 0) { FileStream sr = new FileStream(fi.FullName,System.IO.FileMode.Open,System.IO.FileAccess.Read, System.IO.FileShare.Read); int size = 1024;//设置每次读取长度。 for (int i = 0; i & fi.Length / size + 1; i++) { byte[] buffer = new byte[size]; int length = sr.Read(buffer, 0, size); contextResponse.OutputStream.Write(buffer, 0, length); } sr.Close(); } else { contextResponse.WriteFile(fi.FullName); }
这里的结果是只生成了一次Excel并在服务器保留,以后每次下载的时候都使用带"Export"的参数下载相同的文件。那么如果需要文件只是一次性的,每次下载都需要重新生成,则只需要把Export页面的下载和生成放到一起。然后把开头的Response.Write方法最后变成:   复制代码 代码如下:  contextResponse.Flush(); fi.Delete(); contextResponse.End();
即每次响应清空后把文件先删除,再结束响应。这样就解决了利用下载工具出现的下载不能的问题,同时保护了服务器文件地址的隐私,并可以采用分段写入的方法写入大文件,而且可以按需要即时删除生成的文件而不占用服务器空间。
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-IT技术博客IT技术博客,精选各种精华文章供您阅读,是您学习各种IT技术的博客优选之地评论通常 我们导出Excel文件时,都是直接把HTML文本直接写入HTTP流,而把回发内容设置为Excel文件。以这种方式导出的文件扩展名为xls 但实际内容仍然只是HTML,用Office2003打开时是不会出问题的,但是由于EXCEL2007增强了安全性,默认情况下打开文件类型非Excel的文件时都会弹出确认对话框,如下图所示:
微软官方给出的解决方法是:
这个方法实际上只是修改用户Excel的设置,根本不是提高用户体验。。。。。。
在百度上搜了好久,没找到解决方法,自己写了一段代码用来解决这个问题。
大致原理:
刚开始想使用Excel模型生成Excel文件。但发现这个方法生成的文件依然会出现这个对话框。。。。
所以就使用Excel2007新建了一个Excel文件,放在Web应用程序目录中,每次生成的时候在临时文件夹中创建其副本,把内容写入文件,再回发到客户端,这样生成的Excel文件其实是在标准的Excel文件上修改的,所以就没有了问题。
1.点击生成Button,从DataTable中读取数据生成Excel表格:
//点击导出按钮 2 &
protected void btnExport_Click(object sender, EventArgs e) 3
string strMapPath = Server.MapPath("~/");
//获取Web应用程序的物理路径 5 &
string sourceExcelFileName = strMapPath + "Temp.xls";
//源Excel文件名 6 &
string targetExcelFileName = strMapPath + @"TempExcel\" + Guid.NewGuid().ToString() + ".xls";
//使用Guid生成全局唯一字符串,作为目标Excel文件的文件名 7 & 8
File.Copy(sourceExcelFileName, targetExcelFileName);
//Copy文件,放在目标文件夹中 9 10
//Excel模型,用来操作Excel文件11 &
Microsoft.Office.Interop.Excel.Application excelApp = null;12
Microsoft.Office.Interop.Excel.Workbook excelWb = null;13
Microsoft.Office.Interop.Excel.Worksheet excelWs = null;14
Microsoft.Office.Interop.Excel.Range excelR = null;15 16
excelApp = new Microsoft.Office.Interop.Excel.Application();19
excelWb = excelApp.Workbooks.Open(targetExcelFileName);
//打开Excel工作簿文件20
excelWs = (Microsoft.Office.Interop.Excel.Worksheet)(excelWb.Sheets.get_Item(1));
//选择工作簿中第一个工作表21 22
//向Excel中添加列名23
for (int i = 0; i & dtbl.Columns.C i++)24
string rangeName = ((Char)(i + 65)).ToString() + "1";
//计算出单元格的位置(例:第一行第二列在Excel中为B1,即为值为1+65的字符+"1"。)26
excelR = excelWs.get_Range(rangeName);27
excelR.Value = dtbl.Columns[i].ColumnN
//在对应单元格中写入值28
//把每一行数据写入Excel模型中31
for (int i = 0; i & dtbl.Rows.C i++)32
for (int j = 0; j & dtbl.Columns.C j++)34
string rangName = ((Char)(j + 65)).ToString() + (i + 2).ToString();
//表格内容的写入从第二行开始36
excelR = excelWs.get_Range(rangName);37
excelR.Value = dtbl.Rows[i][j];
//在Excel中写入对应单元格的内容38
excelWb.Save();41 42
catch (Exception)44
Response.Write("&script type='text/javascript'&alert('生成失败!');&/script&");46
//关闭Excel,否则Excel文件将无法被打开50
excelWb.Close();51
excelApp.Workbooks.Close();52
excelApp.Quit();53
//向客户端发送文件...56
Response.Clear();57
Response.AddHeader("Content-Disposition", "filename=excel.xls");
//设置回发内容为Excel58
Response.ContentType = "application/ms-excel";59
Response.WriteFile(targetExcelFileName);
//把刚刚生成的Excel文件写入Http流60
Response.End(); 61 62
2.由于会在临时文件夹中存储Excel文件,所以写了一个类用来清理过期不用的Excel文件:
1 /// &summary& 2 /// TempExcelCleaner 清理TempExcel文件夹中已经不用的临时Excel文件 3 /// &/summary& 4 public class TempExcelCleaner 5 { 6
private string tempDirectoryP 7
private int overtime = 30; 8
private int sleeptime = 60; 9 10
/// &summary&11
/// 每次扫描文件夹的间隔时间,单位分钟12
/// &/summary&13
public int Sleeptime14
get { return }16
set { sleeptime = }17
/// &summary&20
/// 文件过期时间,单位分钟21
/// &/summary&22
public int Overtime23
get { return }25
set { overtime = }26
/// &summary&29
/// 构造TempExcelCleaner30
/// &/summary&31
/// &param name="tempDirectoryPath"&要清理的文件夹路径&/param&32
public TempExcelCleaner(string tempDirectoryPath)33
this.tempDirectoryPath = tempDirectoryP35
private TempExcelCleaner()38
/// &summary&42
/// 运行,开始清理指定文件夹43
/// &/summary&44
public void Run()45
DirectoryInfo directory = new DirectoryInfo(tempDirectoryPath);47
//遍历文件夹中所有文件,超过指定时间就删除48
foreach (FileInfo file in directory.GetFiles())49
DateTime createTime = file.CreationT51
if (createTime.AddMinutes(overtime) & DateTime.Now)52
file.Delete();54
//遍历完所有文件,休息指定时间57
System.Threading.Thread.Sleep(sleeptime * 60 * 1000);58
3.在Golobal.asax中的代码,在Web应用程序启动时开始临时文件清理的服务:
void Application_Start(object sender, EventArgs e) 2
// 在应用程序启动时运行的代码 4
// Web应用程序启动时开始执行清理程序。 5
System.Threading.Thread threadTempExcelCleaner = new System.Threading.Thread(new System.Threading.ThreadStart(FunCleanTempExcel)); 6
threadTempExcelCleaner.IsBackground = true; 7
threadTempExcelCleaner.Start(); 8
void FunCleanTempExcel()11
TempExcelCleaner cleaner = new TempExcelCleaner(@"F:\Users\Administrator\Documents\Visual Studio 2010\WebSites\ExportExcel\TempExcel");13
cleaner.Run();14
源代码下载:/file/f6f40bc9b1#ExportExcel.rar
* 转载注明出处&感谢支持!作者:
23:42 推荐.NET配套的通用数据层ORM框架:文章分类 (8504) (2370) (1192) (135)文章档案 (1) (7) (23) (3) (834) (988) (1834) (1604) (735) (891) (688) (572) (283) (38)最新文章阅读排行榜友情链接☉&&( 15:58:5)☉&&( 15:50:20)☉&&( 3:41:46)☉&&( 13:28:21)
AdSense专题
Powered By
Designed by Han'space在ASP_NET中读写Excel文件有四种解决方案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
&&¥2.00
&&¥2.00
&&¥2.00
&&¥1.00
&&¥1.00
&&¥0.50
&&¥1.00
喜欢此文档的还喜欢
在ASP_NET中读写Excel文件有四种解决方案
在​A​S​P​.​N​E​T​中​读​写​E​x​c​e​l​文​件​有​四​种​解​决​方​案
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢

我要回帖

更多关于 asp.net 获取绝对路径 的文章

 

随机推荐