標籤:
一、背景
在之前做的小項目裡有一需求是:要求將一活動錄入的資料進行統計,並以excel表格形式匯出來,並且對錶格格式要求並不高。
二、問題分析
鑒於使用者只要求最終將資料庫中的資料匯出excel,對于格式要求不高,因此只需要在頁面上加入一條連結,後台action中讀取資料然後通過第三方組件匯出,再下載,就能滿足這個簡單的需求了。首先上bing找了有關資料匯出的組件,NPOI是彈出的次數最多的一項,在這裡也要說到以前做winform表單開發用到過水晶報表的方法,其實實現方法比較多,由於以前沒接觸過NPOI,便打算在項目裡使用這個開源的組件。
三、解決思路或過程
- 先準備好資料來源。用的是mysql資料庫,事先在資料中存入一些資料。
- 直接切入主題。這裡主要在action裡做操做。先要引入NPOI組件的dll(NPOI最新下載連結) ,再控制器中添加 using NPOI.HSSF.UserModel;
- 貼上控制器中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(""); }
- 首先,先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開始)。
- 在表格建好了以後開始匯入資料。list裝好的資料,因此每行遍曆一次,將資料填充進入便可。使用foreach的時候注意,此時第一行已經使用了,被建立了列名,因此需要在一開始的時候,將填充資料的開始行+1即:NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1); 資料string轉換也是正常不過的操作。
- 然後關鍵是匯出下載的處理
// 寫入到用戶端 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();
System.IO.MemoryStream和Response是兩個很關鍵的處理,在Response中可以對檔案名稱進行處理,string.Formate();在前台只需要加入<a href = "/admin/ExportDormitoryBottleRecycleExcel"></a>標籤。
- 實際產生效果
-
四、總結
最近也在使用NPOI做更多具體的操作,後期會把一些使用心得和大家一起分享,今天實現的功能簡單,如果我思路和方法有誤,懇請各位指正,虛心求教。轉載請註明來源與出處,謝謝合作 By 點將台無將
asp.net mvc4使用NPOI 資料處理之快速匯出Excel文檔