1. 程式人生 > >記一次服務器生成Excel在客戶端下載的案例

記一次服務器生成Excel在客戶端下載的案例

停止 stream posit quest enc url Coding 不能 dstream

今天加盟部校長說做一個用戶數據收集並導出Excel文件的小網頁,主要便於查看客戶信息,前期一切順利,就在生成Excel和下載的時候出現了問題,收集了一些資料,有人說用NPOI插件,這個可行,我在網上收集了資料,沒有使用插件做了一個簡單的Excel生成器,話不多少代碼如下:

首先在服務類中

//導出Excel
/// <summary>
/// DataTable導出到Excel
/// </summary>
/// <param name="table">DataTable類型的數據源</param>
/// <param name="file">需要導出的文件路徑</param>
public void dataTableToCsv(DataTable table, string file)
{
string title = "";
FileStream fs = new FileStream(file, FileMode.OpenOrCreate);
StreamWriter sw = new StreamWriter(new BufferedStream(fs), System.Text.Encoding.Default);
for (int i = 0; i < table.Columns.Count; i++)
{
title += table.Columns[i].ColumnName + "\t"; //欄位:自動跳到下一單元格
}
title = title.Substring(0, title.Length - 1) + "\n";
sw.Write(title);
foreach (DataRow row in table.Rows)
{
string line = "";
for (int i = 0; i < table.Columns.Count; i++)
{
line += row[i].ToString().Trim() + "\t"; //內容:自動跳到下一單元格
}
line = line.Substring(0, line.Length - 1) + "\n";
sw.Write(line);
}
sw.Close();
fs.Close();
}

我是用一般處理程序做業務層,其代碼如下所示:

string UserName = context.Request["name"].ToString();
string UserType = context.Request["type"].ToString();

DataSet ds = cs.Get_JQ_Info(UserName, UserType);
if (ds.Tables[0].Rows.Count > 0)
{
//D:\WebSoft\WebSoft10\SoftWeb\Services\down\2018-09-08 170615.xls
string path = context.Server.MapPath("../down/" + DateTime.Now.ToString("yyyy-MM-dd HHmmss") + ".xls");
cs.dataTableToCsv(ds.Tables["JG"], path); //調用函數
string[] arr = path.Split(‘\\‘);
string pp = "";
for (int i = 0; i < arr.Length; i++)
{
if (arr[i].Contains("2018")) {
pp = arr[i].ToString();
}
}




this.downloadfile(context, "../down/"+pp);




}
else
{

context.Response.Write("Error");
}

//文件下載
public void downloadfile(HttpContext context, string s_fileName)
{
string path = s_fileName;
System.IO.FileInfo file = new System.IO.FileInfo(System.Web.HttpContext.Current.Server.MapPath(path));

context.Response.Clear();
context.Response.Charset = "UTF-8";
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
context.Response.AddHeader("Content-Type", "application/octet-stream");
// 添加頭信息,為"文件下載/另存為"對話框指定默認文件名,設定編碼為UTF8,防止中文文件名出現亂碼
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8));
// 添加頭信息,指定文件大小,讓瀏覽器能夠顯示下載進度
context.Response.AddHeader("Content-Length", file.Length.ToString());
//// 指定返回的是一個不能被客戶端讀取的流,必須被下載
context.Response.ContentType = "application/ms-excel";
// 把文件流發送到客戶端
context.Response.WriteFile(file.FullName);
// 停止頁面的執行
context.Response.End();
}

特別說明!!!!!!!!!!!!

前端調用千萬別用AJAX,無論如何調都不會出現彈框的,這時請使用<a href=""></a>的方式進行下載。

由於瀏覽器網頁關閉了,引用地址無法給出,若是引用了某位大神的代碼或者內容,請諒解,再次抱歉。

記一次服務器生成Excel在客戶端下載的案例