web服務端,客戶端把數據寫入文件並導出

業務中經常有些需求,需要把數據通過csv文件導出,以方便用戶操作數據。在這裏我簡單的記錄下客戶端和服務端的導出方式,以便下次使用。

服務端

導出方式,將數據寫入response中即可,下面是代碼

 public void ExportDataToCsvFile(HttpResponseBase Response, DataTable dt, string FileName)
        {
            //在chrome,firefox下中文不會出現亂碼
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);

            //有亂碼,但是可以通過保存成csv,ansi格式的文本解決
            //Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
            //Response.ContentType = "application/csv;charset=gbk";

            string colHeaders = "";
            string ls_item = "";
            int i = 0;

            DataRow[] myRow = dt.Select("");

            for (i = 0; i < dt.Columns.Count; i++)
            {
                if (i == dt.Columns.Count - 1)
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + "\n";
                }
                else
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + ",";
                }
            }

            //向HTTP輸出流中寫入取得的數據信息
            Response.Write(colHeaders);

            //逐行處理數據  
            foreach (DataRow row in myRow)
            {
                //在當前行中,逐列獲得數據,數據之間以\t分割,結束時加回車符\n
                for (i = 0; i < dt.Columns.Count; i++)
                {
                    if (i == dt.Columns.Count - 1)
                    {
                        ls_item += row[i].ToString() + "\n";
                    }
                    else
                    {
                        ls_item += row[i].ToString() + ",";
                    }
                }

                //當前行數據寫入HTTP輸出流,並且置空ls_item以便下行數據    
                Response.Write(ls_item);
                ls_item = "";
            }

            //寫緩衝區中的數據到HTTP頭文件中
            Response.End();
        }
當導出chrome,firefox時,以上代碼能適用,中文不會出現亂碼,但是當通過IE導出,就出現了亂碼,解決辦法在代碼的註釋中,但也是間接的解決這個問題罷了。

客戶端如何調用這個服務端的方法呢,只要發送一個form post請求就行,當請求返回後,瀏覽器就會生成一個文件下載完成的操作。

客戶端

客戶端導出不同瀏覽器的處理也是不同的

IE

function StringToExcelFile(data) {
        try {
            var xls = new ActiveXObject("Excel.Application");
            xls.visible = true;
            var newBook = xls.Workbooks.Add;
            newBook.Worksheets.Add;
            newBook.Worksheets(1).Activate;
            xls.ActiveWorkBook.ActiveSheet.PageSetup.Orientation = 1;
            xls.ActiveWorkBook.ActiveSheet.PageSetup.PaperSize = 1;

            var lineArray = data.split('\n');

            for (var i = 0; i < lineArray.length; i++) {
                var row = lineArray[i];
                var fieldArray = row.split(',');
                for (var j = 0; j < fieldArray.length; j++) {
                    var fieldValue = fieldArray[j];
                    newBook.Worksheets(1).Cells(i + 1, (j + 1)).value = fieldValue;
                }
            }

            newBook.Worksheets(1).Name = '盤點報表';
        }
        catch (e) {
            var msg = e.description; //如果需要導出,請按如下步驟設置:IE瀏覽器的Internet選項->安全->
                                                //自定義級別->ActiveX控件和插件->對未標記爲可安全執行腳本的ActiveX控件初始化並執行腳本->啓用";
        }
    }
注意,上面的是使用office組件導出,需要在Internet選項的安全中設置安全級別才能使用ActiveXObject組件。
firefox,chrome

 <head>  
  <meta http-equiv="content-type" content="text/html; charset=gb2312">  
  <meta name="author" content="oscar999">  
  <title>  
  </title>  
  <script>  
    function clickDownload(aLink)  
    {  
         var str = "欄位1,欄位2,欄位3\n值1,值2,值3";  
         str =  encodeURIComponent(str);  
         aLink.href = "data:text/csv;charset=gb2312,"+str;  
         aLink.click();  
    }  
  </script>   
  </head>  
  <body>  
    <a id="test" onclick="clickDownload(this)" download="downlaod.csv" href="#">download</a>      
  </body>  
</html>  
但是上面的中文字亂碼在excel中打開亂碼,有待解決。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章