小弟从事C#不久,很多东西还要学习,请教大家一个问题.
我现在要从DataTable生成一个excel文档,通过按钮来打开,但是发现如果只是新建一个excel对象
Excel.Application xApp=New Excel.Application();给它赋值之后使用xApp.Visiable=true;来显示.
碰到的问题就是,这样点按钮就直接打开,而没有下载的提示框.
但是使用FileInfo fileInfo = new FileInfo("@@###");来实现下载就必须要提供路径,而新建的这个excel对象没有保存的话应该还在内存中,没办法得到有效的路径.而我又不想使用book.Save()之类的方法直接保存到用户的文件系统中,而且这样也显然不合理.所以思来想去,我就使用book.SaveAs(#@#@)存到服务器的文件夹,再调用下载,然后再删除服务器中刚才新保存的excel文件.请问这样是否合适?会带来什么样的问题?谢谢大家了!下面是我的code:
Excel.Application xApp = new Excel.ApplicationClass();
//得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件
//Excel.Workbook xBook = xApp.Workbooks._Open(Server.MapPath("/Scripts/NewExcel.xlsx"),Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
Excel.Workbook xBook = xApp.Workbooks.Add(Missing.Value);
Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Worksheets[1];
xSheet.Cells[1, 1] = "SBbbbB11111";
xBook.SaveAs(Server.MapPath("/Scripts/sb.xlsx"),Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
xApp.Workbooks.Close();
xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出
System.Runtime.InteropServices.Marshal.ReleaseComObject(xApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xSheet);
GC.Collect(); FileInfo fileInfo = new FileInfo(Server.MapPath("/Scripts/sb.xlsx"));
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + "Hello.xlsx");
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
File.Delete(Server.MapPath("/Scripts/sb.xlsx"));
Response.End();
我现在要从DataTable生成一个excel文档,通过按钮来打开,但是发现如果只是新建一个excel对象
Excel.Application xApp=New Excel.Application();给它赋值之后使用xApp.Visiable=true;来显示.
碰到的问题就是,这样点按钮就直接打开,而没有下载的提示框.
但是使用FileInfo fileInfo = new FileInfo("@@###");来实现下载就必须要提供路径,而新建的这个excel对象没有保存的话应该还在内存中,没办法得到有效的路径.而我又不想使用book.Save()之类的方法直接保存到用户的文件系统中,而且这样也显然不合理.所以思来想去,我就使用book.SaveAs(#@#@)存到服务器的文件夹,再调用下载,然后再删除服务器中刚才新保存的excel文件.请问这样是否合适?会带来什么样的问题?谢谢大家了!下面是我的code:
Excel.Application xApp = new Excel.ApplicationClass();
//得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件
//Excel.Workbook xBook = xApp.Workbooks._Open(Server.MapPath("/Scripts/NewExcel.xlsx"),Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
Excel.Workbook xBook = xApp.Workbooks.Add(Missing.Value);
Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Worksheets[1];
xSheet.Cells[1, 1] = "SBbbbB11111";
xBook.SaveAs(Server.MapPath("/Scripts/sb.xlsx"),Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
xApp.Workbooks.Close();
xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出
System.Runtime.InteropServices.Marshal.ReleaseComObject(xApp);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xSheet);
GC.Collect(); FileInfo fileInfo = new FileInfo(Server.MapPath("/Scripts/sb.xlsx"));
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + "Hello.xlsx");
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
File.Delete(Server.MapPath("/Scripts/sb.xlsx"));
Response.End();
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货