最近嘗試用RDLC之外的方法來匯出Excel,想說是否可以直接輸出EXCEL檔,而不用另外再繪製報表檔。之後網路上找到方便的Open Source程式庫 ClosedXML,此程式庫可簡單的去處理EXCEL物件進而直接輸出到網頁,語法使用上也非常簡單,所以在此紀錄一下。
下載方式:
可以直接用NuGet下載至專案,也可到Github上下載。
但程式庫和DocumentFormat.OpenXml.dll有相依,NuGet會幫你引用;自行下載的話需要記得引用。
程式寫法:
//資料連線字串
string strConn = "Integrated Security=false;User ID=xxxx;pwd=****;Initial Catalog=DataName;Data Source=SQLEXPRESS";
using (SqlConnection Conn = new SqlConnection())
{
//開啟連線
Conn.ConnectionString = strConn;
Conn.Open();
//SQL查詢字串
string strSQL = "Select * From TableA";
SqlCommand cmd = new SqlCommand(strSQL, Conn);
//讀取SQL資料
SqlDataReader SqlDR = cmd.ExecuteReader();
DataTable dtSource = new DataTable();
dtSource.Load(SqlDR);
//釋放
SqlDR.Close();
SqlDR.Dispose();
SqlDR = null;
//關閉連線
Conn.Close();
//EXCEL物件
ClosedXML.Excel.XLWorkbook xlwb = new ClosedXML.Excel.XLWorkbook();
//塞入DataTable資料
xlwb.AddWorksheet(dtSource, "匯出資料");
//清空輸出
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
//設定MIME類型
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=Text.xlsx");
//記憶體資料流
using (MemoryStream ms = new MemoryStream())
{
//EXCEL物件寫入到記憶體資料流
xlwb.SaveAs(ms);
//轉寫到輸出資料流
ms.WriteTo(HttpContext.Current.Response.OutputStream);
ms.Close();
//輸出
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
}
如此就可讀取SQL資料庫的內容直接輸出到Client端成EXCEL檔下載。
沒有留言:
張貼留言