综合参考了网上的方法,生成Excel文件提供下载,然后删除生成的Excel文件。
1、引用Microsoft.Office.Interop.Excel;( 属性里的嵌入互操作类型改为Fasle)
2、Default10.aspx
<% @ Page Language = " C# " AutoEventWireup = " true " CodeFile = " Default10.aspx.cs " Inherits = " Default10 " %> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > < html xmlns ="http://www.w3.org/1999/xhtml" > < head runat ="server" > < title ></ title > </ head > < body > < form id ="form1" runat ="server" > < div > < asp:Button ID ="ExportToExcel" runat ="server" Text ="导出Excel" onclick ="ExportToExcel_Click" /> </ div > </ form > </ body > </ html >
3、Default10.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Excel = Microsoft.Office.Interop.Excel; // 添加引用 public partial class Default10 : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { } protected void ExportToExcel_Click( object sender, EventArgs e) { Excel.Application excel1 = new Excel.Application(); excel1.DisplayAlerts = false ; Excel.Workbook workbook1 = excel1.Workbooks.Add(Type.Missing); excel1.Visible = false ; Excel.Worksheet worksheet1 = (Excel.Worksheet)workbook1.Worksheets[ " sheet1 " ]; // 表头 worksheet1.Cells[ 1 , 1 ] = " 姓名 " ; // Excel里从第1行,第1列计算 worksheet1.Cells[ 1 , 2 ] = " 性别 " ; worksheet1.Cells[ 1 , 3 ] = " 联系电话 " ; System.Data.DataTable dt = GetTestData( 100 ); for ( int i = 0 ; i < dt.Rows.Count; i ++ ) { for ( int j = 0 ; j < dt.Columns.Count; j ++ ) worksheet1.Cells[i + 2 , j + 1 ] = dt.Rows[i][j].ToString(); } string fileName = DateTime.Now.ToString( " yyyyMMddHHmmss " ) + " .xls " ; string filePath = Server.MapPath( " ~/ " + fileName); workbook1.SaveAs(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); excel1.Workbooks.Close(); excel1.Quit(); int generation = GC.GetGeneration(excel1); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel1); excel1 = null ; GC.Collect(generation); // 打开要下载的文件,并把该文件存放在FileStream中 System.IO.FileStream Reader = System.IO.File.OpenRead(filePath); // 文件传送的剩余字节数:初始值为文件的总大小 long Length = Reader.Length; HttpContext.Current.Response.Buffer = false ; HttpContext.Current.Response.AddHeader( " Connection " , " Keep-Alive " ); HttpContext.Current.Response.ContentType = " application/octet-stream " ; HttpContext.Current.Response.AddHeader( " Content-Disposition " , " attachment; filename= " + fileName); HttpContext.Current.Response.AddHeader( " Content-Length " , Length.ToString()); byte [] Buffer = new Byte[ 10000 ]; // 存放欲发送数据的缓冲区 int ByteToRead; // 每次实际读取的字节数 while (Length > 0 ) { // 剩余字节数不为零,继续传送 if (Response.IsClientConnected) { // 客户端浏览器还打开着,继续传送 ByteToRead = Reader.Read(Buffer, 0 , 10000 ); // 往缓冲区读入数据 HttpContext.Current.Response.OutputStream.Write(Buffer, 0 , ByteToRead); // 把缓冲区的数据写入客户端浏览器 HttpContext.Current.Response.Flush(); // 立即写入客户端 Length -= ByteToRead; // 剩余字节数减少 } else { // 客户端浏览器已经断开,阻止继续循环 Length = - 1 ; } } // 关闭该文件 Reader.Close(); if (System.IO.File.Exists(filePath)) System.IO.File.Delete(filePath); } System.Data.DataTable GetTestData( int num) // 测试数据 { System.Data.DataTable dt = new System.Data.DataTable(); System.Data.DataRow dr; dt.Columns.Add( new System.Data.DataColumn( " ContactName " , typeof (String))); dt.Columns.Add( new System.Data.DataColumn( " ContactSex " , typeof (String))); dt.Columns.Add( new System.Data.DataColumn( " ContactPhone " , typeof (String))); for ( int i = 0 ; i < num; i ++ ) { Random rnd = new Random(Environment.TickCount * i); dr = dt.NewRow(); dr[ 0 ] = " 姓名 " + rnd.Next( 1 , num); dr[ 1 ] = rnd.Next( 1 , num) < num / 2 ? " 男 " : " 女 " ; dr[ 2 ] = rnd.Next( 1000000 , 99999999 ); dt.Rows.Add(dr); } return dt; } }
另一种利用Excel模板生成Excel方法如下:
private void ExportToExcel(DataTable dt, string fileName) { // 转换为物理路径 string newFileName = HttpContext.Current.Server.MapPath( " ~/ " + fileName); // 根据模板正式生成该Excel文件 File.Copy(HttpContext.Current.Server.MapPath( " ~/ContactTemplate.xls " ), newFileName, true ); // 建立指向该Excel文件的数据库连接 string strConn = " Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + newFileName + " ;Extended Properties='Excel 8.0;HDR=yes;IMEX=2' " ; OleDbConnection Conn = new OleDbConnection(strConn); // 打开连接,为操作该文件做准备 Conn.Open(); OleDbCommand Cmd = new OleDbCommand( "" , Conn); foreach (DataRow DR in dt.Rows) { string XSqlString = " insert into [Sheet1$] " ; XSqlString += " ([姓名],[性别],[联系电话]) values( " ; XSqlString += " ' " + DR[ " ContactName " ] + " ', " ; XSqlString += " ' " + (DR[ " ContactSex " ].ToString() == " 1 " ? " 男 " : " 女 " ) + " ', " ; XSqlString += " ' " + DR[ " ContactPhone " ] + " ') " ; Cmd.CommandText = XSqlString; Cmd.ExecuteNonQuery(); } // 操作结束,关闭连接 Conn.Close(); // 打开要下载的文件,并把该文件存放在FileStream中 System.IO.FileStream Reader = System.IO.File.OpenRead(newFileName); // 文件传送的剩余字节数:初始值为文件的总大小 long Length = Reader.Length; HttpContext.Current.Response.Buffer = false ; HttpContext.Current.Response.AddHeader( " Connection " , " Keep-Alive " ); HttpContext.Current.Response.ContentType = " application/octet-stream " ; HttpContext.Current.Response.Charset = " utf-8 " ; HttpContext.Current.Response.AddHeader( " Content-Disposition " , " attachment; filename= " + fileName); HttpContext.Current.Response.AddHeader( " Content-Length " , Length.ToString()); byte [] Buffer = new Byte[ 10000 ]; // 存放欲发送数据的缓冲区 int ByteToRead; // 每次实际读取的字节数 while (Length > 0 ) { // 剩余字节数不为零,继续传送 if (Response.IsClientConnected) { // 客户端浏览器还打开着,继续传送 ByteToRead = Reader.Read(Buffer, 0 , 10000 ); // 往缓冲区读入数据 HttpContext.Current.Response.OutputStream.Write(Buffer, 0 , ByteToRead); // 把缓冲区的数据写入客户端浏览器 HttpContext.Current.Response.Flush(); // 立即写入客户端 Length -= ByteToRead; // 剩余字节数减少 } else { // 客户端浏览器已经断开,阻止继续循环 Length = - 1 ; } } // 关闭该文件 Reader.Close(); // 删除该Excel文件 if (File.Exists(newFileName)) File.Delete(newFileName); }
---------------------------------------------------------------------------
2010-8-26 备注:
在项目中使用第2种方法时,出现"操作必须使用一个可更新的查询"的错误提示 ,原因是项目采用TFS管理,使Excel文件属性是只读的,解决方法是去掉只读属性:
File.Copy(HttpContext.Current.Server.MapPath("~/Views/ActivityAdmin/ContactTemplate.xls"), newFileName, true);
在上面代码的下面加上:
FileInfo f = new FileInfo(newFileName);
if (f.Attributes.ToString().IndexOf("ReadOnly") != -1)
{
f.Attributes = FileAttributes.Normal;
}
---------------------------------------------------------------------------
17:11 2010-12-23 备注:
用企业库读取Excel:
web.config配置:
<!-- test.xls放在App_Data目录下 --> <!-- HDR=yes;IMEX=1表示:第一行不作为数据返回,且以文本方式读取 --> < add name ="testXls" connectionString ="Provider=Microsoft.Jet.OLEDB.4.0;data source=|DataDirectory|test.xls;Extended Properties='Excel 8.0;HDR=yes;IMEX=1'" providerName ="System.Data.OleDb" />
*.aspx.cs代码:
using Microsoft.Practices.EnterpriseLibrary.Data; Database db = DatabaseFactory.CreateDatabase( " testXls " ); // [B0201$A2:C33]表示读取表B0201$的区域范围A2:C33 DataTable dt = db.ExecuteDataSet(CommandType.Text, " select * from [B0201$A2:C33] " ).Tables[ 0 ];
另一种不错方法:
使用HTML,CSS快速导出数据到Excel
http://www.cnblogs.com/ruinet/archive/2009/10/17/1585320.html
稍微改了下
public static void CreateExcel( string strTable, string fileName) { string HEADER = " <html xmlns:x=\"urn:schemas-microsoft-com:office:excel\"> " + " <meta http-equiv=Content-Type content=\"text/html; charset=\"gb2312\"> " + " <head> " + " <!--[if gte mso 9]><xml> " + " <x:ExcelWorkbook> " + " <x:ExcelWorksheets> " + " <x:ExcelWorksheet> " + " <x:Name>Sheet1</x:Name> " + " <x:WorksheetOptions> " + " <x:Print> " + " <x:ValidPrinterInfo /> " + " </x:Print> " + " </x:WorksheetOptions> " + " </x:ExcelWorksheet> " + " </x:ExcelWorksheets> " + " </x:ExcelWorkbook> " + " </xml> " + " <![endif]--> " ; System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding( " GB2312 " ); System.Web.HttpContext.Current.Response.AppendHeader( " Content-Disposition " , " attachment;filename= " + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); System.Web.HttpContext.Current.Response.ContentType = " ms-excel/application " ; StringBuilder sbHtml = new StringBuilder(); sbHtml.AppendFormat( @" {0}</head> <body>{1}</body> </html> " , HEADER, strTable); System.Web.HttpContext.Current.Response.Write(sbHtml.ToString()); System.Web.HttpContext.Current.Response.Flush(); System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.End(); }