立即注冊 登錄
返回首頁

uid:83710的個人空間

日志

NPOI創(chuàng)建Excel以內(nèi)存流下載

已有 4006 次閱讀2015-6-25 17:01 | Excel

     NPOI一個不依賴Office安裝程序的導(dǎo)入導(dǎo)出Excel與Word動態(tài)鏈接庫,去年的時候在WPF(C/S)上用它做過一個數(shù)據(jù)庫導(dǎo)入導(dǎo)出Excel的程序。前段時間看了看發(fā)現(xiàn)根本看不懂了。。。
    記錄一下NPOI在.Net中的使用心得吧。

    功能說明:從數(shù)據(jù)庫中獲取一個DataTable導(dǎo)出成Excel并發(fā)送到客戶端

    主要步驟:
    1、從數(shù)據(jù)庫獲取并完善DataTable內(nèi)容(刪除不必要的列新增必要的列)
    2、生成*.xls文件并寫入內(nèi)存流
    3、發(fā)送內(nèi)存流到客戶端,形成文件下載

    詳細(xì)說明:
    1、獲取數(shù)據(jù)源
    直接調(diào)用SQL語句獲取數(shù)據(jù)源DataTable就可以了,下面進(jìn)行DataTable數(shù)據(jù)的維護(hù)。
    // 獲取數(shù)據(jù)源(注:數(shù)據(jù)源的來源不做詳細(xì)說明)
    DataTable data = CBLLTransportSendCar.GetSaleReport(time, dQueryDate, out strError);
    // 刪除不必要的列【 i 】為列索引從【0】開始
    data.Columns.RemoveAt(i);
    // 添加新列
    data.Columns.Add("ColumnName",typeof(string));
 

    2、用NPOI創(chuàng)建Excel
    先到NPOI官網(wǎng)下載【*.dll】動態(tài)鏈接庫并引入到項目中(引用所有*.dll)
    網(wǎng)址:http://npoi.codeplex.com/  ;
            
    string[] strHead = {"Column1","Column2","Column3"};
    MemoryStream ms = new MemoryStream();
     try
     {
        IWorkbook workbook = new HSSFWorkbook();    // 創(chuàng)建Workbook對象
         ISheet sheet = workbook.CreateSheet("Sheet1");  // 創(chuàng)建工作表
        // 設(shè)置表頭
         IRow row = sheet.CreateRow(0);  // 創(chuàng)建一行、指定行號為第一行
         for (int i = 0; i < strHead.Length; i++)
         {
            ICell cell = row.CreateCell(i); // 創(chuàng)建一列
            cell.SetCellValue(strHead[i]);  // 設(shè)置列的內(nèi)容
         }
         // 設(shè)置內(nèi)容
        for (int j = 0; j < dt.Rows.Count; j++)
         {
            IRow rowCotent = sheet.CreateRow(j + 1);
            for (int i = 0; i < strHead.Length; i++)
            {
                ICell cell = rowCotent.CreateCell(i); // 創(chuàng)建一列
                cell.SetCellValue(dt.Rows[j][i].ToString());  // 設(shè)置列的內(nèi)容
             }
         }
        workbook.Write(ms); // Excel寫入內(nèi)存流中
        ms.Flush();
        ms.Position = 0;    // 指定內(nèi)存流起始值
        if (workbook != null)
        {
            workbook.Clear();   // 關(guān)閉
        }
    }
    catch (Exception ex)
    {
    }
    
    3、 發(fā)送流到客戶端以形成下載文件行駛
    如要是下載實體文件(即存放在服務(wù)器本地的文件)直接鏈接到文件的相對路徑就可以了,但是此文中的Excel文件則是存放在內(nèi)存流中,需要特殊處理。處理方式很簡單,就是修改請求的報頭就可以了,告訴協(xié)議“
我發(fā)送的是一個文件你丫別把他當(dāng)HTML輸出了!”
    Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");    // 設(shè)置流的字符編碼,Windows的為【gb2312】
    Response.ContentType = "application/octet-stream";    // 通知協(xié)議說我攜帶的是一個流不是HTML
    Response.AppendHeader("Content-Disposition", "filename=" + strTitle + "銷售報表.xls");    // 【filename】說明這個文件的文件名以及格式
    Response.BinaryWrite(ms.GetBuffer());     // 從內(nèi)存流中以無符號字節(jié)數(shù)組形式發(fā)送



2014-12-05補(bǔ)充

    今天利用NPOI導(dǎo)出Excel的時候設(shè)計到了單元格的合并,很簡單,只需要一個方法就可以了。我們先看一下想要的效果
 


    代碼:
    IWorkbook workbook = new HSSFWorkbook();    // 創(chuàng)建Workbook對象
    ISheet sheet = workbook.CreateSheet("Sheet1");  // 創(chuàng)建工作表
    // 設(shè)置表頭
    IRow row = sheet.CreateRow(0);  // 創(chuàng)建一行
    ICell cell1 = row.CreateCell(0);
    cell1.SetCellValue("機(jī)臺號");
    sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 0));    // 設(shè)置合并單元格

     
sheet.AddMergedRegion(new CellRangeAddress(firstRowNumber, lastRowNumber, firstColumnNumber, lastRowNumber));

    前兩個參數(shù)表示從第幾行到第幾行合并,后兩個參數(shù)表示從第幾列到第幾列合并! 

路過

雞蛋

鮮花

握手

雷人

評論 (0 個評論)

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

返回頂部