DataTable導出到Excel、GSV

 在程序開發中經常會遇到大量數據的操作問題,有的時候還是少不了Excel,GSV等,需要進行數據文件類型的備份。

     當然可以在數據端可以操作。右點擊數據庫->任務->導出數據->數據源選擇應該導出的格式。下一步就可以編寫SQL語句獲得自己想要的數據啦,但是這個需要操作數據庫,而真正的系統開發中,能夠直接操作數據庫的人很少。所以這種方法只能作爲管理做臨時查詢時使用。

      在開發過程中,特別是進行查詢統計的時候,需要將一些數據報表,導出到Excel或者其它的存儲格式,用於打印、文檔分析、提交報告等。這就要求我們在程序開發的時候進行處理,提供接口供用戶導出數據。下面就簡單介紹幾種將數據導出到Excel的方法。

<1>將數據導出,存儲在服務器,然後提供鏈接用於用戶下載,其特點:

  • 結果可以持久保存,用戶可以下載歷史版本
  • 佔用服務器空間
  • 依賴控件屬性

     具體的邏輯代碼如下:

複製代碼
導出到Excel,存放於服務器端 Code
protected void Button2_Click(object sender, EventArgs e)
    {
        DataTable thisTable = AddTimeBusiness.getInstance().GetTable();

        StringWriter stringWriter = new StringWriter();
        HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
        DataGrid excel = new DataGrid();
        excel.DataSource = thisTable.DefaultView;  
        //綁定到DataGrid
        excel.DataBind();
        excel.RenderControl(htmlWriter);
        //這裏指定文件的路徑
        string filestr = "d:\\data\\" + "11.xls"; 
        int pos = filestr.LastIndexOf("\\");
        string file = filestr.Substring(0, pos);
        if (!Directory.Exists(file))
        {
            Directory.CreateDirectory(file);
        }
        System.IO.StreamWriter sw = new StreamWriter(filestr);
        sw.Write(stringWriter.ToString());
        sw.Close();
    }
複製代碼

 

<2>當用戶導出時,直接將數據導出客戶端,幾種方法,感覺此類方法比較適用。

       其特點:隨時生成,在服務器沒有保存副本,方便、快捷。

       具體的邏輯代碼如下面小例子:

複製代碼
導出到Excel
        //根據需要得到數據表
        DataTable thisTable = getTable(condition.ToString());
        if (thisTable != null)
        {
            StringWriter sw = new StringWriter();
            sw.WriteLine("編號\t帳號\t姓名\t電話\t地址\t金額\t開通時間");
            foreach (DataRow dr in thisTable.Rows)
            {
                sw.WriteLine(dr["F_ID"] + "\t" + dr["F_Psnid"] + "\t" + dr["F_Name"] + "\t" + dr["F_Tel"] 
        + "\t" + dr["F_Address"] + "\t" + dr["F_TradeMoney"] + "\t" + dr["F_TradeTime"]);
            }
            sw.Close();
            Response.AddHeader("Content-Disposition", "attachment; filename=YinHeUserInfo.xls");
            Response.ContentType = "application/ms-excel";
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            Response.Write(sw);
            Response.End();
        }
複製代碼


       補充:如果需要導出爲GSV文件,只需要上例分隔符“\t”用“,”替換就可以了。

<3>即可下載到客戶端,又能夠在服務器保存副本。可以說,此方法滿足了以上的兩種方法的功能。

      如果你只想將結果保存在服務器端,則此種方法比第一種方法更加合理,不用過分的依賴控件的屬性。其實這就是一種文件流的操作。所以第一種方法不可取。

複製代碼
Code
        string filePath = "d:\\data.xls";//這個你可以自己修改爲虛擬路徑
        FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
        StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("gb2312"));
        sw.WriteLine("編號\t帳號\t姓名\t電話\t地址\t金額\t開通時間");
        foreach (DataRow dr in thisTable.Rows)
        {
            sw.WriteLine(dr["F_ID"] + "\t" + dr["F_Psnid"] + "\t" + dr["F_Name"] + "\t" + dr["F_Tel"] 
      + "\t" + dr["F_Address"] + "\t" + dr["F_TradeMoney"] + "\t" + dr["F_TradeTime"]);
        }
        sw.Close();
        fs.Close();
        #region==如果要下載到客戶端,則添加下列代碼==
        //Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(filePath));
        //Response.ContentType = "application/ms-excel";// 指定返回的是一個不能被客戶端讀取的流,必須被下載 
        //Response.WriteFile(filePath); // 把文件流發送到客戶端 
        //Response.End();
        #endregion
複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章