在實際開發過程中,有時候服務器端沒安裝OFFICE,你和服務器管理員去商量安裝個OFFICE的時候,管理員很倔犟的不給你安裝的時候,這個時候就可以考慮我這個方法是實現導出EXCEL了。如果你導出的EXCEL是OFFICE2003的版本,可以選擇其它的方式實現了,如果是OFFICE 2003之后的版本,就選擇這個比較好,如果大伙有更好的方法,可以提出來一起研究學習下。
第一步:在服務器上放一個空白的EXCEL文件,里面什么都沒有,可以在你本機建好這個文件,然后將這個文件放到服務器上。
如圖1:
第二步:調用復制文件的方法,將【如圖1】的文件復制一份新的文件,文件名自己取,只要唯一就可以。
第三步:在第二步中復制出的文件中調用如下的方法建立列:
按照你的實際需求可以修改下面的這個方法的實現方式,下面只是一個參考作用。
1 public static void ToExcel(string strPath, string strSheetName) 2 { 3 System.Data.OleDb.OleDbConnection OleDb_Conn = new System.Data.OleDb.OleDbConnection(); 4 // OleDb_Conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=No';" + "Data Source=\"" + strPath + "\""; 5 OleDb_Conn.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=0\"", strPath); 6 try 7 { 8 OleDb_Conn.Open(); 9 System.Data.OleDb.OleDbCommand OleDb_Comm = new System.Data.OleDb.OleDbCommand(); 10 OleDb_Comm.Connection = OleDb_Conn; 11 string strCmd; 12 try 13 { 14 strCmd = "drop table [" + strSheetName + "]"; 15 OleDb_Comm.CommandText = strCmd; 16 OleDb_Comm.ExecuteNonQuery(); 17 } 18 catch 19 { 20 21 } 22 strCmd = "create Table [" + strSheetName + "]("; 23 24 //foreach (DataColumn dc in dtSource.Columns) 25 //{ 26 strCmd += "[集] TEXT,"; //此處 TEXT 是為了 防止導出數據的長度大於255而導出異常 27 strCmd += "[場] TEXT,"; 28 strCmd += "[鏡頭] TEXT,"; 29 strCmd += "[幀數] TEXT,"; 30 strCmd += "[制作人] TEXT,"; 31 strCmd += "[難度系數] TEXT,"; 32 strCmd += "[計划工時] TEXT,"; 33 strCmd += "[實際工時] TEXT,"; 34 strCmd += "[計划開始時間] TEXT,"; 35 strCmd += "[內部最晚通過時間] TEXT,"; 36 strCmd += "[備注] TEXT,"; 37 // } 38 39 strCmd = strCmd.Trim().Substring(0, strCmd.Length - 1); 40 strCmd += ")"; 41 OleDb_Comm.CommandText = strCmd; 42 OleDb_Comm.ExecuteNonQuery(); 43 44 OleDb_Conn.Close(); 45 } 46 catch (Exception ex) 47 { 48 throw ex; 49 } 50 finally 51 { 52 OleDb_Conn.Close(); 53 } 54 }
第四步:調用如下的方法把數據按照【第三步】生成的數據列的順序寫入到EXCEL中。
按照你的實際需求可以修改下面的這個方法的實現方式,下面只是一個參考作用。
1 /// <summary> 2 /// OLEDB導出EXCEL 3 /// </summary> 4 /// <param name="dtrows">數據源</param> 5 /// <param name="filePath">寫入的文件路徑</param> 6 /// <param name="fileName">寫入的文件名</param> 7 /// <param name="colunames">要顯示的列數據</param> 8 private void ExportExcelOLEDB(DataRow[] dtrows, string filePath, string fileName, string[] colunames) 9 { 10 clearFile();//清除產生的臨時文件 11 string SqlConnStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=0\"", filePath); // 當 IMEX=0 時為“匯出模式”,這個模式開啟的 Excel 檔案只能用來做“寫入”用途。 12 // 當 IMEX=1 時為“匯入模式”,這個模式開啟的 Excel 檔案只能用來做“讀取”用途。 13 // 當 IMEX=2 時為“連結模式”,這個模式開啟的 Excel 檔案可同時支援“讀取”與“寫入”用途。 14 OleDbConnection con = new OleDbConnection(SqlConnStr); 15 string tablename = ExcelSheetName(filePath); 16 // string CommText = ""; //string.Format("INSERT INTO [" + tablename + "] VALUES(1,'elmer','password',1,'elmer','password',1,'elmer','password')"); 17 StringBuilder CommText = new StringBuilder(); 18 19 con.Open(); 20 try 21 { 22 int col = colunames.Length; 23 foreach (DataRow dr in dtrows) 24 { 25 CommText.Append("INSERT INTO [" + tablename + "] VALUES("); 26 for (int i = 0; i < col; i++) 27 { 28 if (i + 1 == col) 29 { 30 CommText.Append("'" + ReplaceAll(dr[colunames[i]].ToString()) + "'"); 31 } 32 else 33 { 34 CommText.Append("'" + ReplaceAll(dr[colunames[i]].ToString()) + "',"); 35 } 36 } 37 CommText.Append(");"); 38 39 using (OleDbCommand cmd = new OleDbCommand(CommText.ToString().Replace(':', ';').TrimEnd(';'), con)) 40 { 41 42 //導出數據 43 cmd.ExecuteNonQuery(); 44 45 } 46 CommText.Remove(0, CommText.Length); 47 } 48 } 49 catch (Exception err) { Response.Write(err.ToString()); con.Close(); } 50 con.Close(); 51 ////向客戶端發送文件... 52 Response.Clear(); 53 Response.Charset = "GB2312"; 54 Response.ContentEncoding = System.Text.Encoding.UTF8; 55 // 添加頭信息,為"文件下載/另存為"對話框指定默認文件名 56 Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(fileName) + ".xls"); 57 // 添加頭信息,指定文件大小,讓瀏覽器能夠顯示下載進度 58 //Response.AddHeader("Content-Length", file.Length.ToString()); 59 // 指定返回的是一個不能被客戶端讀取的流,必須被下載 60 Response.ContentType = "application/ms-excel"; 61 // 把文件流發送到客戶端 62 Response.WriteFile(filePath); 63 Response.End(); 64 }
在實際應用中可以合並第三步和第四步,根據自己的實際需求可以組織自己的代碼,這里只是提供了一個思路,希望大伙有意見提出來。。。。。。。