Java 导出 Excel 利器:JXLS

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

96df4d2364e8b98f9ceb62a2dfa6cd36.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

来源:blog.csdn.net/baidu_14958441
/article/details/128528237


简介

相信大家能经常性的遇到项目上各类excel的导出,简单的excel格式,用简单的poi,easyExcel等工具都能导出。但是针对复杂的excel,有固定的样式、合并单元格、动态列等各类要求,导致excel 导出需要花很大一部分精力去写代码。jxls在很大程度上解决了以上问题。

这里简单介绍下jxls,JXLS是国外一个简单的、轻量级的excel导出库,链接:JXLS官网,这里有详细的文档说明教程(英文版),为了方便大家使用,我举例几个常见的excel模板配置,方便大家使用。

  • https://jxls.sourceforge.net/

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

引入maven依赖

<!-- 版本具体看官网Release,这里我们使用 2.11.0 -->
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>2.11.0</version>
</dependency>
 
<!-- 要使用基于JavaExcelAPI的转换器实现,请添加以下依赖项 -->
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-jexcel</artifactId>
    <version>${jxlsJexcelVersion}</version>
</dependency>

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

后台代码

工具类:JxlsUtils,导出静态方法

public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {
  Context context = new Context();
  if (model != null) {
   for (String key : model.keySet()) {
    context.putVar(key, model.get(key));
   }
  }
  JxlsHelper jxlsHelper = JxlsHelper.getInstance();
  Transformer transformer = jxlsHelper.createTransformer(is, os);
  JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig()
    .getExpressionEvaluator();
  Map<String, Object> funcs = new HashMap<String, Object>();
  funcs.put("utils", new JxlsUtils()); // 添加自定义功能
  evaluator.setJexlEngine(new JexlBuilder().namespaces(funcs).create());
  jxlsHelper.processTemplate(context, transformer);
 }

导出controller

//导出示例Controller
@PostMapping("/export/exportTradeCreditData")
@ResponseBody
public void exportTradeCreditData(HttpServletRequest request, HttpServletResponse response, Date countDate) {
  String templatePath = "template/excel/trade_credit_data.xlsx";
        //查找模板文件路径,这里PathTools类为系统内部封装类,大家注意copy
  URL templateResource = PathTools.findResource(templatePath);
  try (OutputStream out = response.getOutputStream();
    InputStream templateStream = templateResource.openStream();) {
            //业务数据查询
   List<CindaTradeCreditDto> list = countingReportService.queryTradeCreditData(countDate);
 
            //excel模板内,数据组装
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("year", getYear(countDate));
   map.put("contracts", list);
   JxlsUtils.exportExcel(templateStream, out, map);
   out.close();
  }  catch (Exception e) {
   e.printStackTrace();
   log.error("导出excel异常, {}", JxlsUtils.executeException(e));
  }
 }

创建模板

注意事项:excel模板工作表要使用xlsx格式,不要使用xls格式,防止导出时数据转换出错

  • 新建excel模板,xlsx格式

  • 工作表中按照的导出要求,设置表格样式

  • 仅限于简单的表头与行、列的宽度、高度

  • 编写写表达式,在工作表中右键插入批注,office中添加批注快捷键(Shit + F2)

  • 设置区域、数据行、合并单元格、动态列等

XLS表达式

简单列举常用的几个表达式

jx:area

jx:area(lastCell = "H3")

XLS Area 是JxlsPlus中的一个重要概念,它表明excel模板中须要被解析的矩形区域,由A1到最后一个单元格表示,有利于加快解析速度。它须要被定义在excel 模板的第一个单元格(A1).

示例图:

77e24f8511aefa7570b239addaef201c.png

jx:each 最常用的xls表达式

jx:each(items="contracts" var="contract" lastCell="H3")
  • items:上下文中集合的变量名;

  • var:在遍历集合的时候每一条记录的变量名;

  • area:该XLS Command的解析区域;

  • direction:数据在excel中填充的方向,默认(DOWN)向下;

  • select:其值为一个表达式,用来过滤数据

注:如果涉及到动态列,横向遍历,需注意其用法,特别需注意动态列的数据显示问题,下面会讲到

jx:each(items="countMonths" var="month" lastCell="C3" direction="RIGHT")

简单的示例图:

937854376793672dd031ae39f602bbc9.png

复杂的示例图:

5b660fd369d5e8e97a20be7becd5fc82.png

jx:mergeCells 合并单元格

jx:mergeCells(lastCell="合并单元格范围"
[, cols="合并的列数"]
[, rows="合并的行数"]
[, minCols="要合并的最小列数"]
[, minRows="要合并的最小行数"]
)
  • lastCell:合并单元格范围;

  • cols:合并的列数;

  • rows:合并的行数;

  • minCols:要合并的最小列数;

  • minRows:要合并的最小行数;

注意:此命令只能用于还没有合并的单元格。

示例图:

5bde7b66e93808cd71af5683da0ef332.png

动态列-综合使用

jx:each(items="countMonths" var="month" lastCell="C3" direction="RIGHT")

这里还是通过jx:each来使用,不同的是direction 属性的值为:RIGHT(向右),默认为:DOWN(向下)。

示例截图:

ad173804287f7d8c7282f3aeeac4d0f4.png

以上截图中几个参数说明:

  • countMonths:动态列集合,month为集合循环的实体,取值为:${month}

  • contracts:行数据集合,contract、colData 都是集合循环的实体,取值为:${contract.custName}等

  • colData.monthData.get(month):动态列的数据,根据列名去匹配实体字段

  • ${empty()}:判断集合对应动态列数据 是否为空,做好判断,写入数据

动态列数据行的数据获取:

${empty(colData.monthData.get(month) ) ? 0 : colData.monthData.get(month)}

总结

以上为我使用过程中,几个较常用的操作。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

288bd029cf93a20a166caa6693087280.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

d8d29a150257d86bc582855a546a98ee.png

fb4570a3d3b10d5ca96ee251785789da.pnga0b1c9289ee8ce6463e24321e435208b.png96efe59229287f10f4fa94b9251e310a.png6970bac5dcc320242ab10776bf3fe139.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jxls 是一个开源的 Java 库,用于导出 Excel 文件,它可以在 Java 中非常方便地进行使用。下面是使用 Jxls 导出 Excel 的步骤: 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.jxls</groupId> <artifactId>jxls-core</artifactId> <version>1.0.15</version> </dependency> ``` 2. 准备 Excel 模板 在 Excel 文件中准备好要导出的内容,包括表头和数据部分。可以在表格中使用 ${} 来标记需要动态替换的数据。 3. 准备数据Java 代码中准备好要导出数据,可以使用 List 或者 Map 等类型来保存数据。 4. 创建模板引擎 使用 Jxls 提供的模板引擎创建一个模板,可以使用以下代码: ```java InputStream is = new FileInputStream(new File("template.xls")); Workbook workbook = WorkbookFactory.create(is); Transformer transformer = TransformerFactory.createTransformer(workbook, outputStream); ``` 其中,“template.xls”是你准备好的 Excel 模板文件名,outputStream 是导出文件的输出流。 5. 填充数据 使用 Jxls 提供的 API 填充数据,可以使用以下代码: ```java Map<String, Object> beans = new HashMap<>(); beans.put("dataList", dataList); transformer.transformXLS(new HashMap<>(), beans); ``` 其中,“dataList”是你准备好的数据,transformer.transformXLS() 方法将会把数据填充到模板中。 6. 输出文件 使用 Jxls 提供的 API 输出文件,可以使用以下代码: ```java transformer.flush(); outputStream.close(); ``` 这样就可以将 Excel 文件导出到 outputStream 中了。 以上是使用 Jxls 导出 Excel 的基本步骤,你可以根据自己的需求进行更多的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值