Redian新闻
>
Java 导出 Excel 利器:JXLS

Java 导出 Excel 利器:JXLS

公众号新闻

相信大家能经常性的遇到项目上各类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,导出静态方法

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

示例图:

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

来源:blog.csdn.net/baidu_14958441/ar

ticle/details/128528237


往期推荐:


再见,Navicat!!
警报炸锅,FastJson 又立功了。。
高德导航红绿灯为啥能读秒?
为什么 List 原生排序比 stream() 流效率更高?



微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
微软正在将Python引入Excel全新实测!2小时拿下WSO官方Excel证书,挂上LinkedIn后被问爆!谷歌内部Excel泄露, 超12,000名员工真实薪资流出...加国办卡 中国免漫游轻松用!中国电信CTExcel推出“免漫游”产品!记忆 时光向前摊牌了!五大行面试官:今年不精通Excel的留学生,通通不要!Excel变天!微软把Python「塞」进去了,直接可搞机器学习整理了3小时,这50多个常用Excel技巧,你一定不能错过!Java导入、导出excel保姆级教程(附封装好的工具类)看完高盛内部的Excel课程,才知道自己为什么进不了华尔街...哭了!影响因子暴跌!某院校医学博士上网求助,结果……(附IF汇总Excel)加州富豪被爆猎艳5000人!还做成excel表!情妇公开撕破脸,却一个比一个惨...Excel里打√打×的方法,终于整理齐了!你如果会用Excel核对数据,又何必加班到崩溃?下乡时差点学会了抽烟高盛出品投行Excel教程,留学生狂喜:2天搞定,比学校教得有用用PQ太难,手动太慢,这才是最牛x的Excel统计工具!Scuba Oversized Java: 全拉链带帽 vs 半拉链立领美国富豪被爆猎艳5000人!还做成excel表...当AI开始一键生成PPT和Excel,我承认,我们真的慌了……加国办卡中国免漫游轻松用!中国电信CTExcel推出“回中国,免漫游”产品难以想象!美国富豪被爆猎艳5000人!竟然还做成excel表...Excel最新版官方支持Python,打工人的工具又强化了烟火气(3)微软宣布 Python 与 Excel “大合体”!!!电影《 狂怒沙暴》7月28日上线网飞重磅!微软官宣Python接入Excel我熬夜整理了近1000篇Excel教程合集,免费分享!微软放大招,Excel集成Python。。。lulu折扣区更新了,大量scuba(绿金、Java)define打折,Blissfeel 运动鞋黑色才794个高手专用的Excel小技巧,让你的工作效率翻倍!VLOOKUP这次真的要退休了?Excel居然和Python合体,看完我就跪了!英国大摩点名要!WSO推出金融圈通用Excel证书!2小时就能白嫖拿到!高盛官方出品投行Excel教程,留学生狂喜:2天搞定,比学校教得有用分手后,大温前女友发了个excel表管我要钱......一天立省16刀!加国办卡中国免漫游轻松用,中国电信CTExcel推出“回中国,免漫游”产品7/7/2023, 多情应笑我
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。