JeeSite | Excel導入導出


  在各種管理系統中,數據的導入導出是經常用到的功能,通常導入導出以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”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM