將數據導出到Excel表格

開發工具與關鍵技術:Visual Studio 與NPOI

作者:黃燦

撰寫時間:2019.5.12

以導出員工信息資料爲例

數據多的時候,不想要全部的數據導出Excel,只想導出符合我條件我需要的數據導出Excel,這個時候我們都想把數據篩選一遍再把篩選得到的數據導出Excel。篩選數據必須在前面查詢數據的時候寫有條件篩選查詢的方法。Jacascript中導出數據到Excel的function獲取當前數據的篩選條件和前面篩選查詢的數據方法一樣,篩選條件是根據部門ID和職位ID還有員工明細(員工明細就是員工編號和員工姓名)篩選的,判斷篩選數據的部門ID職位ID是否爲空或者undefined,如果爲空或者undefined,那就把部門ID和職位ID賦值爲零,編號和姓名是否爲undefined,如果爲undefined那就把編號和姓名賦值爲零。詢問一下是否要導出當前表格中的數據,是則根據部門ID和職位ID或編號或姓名訪問控制器的方法,詢問之後關閉詢問框

在這裏插入圖片描述

控制器的方法

接收javascript傳參過來的部門ID和職位ID還有員工明細

將數據導出到Excel表格中,需要重新查詢一遍數據,查詢到的這些數據就導出的Excel表格當中,導出到Excel表格中的查詢方法和數據查詢返回到頁面的顯示出來看的查詢方法一模一樣,篩選條件也是一樣要寫上並且也是要和數據篩選查詢返回到頁面的顯示出來看的數據篩選查詢方法一模一樣

在這裏插入圖片描述
在這裏插入圖片描述

數據重新篩選查詢一遍之後,就是要創建Excel工作簿,創建工作表,創建表頭行,創建工作簿、工作表還有表頭行需要引用NPOI.dll
在這裏插入圖片描述

使用NPOI中的HSSFWoekbook創建一個工作博,再使用NPOI中的ISheet創建工作表並給工作表命名一個名字,然後再使用NPOI中的IRow創建表頭行,索引(0)代表是工作表中的第一行

在這裏插入圖片描述

設置表頭,把需要導出數據的屬性給設置到表中的第一行,8個屬性設置8列,索引從0開始到7,設置表頭行屬性的值

在這裏插入圖片描述

爲Excel添加數據,導出的數據不只有一條數據,所以不能象設置表頭行那樣,添加數據需要for循環,循環添加數據,添加的數據不能多於查詢出來的數據,在for循環中需要創建行,在進行數據添加,添加行的索引是(i+1),每添加一行數據都是在原有的數據行中+1,第一行數據也是需要+1行添加數據,因爲已經創建了表頭行,表頭行的索引爲0在第一行,所以第一行的數據需要在表頭行的索引上+1,第二行纔是數據的第一行。添加數據需要按照屬性列把數據添加上去,索引是從零開始,工作表中沒有添加第一列,所以不需要+1,而這些數據也是添加到固定的一列當中。

在這裏插入圖片描述

添加完數據後就是保存數據,保存工作表工作簿,接下來給工作簿命名一個名字,爲了防止每一次導出的數據工作簿的命名都一樣,所以命名工作簿的格式是:工作簿名字+當前導出的時間+Excel的後綴名。實例化一個內存流MemoryStream,把工作簿寫入內存流,轉化爲內存流

在這裏插入圖片描述

輸出之前調用Seek(偏移量,遊標位置)移動文件讀取指針到指定的位置,Seek(0,Seek.begin) 第一個參數表示相對位置,第二個參數表示參照位置,讀取寫入內存流中的工作簿

返回一個文件,文件是寫入內存流中的工作簿,"application/vnd.ms-excel"是MIME文件類型,MIME文件類型(Multipurpose Internet Mail
Extensions)多用途互聯網郵件擴展類型,將工作簿的命名一起返回
在這裏插入圖片描述