文章出處

一、背景

  在之前做的小項目里有一需求是:要求將一活動錄入的數據進行統計,并以excel表格形式導出來,并且對表格格式要求并不高。

二、問題分析

  鑒于用戶只要求最終將數據庫中的數據導出excel,對于格式要求不高,因此只需要在頁面上加入一條鏈接,后臺action中讀取數據然后通過第三方組件導出,再下載,就能滿足這個簡單的需求了。首先上bing找了有關數據導出的組件,NPOI是彈出的次數最多的一項,在這里也要說到以前做winform窗體開發用到過水晶報表的方法,其實實現方法比較多,由于以前沒接觸過NPOI,便打算在項目里使用這個開源的組件。

 

 

三、解決思路或過程

  1. 先準備好數據源。用的是mysql數據庫,事先在數據中存入一些數據。
  2. 直接切入主題。這里主要在action里做操做。先要引入NPOI組件的dll(NPOI最新下載鏈接) ,再控制器中添加 using NPOI.HSSF.UserModel;
  3. 貼上控制器中action里代碼:
     public ActionResult ExportDormitoryBottleRecycleExcel()
            {
                NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
                NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");
    
                List<Model> list = new List<Model>();
                list = pbsAccess.DeriveList();
                //創建欄目
                NPOI.SS.UserModel.IRow row = sheet1.CreateRow(0);
                row.CreateCell(0).SetCellValue("編號");
                row.CreateCell(1).SetCellValue("Col_1");
                row.CreateCell(2).SetCellValue("Col_2");
                row.CreateCell(3).SetCellValue("Col_3");
                row.CreateCell(4).SetCellValue("Col_4");
                row.CreateCell(5).SetCellValue("Col_5");
    
                for (int i = 0; i < list.Count; i++)
                {
                    NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
                    rowtemp.CreateCell(0).SetCellValue((i + 1).ToString());
                    rowtemp.CreateCell(1).SetCellValue(list[i].DormitoryNumber.ToString());
                    rowtemp.CreateCell(2).SetCellValue(list[i].SmallBottleNumber.ToString());
                    rowtemp.CreateCell(3).SetCellValue(list[i].BigBottleNumber.ToString());
                    rowtemp.CreateCell(4).SetCellValue(list[i].TotalBottleNumber.ToString());
                    rowtemp.CreateCell(5).SetCellValue(list[i].PublishTime.ToString());
                }
                // 寫入到客戶端
    //.......
                return Content("");
            }

     

  4. 首先,先new一個book對象,再NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); 創建一個名為Sheet1的表對象,這里的Sheet1不是最終輸出的文件名。創建好表格后,需要添加列項。這里添加這一段NPOI.SS.UserModel.IRow row = sheet1.CreateRow(0);其中的IRow需要注意了,在看過一些別的博客寫的示例時,發現一個錯誤便是使用NPOI.SS.UserModel.Row,這里引用的是2.1.3.1版本,已經更改過來了,應該是用IRow的,這是看了文檔才意識到這里的問題,糾正這個錯誤。關于NPOI操作的中文文檔,有需要的朋友可以留言,我再貼出來,在這得感謝之前在NPOI開發群里各路大神的幫助。row.CreateCell(i).SetCellValue("編號"),有多少列,i取到多少(從0開始)。
  5. 在表格建好了以后開始導入數據。list裝好的數據,因此每行遍歷一次,將數據填充進入便可。使用foreach的時候注意,此時第一行已經使用了,被創建了列名,因此需要在一開始的時候,將填充數據的開始行+1即:NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1); 數據string轉換也是正常不過的操作。
  6. 然后關鍵是導出下載的處理
    // 寫入到客戶端  
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                book.Write(ms);
                ms.Seek(0, SeekOrigin.Begin);
                Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.xls","****總表"+ DateTime.Now.ToString("yyyyMMddHHmmssfff")));
                Response.BinaryWrite(ms.ToArray());
                book = null;
                ms.Close();
                ms.Dispose();
                
    
    
  7. System.IO.MemoryStream和Response是兩個很關鍵的處理,在Response中可以對文件名進行處理,string.Formate();在前臺只需要加入<a href = "/admin/ExportDormitoryBottleRecycleExcel"></a>標簽。
  8. 實際生成效果
  9.  

 

 

 

四、總結

  最近也在使用NPOI做更多具體的操作,后期會把一些使用心得和大家一起分享,今天實現的功能簡單,如果我思路和方法有誤,懇請各位指正,虛心求教。轉載請注明來源與出處,謝謝合作 By 點將臺無將


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()