讀取DB並匯出EXCEL
附檔須先下載配合使用,附檔中有說明文件。
黃色部分為讀取DB並匯出EXCEL的程式碼,其餘無背景色的為ado.net(datareader)
//----自己寫的(宣告) ----一般必寫
using System.Web.Configuration;
using System.Data;
using System.Data.SqlClient;
//== 自己寫的(宣告) === Excel用
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
protected void Button1_Click(object sender, EventArgs e)
{
//*** for Exporting to a Excel file
HSSFWorkbook workbook = new HSSFWorkbook();
//== 新增試算表 Sheet名稱。使用 NPOI.SS.UserModel命名空間。(v.1.2.4版)
ISheet u_sheet = (ISheet)workbook.CreateSheet("My Sheet_124");
//== 插入資料值,我先建立excel的表頭,從資料庫撈出不會有表頭
//**** CreateRow()方法
//同列第1格開始須先用「CreateRow」
u_sheet.CreateRow(0).CreateCell(0).SetCellValue("此欄可刪");
//同列第2格開始須用「GetRow」,否則在excel中只會出現最後1格
u_sheet.GetRow(0).CreateCell(1).SetCellValue("年月");
u_sheet.GetRow(0).CreateCell(2).SetCellValue("姓名");
u_sheet.GetRow(0).CreateCell(3).SetCellValue("應享特休");
u_sheet.GetRow(0).CreateCell(4).SetCellValue("剩餘特休");
u_sheet.GetRow(0).CreateCell(5).SetCellValue("特");
u_sheet.GetRow(0).CreateCell(6).SetCellValue("事");
u_sheet.GetRow(0).CreateCell(7).SetCellValue("病");
u_sheet.GetRow(0).CreateCell(8).SetCellValue("婚");
u_sheet.GetRow(0).CreateCell(9).SetCellValue("喪");
u_sheet.GetRow(0).CreateCell(10).SetCellValue("產");
u_sheet.GetRow(0).CreateCell(11).SetCellValue("公");
u_sheet.GetRow(0).CreateCell(12).SetCellValue("加班時數");
u_sheet.GetRow(0).CreateCell(13).SetCellValue("上班天數");
u_sheet.GetRow(0).CreateCell(14).SetCellValue("上班時數");
u_sheet.GetRow(0).CreateCell(15).SetCellValue("遲到次數");
u_sheet.GetRow(0).CreateCell(16).SetCellValue("未打卡次數");
u_sheet.GetRow(0).CreateCell(17).SetCellValue("逾時打卡");
u_sheet.GetRow(0).CreateCell(18).SetCellValue("備註");
//以下為ADO.NET (datareader)
//宣告連線字串
string ds = WebConfigurationManager.ConnectionStrings["workerConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(ds);
SqlDataReader dr3 = null;
string dc = "select * from mytable";
SqlCommand cmd3 = new SqlCommand(Session["dc"].ToString(), conn);
try
{
//== 第一,連結資料庫。
conn.Open();
//== 第二,執行SQL指令。
dr3 = cmd3.ExecuteReader();
//由此開始處理匯出excel===================================
//== 利用迴圈,把資料寫入 Excel各個儲存格裡面。
int k = 1;
//k從1開始代表是excel的第2行開始建立,因為第1行已給表頭使用了
while (dr3.Read())
{
//**** 先建好一列(Row),才能去作格子(Cell)
IRow u_Row = u_sheet.CreateRow(k);
for (int i = 0; i < dr3.FieldCount; i++)
{ //-- FieldCount是指 DataReader每一列紀錄裡面,有幾個欄位。
u_Row.CreateCell(i).SetCellValue(dr3.GetValue(i).ToString());
//== .CreateCell() 可設定為同一列(Row)的 [第幾個格子]
//補充:設定每一個欄位(格子)的儲存格型態,如:字串。
//u_Row.CreateCell(i).SetCellType(CellType.STRING);
}
k++;
}
//結束處理匯出excel===================================
}
catch (Exception ex) //---- 如果程式有錯誤或是例外狀況,將執行這一段
{
Response.Write("ERROE----" + ex.ToString() + "<HR/>");
throw;
}
// == 第四,釋放資源、關閉資料庫的連結。
finally
{
if (dr3 != null)
{
cmd3.Cancel();
dr3.Close();
}
if (conn.State == ConnectionState.Open)
{
conn.Close();
conn.Dispose();
}
}
//*** for Exporting to a Excel file
MemoryStream ms = new MemoryStream(); //==需要 System.IO命名空間
workbook.Write(ms);
//== Excel檔名,請寫在最後面 filename的地方
Response.AddHeader("Content-Disposition", "attachment; filename=出勤加班表_" + DateTime.Now.ToString("yyyyMMdd") + ".xls");
Response.BinaryWrite(ms.ToArray());
//== 釋放資源
workbook = null;
ms.Close();
ms.Dispose();
}
(以上參考mis2000的教學後實作整理出來的)
--
強烈建議購物網店或實體店家都必須使用關鍵字廣告or原生廣告來 將Yahoo上與聯播網的廣大流量導至自己的網站!
●Yahoo關鍵字廣告/原生廣告
◆Yahoo廣告方案介紹 : https://goo.gl/5k8FHW
◆Yahoo廣告剖析與運用 : http://goo.gl/4xjUJD