夜雨聆风学习资料网

ARTICLE · 1159089

Java 导出 Excel 利器:JXLS

Java 导出 Excel 利器:JXLS
将 小哈学Java设为“星标⭐”

第一时间收到文章更新

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

在线 Java 面试刷题(已更新334题,图文并茂):https://www.quanxiaoha.com/java-interview

目录

  • 简介
  • 引入 maven 依赖
  • 后台代码
  • 创建模板
  • XLS 表达式
    • jx:area
    • jx:each 最常用的 xls 表达式
    • jx:mergeCells 合并单元格
    • 动态列-综合使用
  • 总结

简介

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

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

“

https://jxls.sourceforge.net/

引入 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>

后台代码

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

publicstaticvoidexportExcel(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")@ResponseBodypublicvoidexportTradeCreditData(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)。

示例图:

jx:area 示例图

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")

简单的示例图:

jx:each 简单示例图

复杂的示例图:

jx:each 复杂示例图

jx:mergeCells 合并单元格

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

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

示例图:

jx:mergeCells 示例图

动态列-综合使用

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

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

示例截图:

动态列示例截图

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

  • countMonths:动态列集合,month 为集合循环的实体,取值为:${month}
  • contracts:行数据集合,contract、colData 都是集合循环的实体,取值为:${contract.custName}等
  • colData.monthData.get(month):动态列的数据,根据列名去匹配实体字段
  • ${empty()}:判断集合对应动态列数据是否为空,做好判断,写入数据

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

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

总结

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

加入小哈的星球,你将获得: 专属的项目实战(4个项目) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书

  • 《仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/
  • 《Spring AI 应用(RAG 智能客服)》已完结, 基于 Spring AI 2.x + Spring Boot 4.x + JDK 21

  • 《秒杀系统设计》正在更新中,单体到微服务高并发架构演进

  • 《前后端分离博客项目(全栈开发)》 已完结,演示链接:http://116.62.199.48/
  • 项目阅读地址:https://quanxiaoha.com/column

截止目前,累计输出 150w+ 字,讲解图 4013+ 张,还在持续爆肝中..戳我加入学习,解锁全部项目,已有4900+小伙伴加入

1. 我的私密学习小圈子,从0到1手撸企业实战项目~

2. 多账号统一登录(实现方案)

3. 全网显示 IP 归属地,准确率 99.9%,这个开源的 API 离线库强大到离谱!

4. 同事的 Claude Code 为什么比你的强?差的就是这4步

最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。

点“在看”支持小哈呀,谢谢啦

相关学习资料