简介

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

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

引入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,导出静态方法

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类为系统内部封装类,大家注意copyURL 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: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:mergeCells 合并单元格

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

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

示例图:

动态列-综合使用

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

总结

以上为我使用过程中,几个较常用的操作,关于复杂的动态列使用excel模板,详见附件

Java 导出Excel利器 JXLS(excel模板配置教程)相关推荐

  1. java导出功能无法下载excel

    java导出功能无法下载excel 开始使用ajax请求,项目不报错,但是浏览器也没有Excel文件下载,查找代码好久都没有解决 原因:Ajax请求只是个"字符型"的请求,即请求的 ...

  2. Java导出主表和明细Excel

    Java导出主表和明细Excel 使用POI导出数据库主表和明细数据,原文https://www.cnblogs.com/gudongcheng/p/8268909.html 业务代码 package ...

  3. Discuz!论坛程序安装+模板配置教程

    Discuz!论坛程序安装+模板配置教程 Linux系统安装方法: 第一步:检查是否安装apache mysql php ps -ef |grep httpd ps -ef |grep mysql p ...

  4. 用java输出学生信息表代码_使用java导出学生成绩表-excel成绩表

    本文简单研究使用java导出学生成绩表,使用到的导出Excel的技术为Apache poi,相关的技术可以查看我之前的文章.之前导出的Excel的格式为03版的xls,使用的jar为poi-3.10- ...

  5. Java导出带格式的Excel数据到Word表格

    在Word中创建报告时,我们经常会遇到这样的情况:我们需要将数据从Excel中复制和粘贴到Word中,这样读者就可以直接在Word中浏览数据,而不用打开Excel文档.在本文中,您将学习如何使用Spi ...

  6. 如何通过Java导出带格式的 Excel 数据到 Word 表格

    在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件.但是如果表格比较长,内容就会存在一定程度的丢失,无法 ...

  7. java 导出复杂格式的 Excel 留着自己备用

    效果   看看是不是你要的样子 POM.xml <dependency><groupId>org.apache.poi</groupId><artifactI ...

  8. java导出csv文件使用Excel打开乱码问题

    写一个csv文件,发现使用 notpad++ 打开是没有问题的,但是使用 Excel 打开之后显示乱码 刚开始的代码是这样子的: ByteArrayOutputStream os = new Byte ...

  9. Java导出PDF文档(模板导出和自定义)

    项目场景: 需要导出PDF文档,支持模板导出和自定义文档格式. 场景分析: PDF模板创建可使用表单域创建表单字段,引入数据填充,或者根据实际需要生成html转换成pdf. 解决方案: PDF模板可以 ...

最新文章

  1. 用神经网络二分类人脑与电脑
  2. 看懂mysql执行计划--官方文档
  3. 康托展开式---我排第几+逆康托展开
  4. Android Get方式发送信息
  5. 三星uboot1.1.6源码分析——start.s(4)——从NAND复制源码到RAM(3)
  6. lua中table的常用方法
  7. Ubuntu13.04配置优化(四)转贴
  8. Vue项目中的文件/文件夹命名规范
  9. springboot 程序发布到tomcat运行
  10. mpeg4的解码演示程序
  11. 耗时6个月,整理了30款免费高评分软件,完爆付费
  12. matlab创建个性化绚丽色彩图
  13. 苹果计算机没有根号,计算器根号,在iphone自带的计算器上怎样打出根号
  14. 免费WiFi上网软件是什么?怎么用?
  15. 【误判心理学】查理芒格的25种误判心理倾向
  16. vue项目中获取当前设备 操作系统及版本,设备型号,ip,地区信息
  17. 重载和重写的区别。。。。
  18. 即构抓娃娃H5方案全球首家支持HTTPS,抓娃娃先从安全抓起!
  19. 哈工大2022年大作业——程序人生
  20. 除了IaaS,PaaS,SaaS,这里还有RaaS你应该了解

热门文章

  1. Matlab深度学习入门实例:基于AlexNet的红绿灯识别(附完整代码)
  2. PDF文件不能复制?
  3. 一张长图带你看懂物联网产业十数载“江湖风云”
  4. arm系列交叉编译器各版本区别
  5. linux下使用C获取mp3 ID3数据时的一些注意事项(v1,v2.3,v2.4)
  6. 场景应用:移动互联网的痛点思维
  7. NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)
  8. 《思维力:高效的系统思维》读书笔记01 - 思维力不足的4大痛点
  9. 随机梯度下降算法SGD(Stochastic gradient descent)
  10. 多线程并发问题 黄牛卖票和模拟龟兔赛跑问题分析