C#中導出EXCEL服務器端不用安裝OFFICE


  在實際開發過程中,有時候服務器端沒安裝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         }

    在實際應用中可以合並第三步和第四步,根據自己的實際需求可以組織自己的代碼,這里只是提供了一個思路,希望大伙有意見提出來。。。。。。。

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM