ExcelKit

简介: 简单、好用且轻量级的海量Excel文件导入导出解决方案。

POM.xml

<dependency>
    <groupId>com.wuwenze</groupId>
    <artifactId>ExcelKit</artifactId>
    <version>2.0.72</version>
</dependency>

ExcelKit 2.0.72 要求poi 至少3.17版本

ExcelKit 2.0.6 要求poi 不能高于3.10版本  (老项目推荐引入此版本)

示例

1. ExcelMapping (配置Excel与实体之间的映射关系)

现支持两种配置方式: 注解 或者 XML

@Excel("用户信息")
public class User {
  @ExcelField(value = "编号", width = 30)
  private Integer userId;
  @ExcelField(//value = "用户名",//required = true,//validator = UsernameValidator.class,//
      comment = "请填写用户名,最大长度为12,且不能重复"
  )
  private String username;
  @ExcelField(value = "密码", required = true, maxLength = 32)
  private String password;
  @ExcelField(value = "邮箱", validator = UserEmailValidator.class)
  private String email;
  @ExcelField(//value = "性别",//readConverterExp = "未知=0,男=1,女=2",//writeConverterExp = "0=未知,1=男,2=女",//options = SexOptions.class//
  )
  private Integer sex;
  @ExcelField(//value = "用户组",//name = "userGroup.name",//options = UserGroupNameOptions.class
  )
  private UserGroup userGroup;
  @ExcelField(value = "创建时间", dateFormat = "yyyy/MM/dd HH:mm:ss")
  private Date createAt;
  @ExcelField(//value = "自定义字段",//maxLength = 80,//comment = "可以乱填,但是长度不能超过80,导入时最终会转换为数字",//writeConverter = CustomizeFieldWriteConverter.class,// 写文件时,将数字转字符串
      readConverter = CustomizeFieldReadConverter.class// 读文件时,将字符串转数字
  )
  private Integer customizeField;
  // Getter and Setter ..
}


XML 配置方式, 必须需将 xml 文件放置在classpath:excel-mapping/{entityClassName}.xml

public class User2 {
  private Integer userId;
  private String username;
  private String password;
  private String email;
  private Integer sex;
  private UserGroup userGroup;
  private Date createAt;
  private Integer customizeField;
  // Getter and Setter ..
}

classpath:excel-mapping/com.wuwenze.entity.User2.xml

<?xml version="1.0" encoding="UTF-8"?>
<excel-mapping name="用户信息">
    <property name="userId" column="编号" width="30"/>
    <property
        name="username"
        column="用户名"
        required="true"
        validator="com.wuwenze.validator.UsernameValidator"
        comment="请填写用户名,最大长度为12,且不能重复"
      />
      <property name="password" column="密码" required="true" maxLength="32"/>
      <property name="email" column="邮箱" validator="com.wuwenze.validator.UserEmailValidator"/><property
        name="sex"
        column="性别"
        readConverterExp="未知=0,男=1,女=2"
        writeConverterExp="0=未知,1=男,2=女"
        options="com.wuwenze.options.SexOptions"
      />
      <property name="userGroup.name" column="用户组" options="com.wuwenze.options.UserGroupNameOptions"/><property name="createAt" column="创建时间" dateFormat="yyyy/MM/dd HH:mm:ss"/><property
        name="customizeField"
        column="自定义字段"
        maxLength="80"
        comment="可以乱填,但是长度不能超过80,导入时最终会转换为数字"
        writeConverter="com.wuwenze.converter.CustomizeFieldWriteConverter"
        readConverter="com.wuwenze.converter.CustomizeFieldReadConverter"
      />
  </excel-mapping>

以上两种方式2选一即可, ExcelKit 会优先装载 XML 配置文件.


2. 实现相关的转换器

通过实现com.wuwenze.poi.config.Options自定义导入模板的下拉框数据源。


public class UserGroupNameOptions implements Options {
  @Overridepublic String[] get() {
    return new String[]{"管理组", "普通会员组", "游客"};
  }
}
public class UsernameValidator implements Validator {
  final List<String> ERROR_USERNAME_LIST = Lists.newArrayList(
      "admin", "root", "master", "administrator", "sb"
  );
  @Overridepublic String valid(Object o) {
    String username = (String) o;
    if (username.length() > 12) {
      return "用户名不能超过12个字符。";
    }
    if (ERROR_USERNAME_LIST.contains(username)) {
      return "用户名非法,不允许使用。";
    }
    return null;
  }
}
public class CustomizeFieldWriteConverter implements WriteConverter {
  /**
   * 写文件时,将值进行转换(此处示例为将数值拼接为指定格式的字符串)
   */@Overridepublic String convert(Object o) throws ExcelKitWriteConverterException {
    return (o + "_convertedValue");
  }
}
public class CustomizeFieldReadConverter implements ReadConverter {
  /**
   * 读取单元格时,将值进行转换(此处示例为计算单元格字符串char的总和)
   */@Overridepublic Object convert(Object o) throws ExcelKitReadConverterException {
    String value = (String) o;
    int convertedValue = 0;
    for (char c : value.toCharArray()) {
      convertedValue += Integer.valueOf(c);
    }
    return convertedValue;
  }
}

3. 一行代码构建 Excel 导入模板

使用 ExcelKit 提供的API 构建导入模板, 会根据配置生成批注, 下拉框等

// 生成导入模板(含3条示例数据)@RequestMapping(value = "/downTemplate", method = RequestMethod.GET)
public void downTemplate(HttpServletResponse response) {
  List<User> userList = DbUtil.getUserList(3);
  ExcelKit.$Export(User.class, response).downXlsx(userList, true);
}

网络异常,图片无法展示
|


网络异常,图片无法展示
|


4. 执行文件导入

使用边读边处理的方式, 无需担心内存溢出, 也不用理会 Excel 文件到底有多大.

@RequestMapping(value = "/importUser", method = RequestMethod.POST)
public ResponseEntity<?> importUser(@RequestParam MultipartFile file)
    throws IOException {
  long beginMillis = System.currentTimeMillis();
  List<User> successList = Lists.newArrayList();
  List<Map<String, Object>> errorList = Lists.newArrayList();
  ExcelKit.$Import(User.class)
      .readXlsx(file.getInputStream(), new ExcelReadHandler<User>() {
        @Overridepublic void onSuccess(int sheetIndex, int rowIndex, User entity) {
          successList.add(entity); // 单行读取成功,加入入库队列。
        }
        @Overridepublic void onError(int sheetIndex, int rowIndex,
            List<ExcelErrorField> errorFields) {
          // 读取数据失败,记录了当前行所有失败的数据
          errorList.add(MapUtil.newHashMap(//"sheetIndex", sheetIndex,//"rowIndex", rowIndex,//"errorFields", errorFields//
          ));
        }
      });
  // TODO: 执行successList的入库操作。return ResponseEntity.ok(MapUtil.newHashMap(
      "data", successList,
      "haveError", !CollectionUtil.isEmpty(errorList),
      "error", errorList,
      "timeConsuming", (System.currentTimeMillis() - beginMillis) / 1000L
  ));
}


全部导入成功示例:

网络异常,图片无法展示
|

部分导入失败示例(包含错误信息):

网络异常,图片无法展示
|


5. 一行代码执行 Excel 批量导出.

基于 Apache POI SXSSF 系列API实现导出, 大幅优化导出性能.

@RequestMapping(value = "/downXlsx", method = RequestMethod.GET)
public void downXlsx(HttpServletResponse response) {
  long beginMillis = System.currentTimeMillis();
  List<User> userList = DbUtil.getUserList(100000);// 生成10w条测试数据ExcelKit.$Export(User.class, response).downXlsx(userList, false);
  log.info("#ExcelKit.$Export success, size={},timeConsuming={}s",//
      userList.size(), (System.currentTimeMillis() - beginMillis) / 1000L);
}

网络异常,图片无法展示
|

需要注意的是,虽然ExcelKit针对导出做了大量优化,但导出数据也需要量力而行。

网络异常,图片无法展示
|

目录
相关文章
|
小程序
支付宝扫码跳转小程序并传参
支付宝扫码跳转小程序并传参
3065 1
|
运维 Devops Java
阿里巴巴DevOps实践指南(十三)| 测试提效
分布式测试为测试速度插上了翅膀,精准测试有效的识别出了测试的范围,增量覆盖率又为测试的不断完备提供了有利的指引,线上覆盖率帮助我们有效的进行应用瘦身。充分利用好这些技术手段进行测试提效,可以让持续交付的过程更加的顺畅
阿里巴巴DevOps实践指南(十三)| 测试提效
|
10月前
|
Java 大数据 Apache
Excel工具-HUTOOL-输出Excel
Hutool基于Apache POI封装了Excel读写功能,提供ExcelWriter和BigExcelWriter类,支持写出List、Map、Bean等数据类型到Excel,可自定义样式、多sheet操作,并解决大数据量导出时的内存溢出问题,适用于文件导出、客户端下载等场景。
|
11月前
|
Kubernetes Cloud Native Nacos
nacos3.0
Nacos 3.0实现从配置中心到云原生控制面的跃迁,通过引入JRaft提升集群性能与稳定性,支持gRPC和xDS协议,打通服务网格生态,构建统一、可扩展的多集群服务治理平台,成为云原生基础设施的核心控制中枢。
|
10月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
Nacos配置中心通过集中化管理微服务配置,实现动态热更新与环境隔离,避免频繁重启服务。借助bootstrap.yml优先加载配置,支持@RefreshScope热刷新、@ConfigurationProperties绑定,并实现多环境共享及优先级控制,结合Nginx搭建高可用集群,提升系统稳定性与可维护性。
515 0
|
Linux
Centos查看已经安装的软件或者包
Centos查看已经安装的软件或者包
1339 0
|
人工智能 自然语言处理 搜索推荐
HiFox AI:一站式 AI 应用平台,多模型快速接入,自由选用
HiFox AI 是一站式AI应用平台,整合了30多个主流AI模型,提供文本生成、对话交流、图片生成等多种应用场景。平台内置1000+预构建AI应用,支持无代码搭建个性化应用和复杂工作流,帮助用户高效处理重复任务,显著提升工作效率。无论是普通用户还是技术专家,都能在HiFox AI上找到适合自己的解决方案,实现“人人都能使用AI”的愿景。
|
Oracle Java 关系型数据库
CentOS 7.6操作系统部署JDK实战案例
这篇文章介绍了在CentOS 7.6操作系统上通过多种方式部署JDK的详细步骤,包括使用yum安装openjdk、基于rpm包和二进制包安装Oracle JDK,并提供了配置环境变量的方法。
798 80
|
easyexcel API 数据库
EasyExcel复杂excel导入
EasyExcel复杂excel导入
1860 1

热门文章

最新文章