[ASP.net](note)讀取DB並匯出EXCEL (NPOI之 v.1.2.4版)

讀取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

 

​​