一、背景 在之前做的小項目里有一需求是:要求將一活動錄入的數據進行統計,並以excel表格形式導出來,並且對錶格格式要求並不高。 二、問題分析 鑒於用戶只要求最終將資料庫中的數據導出excel,對於格式要求不高,因此只需要在頁面上加入一條鏈接,後臺action中讀取數據然後通過第三方組件導出,再下載 ...
一、背景
在之前做的小項目里有一需求是:要求將一活動錄入的數據進行統計,並以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 點將台無將