業務中經常有些需求,需要把數據通過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中打開亂碼,有待解決。