在各種管理系統中,數據的導入導出是經常用到的功能,通常導入導出以Excel、CSV格式居多。如果是學習的過程中,最好是自己實現數據導入與導出的功能,然而在項目中,還是調用現成的功能比較好。近期一直使用一款名叫JeeSite的開源項目來進行二次開發,就記錄一下該項目對於Excel導入導出數據的過程。JeeSite提供了很好的Excel的導入導出功能,隱藏了底層的很多實現,通過簡單的套路式步驟即可完成數據的Excel數據的導入導出。對於沒有使用過JeeSite的可以不用往下看了,因為下面的代碼是跟JeeSite二次開發相關的代碼,不做JeeSite的二次開發,以下代碼對您無用,在這里友情提醒,避免浪費您寶貴的時間。
導入導出步驟
無論是JeeSite系統,還是其他的系統或者自己寫的系統,對於數據導入導出功能而言,首先要確定的是導入導出哪些數據的字段,然后提供一個導入的模板,編寫導入導出的功能,最后在頁面上提供導入導出的操作方式來供使用者進行使用。
定義導入導出字段
在導入導出數據時會先確定要導入導出數據的哪些關鍵字段,在確定好字段之后,通過數據庫查詢出的數據根據字段逐個的導出,或者通過讀取的Excel逐個的讀入。在JeeSite中,確定要導入導出的字段以后,在JeeSite的實體類中可以通過注解來進行說明,注解方法如下:
1 @ExcelField(title="列名1", align=2, sort=10)
這樣定義,就可以將類中的字段與Excel的列進行關聯,包括列名稱和排序。例子如下:
1 @ExcelField(title="名稱", align=2, sort=10) 2 public String getName() { 3 return name; 4 } 5 6 @ExcelField(title="年齡", align=2, sort=20) 7 public String getAge() { 8 return age; 9 }
在實體類的getter方法上添加@ExcelField注解,就完成了Excel列名稱與實體類字段的關聯。
Excel數據導出功能
對於JeeSite中的導出功能完全是套路,只要簡單的3行就可以完成一個導出功能,首先設置導出文件名,接着查詢導出數據,最后調用ExportExcel()來完成Excel的導出,例子代碼如下:
1 @RequestMapping(value = "export", method=RequestMethod.POST) 2 public String exportFile(Info info, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) { 3 try { 4 String fileName = "信息數據"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx"; 5 // 調用獲取數據的方法 ... 省略 6 new ExportExcel("信息數據", Info.class).setDataList(page).write(response, fileName).dispose(); 7 return null; 8 } catch (Exception e) { 9 addMessage(redirectAttributes, "信息數據導出失敗!失敗信息:"+e.getMessage()); 10 } 11 return "redirect:" + adminPath + "/info/Info/list?repage"; 12 }
return后的地址,根據實際的Controller來填寫。
導入模板
導入模板是用來給系統使用者在導入數據時使用的,有了導入模板就相當於有了一個導入的規范,確定需要導入哪些列來讓使用者填入。在JeeSite中,導入模板並不用事先提供一個Excel,而是通過代碼直接生成一個Excel文件,Excel文件中的列也是由前面實體類中確定的,這樣的好處是,當列的數量改變時不用人為的去替換修改Excel,因為它是有代碼生成的。導入模板的代碼例子如下:
1 @RequestMapping(value = "import/template") 2 public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) { 3 try { 4 String fileName = "信息數據導入模板.xlsx"; 5 List<Info> list = Lists.newArrayList(); 6 list.add(new Info()); 7 new ExportExcel("信息數據", Info.class, 2).setDataList(list).write(response, fileName).dispose(); 8 return null; 9 } catch (Exception e) { 10 addMessage(redirectAttributes, "導入模板下載失敗!失敗信息:"+e.getMessage()); 11 } 12 return "redirect:" + adminPath + "/info/Info/list?repage"; 13 }
此處return后的地址,也是根據實際的Controller來填寫。
Excel數據導入功能
用戶下載好數據模板后,將相應的數據填寫好,就可以進行數據的導入了。數據的導入是對Excel中的數據不斷進行遍歷和保存的一個過程,代碼雖然比導出要長,但是也完全是套路,代碼如下:
1 @RequestMapping(value = "import", method=RequestMethod.POST) 2 public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) { 3 4 try { 5 int successNum = 0; // 導入成功計數 6 int failureNum = 0; // 導入失敗計數 7 StringBuilder failureMsg = new StringBuilder(); 8 ImportExcel ei = new ImportExcel(file, 1, 0); 9 10 List<Info> list = ei.getDataList(Info.class); 11 12 for ( Info info : list ) { 13 // ... 14 if ( ... ) { // 導入條件的判斷 15 // 符合導入條件 16 // 保存 ... 方法省略 17 successNum++; 18 } else { 19 // 不符合導入條件 20 failureMsg.append("<br/>名字 " + info.getName() + " 已存在; "); 21 failureNum++; 22 } 23 } 24 25 if (failureNum>0){ 26 failureMsg.insert(0, ",失敗 " + failureNum + " 條信息,導入信息如下:"); 27 } 28 29 addMessage(redirectAttributes, "已成功導入 " + successNum + " 條片區信息" + failureMsg); 30 31 } catch (Exception e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 36 return "redirect:" + adminPath + "/info/Info/list?repage"; 37 }
添加導入導出按鈕
在頁面上添加兩個按鈕,分別是導入和導入按鈕,代碼如下:
1 <li class="btns"> 2 <input id="btnExport" class="btn btn-primary" type="button" value="導出"/> 3 <input id="btnImport" class="btn btn-primary" type="button" value="導入"/> 4 </li>
導入時彈出的窗口
在點擊“導入”按鈕時會彈出一個窗口,窗口中可以提供導入文件選擇,也可以下載導入模板。代碼如下:
1 <div id="importBox" class="hide"> 2 <form id="importForm" action="${ctx}/info/Info/import" method="post" enctype="multipart/form-data" 3 class="form-search" style="padding-left:20px;text-align:center;" onsubmit="loading('正在導入,請稍等...');"><br/> 4 <input id="uploadFile" name="file" type="file" style="width:330px"/><br/><br/> 5 <input id="btnImportSubmit" class="btn btn-primary" type="submit" value=" 導 入 "/> 6 <a href="${ctx}/info/Info/import/template">下載模板</a> 7 </form> 8 </div>
在代碼中,需要修改action和href后的具體路徑才能保證數據的提交,和模板下載的地址,具體地址根據自己項目中的Controller來進行替換。
控制導入導出按鈕的JS代碼
對於導出按鈕來說,需要通過action來講數據進行導出,對於導入按鈕來說只是需要把導入時顯示的窗口顯示出來即可。相關代碼如下:
1 $(document).ready(function() { 2 $("#btnExport").click(function(){ 3 top.$.jBox.confirm("確認要導出片區數據嗎?","系統提示",function(v,h,f){ 4 if(v=="ok"){ 5 $("#searchForm").attr("action","${ctx}/info/Info/export"); 6 $("#searchForm").submit(); 7 } 8 },{buttonsFocus:1}); 9 top.$('.jbox-body .jbox-icon').css('top','55px'); 10 }); 11 $("#btnImport").click(function(){ 12 $.jBox($("#importBox").html(), {title:"導入數據", buttons:{"關閉":true}, 13 bottomText:"導入文件不能超過5M,僅允許導入“xls”或“xlsx”格式文件!"}); 14 }); 15 });
對於需要使用JeeSite開源項目進行二次開發的話,上面的代碼算是一個比較詳細的筆記了,如果不使用JeeSite開源項目的話,上面的代碼就沒有什么用處了。這篇筆記留個自己和需要的人吧。我還會陸續的發一些關於JeeSite的二次開發的筆記。
注:我使用的JeeSite是3.X版本的,不是最新的JeeSite 4的版本。
我的注微信公眾號:“碼農UP2U”