导入导出

在实际开发中经常需要使用导入导出功能来加快数据的操作。在项目中可以使用注解来完成此项功能。在需要被导入导出的实体类属性添加@Excel注解,目前支持参数如下:

参数类型默认值描述
nameString导出到Excel中的名字
dateFormatString日期格式, 如: yyyy-MM-dd
readConverterExpString读取内容转表达式 (如: 0=男,1=女,2=未知)
columnTypeEnumType.STRING导出类型(0数字 1字符串)
heightString14导出时在excel中每个列的高度 单位为字符
widthString16导出时在excel中每个列的宽 单位为字符
suffixString文字后缀,如% 90 变成90%
defaultValueString当值为空时,字段的默认值
promptString提示信息
comboStringNull设置只能选择不能输入的列内容
targetAttrString另一个类中的属性名称,支持多级获取,以小数点隔开
typeEnumType.ALL字段类型(0:导出导入;1:仅导出;2:仅导入)

导出实现流程

1、前端调用封装好的方法$.table.init,传入后台exportUrl

  1. var options = {
  2. exportUrl: prefix + "/export",
  3. columns: [{
  4. field: 'id',
  5. title: '主键'
  6. },
  7. {
  8. field: 'name',
  9. title: '名称'
  10. }]
  11. };
  12. $.table.init(options);

2、添加导出按钮事件

  1. <a class="btn btn-warning" onclick="$.table.exportExcel()">
  2. <i class="fa fa-download"></i> 导出
  3. </a>

3、在实体变量上添加@Excel注解

  1. @Excel(name = "用户序号", prompt = "用户编号")
  2. private Long userId;
  3. @Excel(name = "用户名称")
  4. private String userName;
  5. @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
  6. private String sex;
  7. @Excel(name = "最后登陆时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
  8. private Date loginDate;

4、在Controller添加导出方法

  1. @PostMapping("/export")
  2. @ResponseBody
  3. public AjaxResult export(User user)
  4. {
  5. List<User> list = userService.selectUserList(user);
  6. ExcelUtil<User> util = new ExcelUtil<User>(User.class);
  7. return util.exportExcel(list, "用户数据");
  8. }

导入实现流程

1、前端调用封装好的方法$.table.init,传入后台importUrl。

  1. var options = {
  2. importUrl: prefix + "/importData",
  3. columns: [{
  4. field: 'id',
  5. title: '主键'
  6. },
  7. {
  8. field: 'name',
  9. title: '名称'
  10. }]
  11. };
  12. $.table.init(options);

2、添加导入按钮事件

  1. <a class="btn btn-info" onclick="$.table.importExcel()">
  2. <i class="fa fa-upload"></i> 导入
  3. </a>

3、添加导入前端代码,form默认id为importForm,也可指定importExcel(id)

  1. <form id="importForm" enctype="multipart/form-data" class="mt20 mb10" style="display: none;">
  2. <div class="col-xs-offset-1">
  3. <input type="file" id="file" name="file"/>
  4. <div class="mt10 pt5">
  5. <input type="checkbox" id="updateSupport" name="updateSupport" title="如果登录账户已经存在,更新这条数据。"> 是否更新已经存在的用户数据
  6. &nbsp; <a onclick="$.table.importTemplate()" class="btn btn-default btn-xs"><i class="fa fa-file-excel-o"></i> 下载模板</a>
  7. </div>
  8. <font color="red" class="pull-left mt10">
  9. 提示:仅允许导入“xls”或“xlsx”格式文件!
  10. </font>
  11. </div>
  12. </form>

4、在实体变量上添加@Excel注解,默认为导出导入,也可以单独设置仅导入Type.IMPORT

@Excel(name = "用户序号")
private Long id;

@Excel(name = "部门编号", type = Type.IMPORT)
private Long deptId;

@Excel(name = "用户名称")
private String userName;

/** 导出部门多个对象 */
@Excels({
    @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
    @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
})
private SysDept dept;

/** 导出部门单个对象 */
@Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT)
private SysDept dept;

5、在Controller添加导入方法,updateSupport属性为是否存在则覆盖(可选)

@PostMapping("/importData")
@ResponseBody
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{
    ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
    List<SysUser> userList = util.importExcel(file.getInputStream());
    String operName = ShiroUtils.getSysUser().getLoginName();
    String message = userService.importUser(userList, updateSupport, operName);
    return AjaxResult.success(message);
}