1、Excel導入到GridView以及數據庫操做比較簡單,這兒不作過多講解,須要注意的有二點:html
一、設置IMEX=1將強制混合數據轉換爲文本。ios
二、解決Excel驅動程序默認讀取8行:將"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel"目錄下的TypeGuessRows屬性值修改成0。數據庫
2、導出到Excel數組
方法一:安全
用Microsoft.Office.Interop.Excel 組建方式導出,直接遍歷excel每一個單元格插入。
吐槽下此方法慢如蝸牛,不喜歡的跳過。服務器
程序準備app
一、在項目中添加Microsoft.Office.Interop.Excel的引用,製做一個須要導出的excel樣式模版放到項目某個文件夾下,
二、用此方法導出須要添加Microsoft.Office.Interop.Excel的引用,且服務器上須要安裝excel,建議服務器上安裝Excel版本低一些,2003就不錯。
三、服務器權限設定,出現相似檢索 COM 類工廠中 CLSID 爲 {00024500-0000-0000-C000-000000000046}的組件時失敗 的錯誤多半是服務器上的Excel權限沒設好。打開控制面板=>管理工具=>組建服務=>組建服務=>計算機=>個人電腦=>DCOM配置=>Microsoft Excel。右擊屬性標誌選擇交互式用戶 ,安全標籤中的啓動與激活權限選擇自定義而後點擊編輯按鈕,點添加ASP.NET。工具
具體程序以下post
生成的方法字體
public void CreateExcel(System.Data.DataTable dt, string creatName, string MoName) { // 輸入文件名 string inputFilePath = System.Web.HttpContext.Current.Server.MapPath(MoName); string outFilePath = System.Web.HttpContext.Current.Server.MapPath(creatName); //若是文件不存在,則將模板文件拷貝一份做爲輸出文件 if (!File.Exists(outFilePath)) { File.Copy(inputFilePath, outFilePath, true); } GC.Collect(); ApplicationClass myApp = new ApplicationClass(); Workbook myBook = null; Worksheet mySheet = null; myApp.Visible = false; object oMissiong = System.Reflection.Missing.Value; myApp.Workbooks.Open(outFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong
, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong); myBook = myApp.Workbooks[1]; mySheet = (Worksheet)myBook.ActiveSheet; DataTableToExcel(dt, mySheet); myBook.Save(); myBook.Close(true, outFilePath, true); System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp); GC.Collect(); }
public void DataTableToExcel(System.Data.DataTable dt, Worksheet excelSheet) { int rowCount = dt.Rows.Count; int colCount = dt.Columns.Count; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { mySheet.Cells[i + 1, j] = dt.Rows[i - 1][j - 1].ToString(); } } }
調用的方法
CreateExcel ce = new CreateExcel(); string MoName = "UserFiles/DataIn.xls";//模板的路徑 string creatName = "UserFiles\\" + "數據導出.xls" ;//生成excel的路徑 ce.Create(tbl, creatName, MoName); Response.Redirect(creatName);
方法二:
用Microsoft.Office.Interop.Excel 組建方式導出,數據依照二維數組方式存放,和第一種方法雖然只有幾行代碼區別,可是速度快了幾十倍,10W條數據15秒鐘左右(小白pc機)具體的服務器配置如方法一
程序以下
生成方法
public void Create(System.Data.DataTable dt, string creatName, string MoName) { // 輸入文件名 string inputFilePath = System.Web.HttpContext.Current.Server.MapPath(MoName); string outFilePath = System.Web.HttpContext.Current.Server.MapPath(creatName); //若是文件不存在,則將模板文件拷貝一份做爲輸出文件 if (!File.Exists(outFilePath)) { File.Copy(inputFilePath, outFilePath, true); } GC.Collect(); ApplicationClass myApp = new ApplicationClass(); Workbook myBook = null; Worksheet mySheet = null; myApp.Visible = false; object oMissiong = System.Reflection.Missing.Value; myApp.Workbooks.Open(outFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong
, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong); myBook = myApp.Workbooks[1]; mySheet = (Worksheet)myBook.ActiveSheet; DataTableToExcel(dt, mySheet); myBook.Save(); myBook.Close(true, outFilePath, true); System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp); GC.Collect(); } public void DataTableToExcel(System.Data.DataTable dt, Worksheet excelSheet) { int rowCount = dt.Rows.Count; int colCount = dt.Columns.Count; object[,] dataArray = new object[rowCount + 1, colCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { dataArray[i, j] = dt.Rows[i][j]; } } //從A2開始導入寫入數據便可以避開表頭被重寫 excelSheet.get_Range("A2", excelSheet.Cells[rowCount + 1, colCount]).Value2 = dataArray; }
調用方法
CreateExcel ce = new CreateExcel(); string MoName = "UserFiles/DataIn.xls";//模板的路徑 string creatName = "UserFiles\\" + "數據導出.xls" ;//生成excel的路徑 ce.Create(tbl, creatName, MoName); Response.Redirect(creatName);
方法三:
此方法不須要在服務器上安裝Excel,採用生成xml以excel方式輸出到客戶端,可能須要客戶機安裝excel(心虛沒試過)因此也不會有亂七八糟的權限設定,和莫名其妙的版本問題。並且此種方法比第二種更快試了下10W條數據(20列)不到10秒(小白pc)。
方法以下
生成方法:
public static string CreateExcel(DataTable dt, List<string> columnNames) { StringBuilder strb = new StringBuilder(); strb.Append(" <html xmlns:o=\"urn:schemas-microsoft-com:office:office\""); strb.Append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\""); strb.Append("xmlns=\"http://www.w3.org/TR/REC-html40\""); strb.Append(" <head> <meta http-equiv='Content-Type' content='text/html; charset=gb2312'>"); strb.Append(" <style>"); strb.Append(".xl26"); strb.Append(" {mso-style-parent:style0;"); strb.Append(" font-family:\"Times New Roman\", serif;"); strb.Append(" mso-font-charset:0;"); strb.Append(" mso-number-format:\"@\";}"); strb.Append(" </style>"); strb.Append(" <xml>"); strb.Append(" <x:ExcelWorkbook>"); strb.Append(" <x:ExcelWorksheets>"); strb.Append(" <x:ExcelWorksheet>"); strb.Append(" <x:Name>Sheet1 </x:Name>"); strb.Append(" <x:WorksheetOptions>"); strb.Append(" <x:DefaultRowHeight>285 </x:DefaultRowHeight>"); strb.Append(" <x:Selected/>"); strb.Append(" <x:Panes>"); strb.Append(" <x:Pane>"); strb.Append(" <x:Number>3 </x:Number>"); strb.Append(" <x:ActiveCol>1 </x:ActiveCol>"); strb.Append(" </x:Pane>"); strb.Append(" </x:Panes>"); ////設置工做表只讀屬性 //strb.Append(" <x:ProtectContents>False </x:ProtectContents>"); //strb.Append(" <x:ProtectObjects>False </x:ProtectObjects>"); //strb.Append(" <x:ProtectScenarios>False </x:ProtectScenarios>"); strb.Append(" </x:WorksheetOptions>"); strb.Append(" </x:ExcelWorksheet>"); strb.Append(" <x:WindowHeight>6750 </x:WindowHeight>"); strb.Append(" <x:WindowWidth>10620 </x:WindowWidth>"); strb.Append(" <x:WindowTopX>480 </x:WindowTopX>"); strb.Append(" <x:WindowTopY>75 </x:WindowTopY>"); strb.Append(" <x:ProtectStructure>False </x:ProtectStructure>"); strb.Append(" <x:ProtectWindows>False </x:ProtectWindows>"); strb.Append(" </x:ExcelWorkbook>"); strb.Append(" </xml>"); strb.Append(""); strb.Append(" </head> <body> <table align=\"center\" style='border-collapse:collapse;table-layout:fixed'> <tr>"); //if (ds.Tables.Count > 0) //{ //寫列標題 int columncount = columnNames.Count; for (int columi = 0; columi < columncount; columi++) { strb.Append(" <td> <b>" + columnNames[columi] + " </b> </td>"); } strb.Append(" </tr>"); //寫數據 for (int i = 0; i < dt.Rows.Count; i++) { strb.Append(" <tr>"); for (int j = 0; j < dt.Columns.Count; j++) { strb.Append(" <td class='xl26'>" + dt.Rows[i][j].ToString() + " </td>"); } strb.Append(" </tr>"); } //} strb.Append(" </body> </html>"); return strb.ToString(); }
調用方法:
protected void Button1_Click(object sender, EventArgs e) { string strSql = 「select * from table1"; System.Data.DataTable tbl = SqlHelper.GetDateTable(strSql); List<string> names = new List<string>() { "序號","固定資產管理碼","品名","資產大類","資產小類","品牌","規格型號","編碼1","編碼2","使用部門","責任人","使用人","放置地點","價格"
,"購置日期","供應商","保修截至日期","預計使用月份","備註","其餘" }; string str = ExcelHelper.CreateExcel(tbl, names); Response.Clear(); Response.Buffer = true; Response.Charset = "GB2312"; Response.AppendHeader("Content-Disposition", "attachment;filename=1213.xls"); Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//設置輸出流爲簡體中文 Response.ContentType = "application/ms-excel";//設置輸出文件類型爲excel文件。 //this.EnableViewState = false; Response.Write(str); Response.End(); }