在各种管理系统中,数据的导入导出是经常用到的功能,通常导入导出以Excel、CSV格式居多。如果是学习的过程中,最好是自己实现数据导入与导出的功能,然而在项目中,还是调用现成的功能比较好。近期一直使用一款名叫JeeSite的开源项目来进行二次开发,就记录一下该项目对于Excel导入导出数据的过程。JeeSite提供了很好的Excel的导入导出功能,隐藏了底层的很多实现,通过简单的套路式步骤即可完成数据的Excel数据的导入导出。对于没有使用过JeeSite的可以不用往下看了,因为下面的代码是跟JeeSite二次开发相关的代码,不做JeeSite的二次开发,以下代码对您无用,在这里友情提醒,避免浪费您宝贵的时间。

导入导出步骤

  无论是JeeSite系统,还是其他的系统或者自己写的系统,对于数据导入导出功能而言,首先要确定的是导入导出哪些数据的字段,然后提供一个导入的模板,编写导入导出的功能,最后在页面上提供导入导出的操作方式来供使用者进行使用。

定义导入导出字段

  在导入导出数据时会先确定要导入导出数据的哪些关键字段,在确定好字段之后,通过数据库查询出的数据根据字段逐个的导出,或者通过读取的Excel逐个的读入。在JeeSite中,确定要导入导出的字段以后,在JeeSite的实体类中可以通过注解来进行说明,注解方法如下:

 @ExcelField(title="列名1", align=2, sort=10)

  这样定义,就可以将类中的字段与Excel的列进行关联,包括列名称和排序。例子如下:

 @ExcelField(title="名称", align=2, sort=10)
public String getName() {
return name;
} @ExcelField(title="年龄", align=2, sort=20)
public String getAge() {
return age;
}

  在实体类的getter方法上添加@ExcelField注解,就完成了Excel列名称与实体类字段的关联。

Excel数据导出功能

  对于JeeSite中的导出功能完全是套路,只要简单的3行就可以完成一个导出功能,首先设置导出文件名,接着查询导出数据,最后调用ExportExcel()来完成Excel的导出,例子代码如下:

 @RequestMapping(value = "export", method=RequestMethod.POST)
public String exportFile(Info info, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
try {
String fileName = "信息数据"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
// 调用获取数据的方法 ... 省略 new ExportExcel("信息数据", Info.class).setDataList(page).write(response, fileName).dispose();
return null;
} catch (Exception e) {
addMessage(redirectAttributes, "信息数据导出失败!失败信息:"+e.getMessage());
}
return "redirect:" + adminPath + "/info/Info/list?repage";
}

  return后的地址,根据实际的Controller来填写。

导入模板

  导入模板是用来给系统使用者在导入数据时使用的,有了导入模板就相当于有了一个导入的规范,确定需要导入哪些列来让使用者填入。在JeeSite中,导入模板并不用事先提供一个Excel,而是通过代码直接生成一个Excel文件,Excel文件中的列也是由前面实体类中确定的,这样的好处是,当列的数量改变时不用人为的去替换修改Excel,因为它是有代码生成的。导入模板的代码例子如下:

 @RequestMapping(value = "import/template")
public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
try {
String fileName = "信息数据导入模板.xlsx";
List<Info> list = Lists.newArrayList();
list.add(new Info());
new ExportExcel("信息数据", Info.class, 2).setDataList(list).write(response, fileName).dispose();
return null;
} catch (Exception e) {
addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
}
return "redirect:" + adminPath + "/info/Info/list?repage";
}

  此处return后的地址,也是根据实际的Controller来填写。

Excel数据导入功能

  用户下载好数据模板后,将相应的数据填写好,就可以进行数据的导入了。数据的导入是对Excel中的数据不断进行遍历和保存的一个过程,代码虽然比导出要长,但是也完全是套路,代码如下:

 @RequestMapping(value = "import", method=RequestMethod.POST)
public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) { try {
int successNum = 0; // 导入成功计数
int failureNum = 0; // 导入失败计数
StringBuilder failureMsg = new StringBuilder();
ImportExcel ei = new ImportExcel(file, 1, 0); List<Info> list = ei.getDataList(Info.class); for ( Info info : list ) {
// ...
if ( ... ) { // 导入条件的判断
// 符合导入条件
// 保存 ... 方法省略
successNum++;
} else {
// 不符合导入条件
failureMsg.append("<br/>名字 " + info.getName() + " 已存在; ");
failureNum++;
}
} if (failureNum>0){
failureMsg.insert(0, ",失败 " + failureNum + " 条信息,导入信息如下:");
} addMessage(redirectAttributes, "已成功导入 " + successNum + " 条片区信息" + failureMsg); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return "redirect:" + adminPath + "/info/Info/list?repage";
}

添加导入导出按钮

  在页面上添加两个按钮,分别是导入和导入按钮,代码如下:

 <li class="btns">
<input id="btnExport" class="btn btn-primary" type="button" value="导出"/>
<input id="btnImport" class="btn btn-primary" type="button" value="导入"/>
</li>

导入时弹出的窗口

  在点击“导入”按钮时会弹出一个窗口,窗口中可以提供导入文件选择,也可以下载导入模板。代码如下:

 <div id="importBox" class="hide">
<form id="importForm" action="${ctx}/info/Info/import" method="post" enctype="multipart/form-data"
class="form-search" style="padding-left:20px;text-align:center;" onsubmit="loading('正在导入,请稍等...');"><br/>
<input id="uploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
<input id="btnImportSubmit" class="btn btn-primary" type="submit" value=" 导 入 "/>
<a href="${ctx}/info/Info/import/template">下载模板</a>
</form>
</div>

  在代码中,需要修改action和href后的具体路径才能保证数据的提交,和模板下载的地址,具体地址根据自己项目中的Controller来进行替换。

控制导入导出按钮的JS代码

  对于导出按钮来说,需要通过action来讲数据进行导出,对于导入按钮来说只是需要把导入时显示的窗口显示出来即可。相关代码如下:

 $(document).ready(function() {
$("#btnExport").click(function(){
top.$.jBox.confirm("确认要导出片区数据吗?","系统提示",function(v,h,f){
if(v=="ok"){
$("#searchForm").attr("action","${ctx}/info/Info/export");
$("#searchForm").submit();
}
},{buttonsFocus:1});
top.$('.jbox-body .jbox-icon').css('top','55px');
});
$("#btnImport").click(function(){
$.jBox($("#importBox").html(), {title:"导入数据", buttons:{"关闭":true},
bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
});
});

  对于需要使用JeeSite开源项目进行二次开发的话,上面的代码算是一个比较详细的笔记了,如果不使用JeeSite开源项目的话,上面的代码就没有什么用处了。这篇笔记留个自己和需要的人吧。我还会陆续的发一些关于JeeSite的二次开发的笔记。

注:我使用的JeeSite是3.X版本的,不是最新的JeeSite 4的版本。


我的注微信公众号:“码农UP2U”

JeeSite中Excel导入导出的更多相关文章

  1. vue中excel导入导出组件

    vue中导入导出excel,并根据后台返回类型进行判断,导入到数据库中 功能:实现js导入导出excel,并且对导入的excel进行展示,当excel标题名称和数据库的名称标题匹配时,则对应列导入的数 ...

  2. java中excel导入\导出工具类

    1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...

  3. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  4. Excel导入导出的业务进化场景及组件化的设计方案(上)

    1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...

  5. 关于Excel导入导出的用例设计

    目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...

  6. ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...

  7. Excel导入导出帮助类

    /// <summary>    /// Excel导入导出帮助类    /// 记得引入 NPOI    /// 下载地址   http://npoi.codeplex.com/rele ...

  8. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  9. Octopus——excel导入导出工具

    Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...

随机推荐

  1. 【Unity Shaders】Lighting Models —— 光照模型之Lit Sphere

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  2. 如何在Cocos2D 1.0 中掩饰一个精灵(三)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 尝试编译运行,在你每一次点击屏幕的时候,你将看到我可爱的妻子制作 ...

  3. UNIX环境高级编程——计算机体系结构基础知识

    无论是在CPU外部接总线的设备还是在CPU内部接总线的设备都有各自的地址范围,都可以像访问内存一样访问,很多体系结构(比如ARM)采用这种方式操作设备,称为等都会产生异常. 通常操作系统把虚拟地址空间 ...

  4. 【翻译】在Ext JS应用程序中构建可维护的控制器

    原文:Building Maintainable Controllers in Ext JS Apps 你好You Had Me 你是Tearing Me Apart 模板We Dont Need t ...

  5. 网易内推(Android) 拿offer

    学校BBS上师兄发网易内推,凑下热闹投了一发 一面:电话面 大概25分钟,感觉面试官气场很足,主要关注了其中一个 个人开源项目 1.自我介绍 2.说说你做的这个项目 当时谈到使用到了开源框架xtuil ...

  6. EventBus的其他常用函数

    上一篇EventBus最简易使用方式介绍了EventBus最简易的使用方式,摆脱了叽里呱啦+图片的长篇大论.目的是为了让刚开始接触的人们不晕头转向.那么这篇..我也要开始图片+叽里呱啦了. 转载请注明 ...

  7. 漫谈程序员(十八)windows中的命令subst

    漫谈程序员(十八)windows中的命令subst 用法格式 一.subst [盘符] [路径]  将指定的路径替代盘符,该路径将作为驱动器使用 二.subst /d 解除替代 三.不加任何参数键入  ...

  8. UE4 Hello World 创建第一个UE4工程

    首先先熟悉几个UE4常用的类 AGameMode(控制整个项目的逻辑) The GameMode defines the game being played. It governs thegame r ...

  9. Windows Mobile和Wince(Windows Embedded CE)的字符集问题

    背景 开发过Windows Mobile和Wince(Windows Embedded CE)的开发者,特别是Native C++开发者,或多或少都遇到过ANSI字符集和Unicode字符集的转换问题 ...

  10. Cocos2D绘制纹理的一般方法

    如果你想在通常情况下绘制纹理,最简单的方法是在CCSprite的子类中实现.否则你将不得不自己创建一个CCRenderState对象传递给blend模式,着色器以及(可选的)纹理给CCRenderer ...