zoukankan      html  css  js  c++  java
  • 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="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”

  • 相关阅读:
    Spring.NET学习笔记一。
    Spring.NET学习笔记三(log4net的配置)
    C# 中virtual,override,new 的区别与用法(转载)
    java中的输入输出(转载)
    C# checked与unchecked用法
    C# string学习(转载)
    C# TextBox中的Validating与Validated事件
    java代理模式 (转)
    Jquery好友选择器
    回溯与递归
  • 原文地址:https://www.cnblogs.com/tosser/p/9000288.html
Copyright © 2011-2022 走看看