JXLS导出复杂的Excel表格

前言

官方文档: https://jxls.sourceforge.net/getting-started.html

JXLS是一个用于生成Excel文档的Java库。它提供了一种基于模板的方式来生成Excel文档,使得开发者可以在模板中定义样式、公式和数据绑定等内容,然后通过填充数据来生成最终的Excel文档。

使用JXLS,开发者可以通过简单的方式来生成复杂的Excel报表,而无需编写大量的代码。它支持各种常见的Excel功能,如合并单元格、设置边框、设置字体样式等,同时还支持数据绑定和公式计算等高级功能。

JXLS采用Apache POI作为底层的Excel处理库,提供了方便的API来操作Excel文档。它还提供了与Spring和Hibernate等常见Java框架的集成,使得在Java应用中生成Excel报表变得更加简单。

总的来说,JXLS是一个强大且易用的Java库,可以帮助开发者快速、简单地生成Excel文档。它广泛应用于各种需要生成Excel报表的场景,如数据分析、财务报表、销售报表等。JXLS是一个用于生成Excel文档的Java库。它提供了一种基于模板的方式来生成Excel文档,使得开发者可以在模板中定义样式、公式和数据绑定等内容,然后通过填充数据来生成最终的Excel文档。

使用JXLS,开发者可以通过简单的方式来生成复杂的Excel报表,而无需编写大量的代码。它支持各种常见的Excel功能,如合并单元格、设置边框、设置字体样式等,同时还支持数据绑定和公式计算等高级功能。

JXLS采用Apache POI作为底层的Excel处理库,提供了方便的API来操作Excel文档。它还提供了与Spring和Hibernate等常见Java框架的集成,使得在Java应用中生成Excel报表变得更加简单。

总的来说,JXLS是一个强大且易用的Java库,可以帮助开发者快速、简单地生成Excel文档。它广泛应用于各种需要生成Excel报表的场景,如数据分析、财务报表、销售报表等。

JXLS 入门使用

  1. 导入依赖
<!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--jxls的依赖-->
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.jxls</groupId>
            <artifactId>jxls-poi</artifactId>
            <version>2.10.0</version>
        </dependency>
  1. 编写工具类
import org.apache.commons.jexl3.JexlBuilder;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description 描述
 * @Author 作者
 * @Date 2024/3/4
 * @return
 */
public class JxlsUtils {

    public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {
        Context context = PoiTransformer.createInitialContext();
        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);
    }

}
  1. 编写一个导出的controller
import com.ittest.jxls01.pojo.Goods;
import com.ittest.jxls01.util.JxlsUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URLEncoder;
import java.util.*;

@Controller
@RequestMapping("/jxlstest")
@Slf4j
public class JxlsTestController {

    //导出示例Controller
    @GetMapping("/export/exportTest")
    public void export2(HttpServletRequest request, HttpServletResponse response) throws MalformedURLException, UnsupportedEncodingException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/octet-stream");
        String fileName = URLEncoder.encode("千果园报价单" + System.currentTimeMillis() + ".xlsx", "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        log.info("导出数据");
        try {
            List<Goods> list = new ArrayList<>();
            list.add(new Goods("1", "苹果", "6.98", "2024-01-01 12:13:35"));
            list.add(new Goods("2", "桔子", "3.98", "2024-01-01 12:16:45"));
            list.add(new Goods("3", "葡萄", "15.98", "2024-01-02 12:16:45"));
            InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("templates/goods.xlsx");
            //excel模板内,数据组装
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("goods", list);
            map.put("year", "2024");
            JxlsUtils.exportExcel(inputStream, response.getOutputStream(), map);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
  1. 制作模板,存放在resoruces/templates目录下
    在这里插入图片描述
    创建一个模板文件xxx.xlsx,模板需要插入的批注见图

编辑批注,请见审阅> 编辑批注

在这里插入图片描述
在这里插入图片描述

声明jxls的解析区域,lastCell 是最右下角的最后一个需要解析的表达式的位置,小于最后一个表达式的位置,则无法正常解析或者解析显示的数据是空。如demo中最后一个表达式的位置为H3,如果小于此值则无法解析,必须大于等于此值

执行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/429817.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

雍禾植发聚焦医学和美学,雍禾医疗“好医生·一人一案”引领时代

从“秃头大叔”到“秃头少女”&#xff0c;从病理性脱发治疗到美学性毛发诊疗&#xff0c;Z世代下更精细的毛发医疗需求为整个行业带来了重要增量。更多发友意识到毛发的生长和外观对于形象塑造的重要性&#xff0c;并开始寄望通过毛发诊疗来进一步提升个人形象&#xff0c;这一…

【Pytorch 第四讲】图像分类的Tricks

1. 标签平滑 在分类问题中&#xff0c;最后一层一般是全连接层&#xff0c;然后对应标签的one-hot编码&#xff0c;即把对应类别的值编码为1&#xff0c;其他为0。这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来&#xff0c;会有一些问题。这种方式会鼓励模型对不同…

【01】openEuler 源码安装 PostgreSQL

openEuler 源码安装 PostgreSQL 部署环境说明Shell 前端软件包管理器基础概念YUM 简介DNF 简介 源码安装 PostgreSQL环境变量&#xff08;env&#xff09;设置临时环境变量设置永久环境变量设置 初始化数据库&#xff08;initdb&#xff09; 数据库基本操作数据库基本配置&…

Leetcode 26. 删除有序数组中的重复项 java版。 java解决删除重复数组元素并输出长度

1. 官网链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该…

JavaScript实现将输入框内容放大的效果

问题描述&#xff1a;利用DOM所学知识&#xff0c;实现在输入框内输入内容时&#xff0c;在输入框上方显示一个将文字放大的框&#xff0c;在不输入内容时&#xff0c;这个框是被隐藏的。 关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><he…

第三篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas股票市场数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas进行股票市场数据分析常见步骤和示例代码1. 加载数据2. 数据清洗和准备3. 分析股票价格和交易量4. 财务数据分析 二、扩展思路介绍1. 技术指标分析2. 波动性分析3. 相关性分析4.…

用docker部署后端项目

一、搭建局域网 1.1、介绍前后端项目搭建 需要4台服务器&#xff0c;在同一个局域网中 1.2、操作 # 搭建net-ry局域网&#xff0c;用于部署若依项目 net-ry&#xff1a;名字 docker network create net-ry --subnet172.68.0.0/16 --gateway172.68.0.1#查看 docker network ls…

MySQL--优化(SQL语句执行慢,如何分析)

MySQL–优化&#xff08;SQL语句执行慢&#xff0c;如何分析&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 一、如何分析 聚合查询&#xff1a; 对于涉及大量数据的聚合操作&#xff0c;如果可能的…

边缘计算网关在机床生产中的应用-天拓四方

随着工业4.0的推进&#xff0c;物联网&#xff08;IoT&#xff09;技术在各个工业领域中的应用日益广泛。特别是在机床行业&#xff0c;物联网技术的引入不仅提高了生产效率&#xff0c;还实现了对机床设备的实时监控和远程维护。在这一背景下&#xff0c;边缘计算网关的角色愈…

苹果因在iOS音乐流媒体市场上的反向引导行为,在欧盟被罚款18.4亿欧元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

对接华泰极速行情丨DolphinDB INSIGHT 插件使用教程

INSIGHT 是华泰证券依托大数据存储、实时分析等领域的技术积累&#xff0c;整合接入国内多家交易所高频行情数据&#xff0c;为投资者提供集行情接入、推送、回测、计算及分析等功能于一体的行情数据服务解决方案。基于 INSIGHT 官方提供的行情数据服务 C SDK&#xff08;TCP 版…

【对比】Gemini:听说GPT-4你小子挺厉害

前言 &#x1f34a;缘由 谷歌连放大招:Gemini Pro支持中文,Bard学会画画 &#x1f3c0;事情起因&#xff1a; 一心只读圣贤书的狗哥&#xff0c;不经意间被新闻吸引。【谷歌最新人工智能模型Gemini Pro已在欧洲上市 将与ChatGPT竞争】&#xff0c; 平时玩弄ChatGPT-4很熟练了…

[c/c++] 结构体对齐

在 c 语言中&#xff0c;结构体的大小并不是结构体每个成员的大小之和&#xff0c;结构体的大小往往比结构体的成员大小之和要大。如下结构体&#xff0c;每个成员的大小分别是 1、4、1&#xff0c;但是结构体的大小却不是 6&#xff0c;而是 8。 struct Test { char a; int b;…

怎么将pom在文件放到src下方

今天在IDEA从git拉取项目的时候&#xff0c;发现pom.xml文件在文件夹src的上方&#xff0c;平时看惯了项目的pom.xml文件在文件夹src的下方&#xff0c;应该怎么去设置呢&#xff1f; 点击设置——>点击Folder Always on Top 即可 参考&#xff1a;http://t.csdnimg.cn/s34…

淘宝买家卖家ERP API(添加购物车、上下架商品、订单)

custom-自定义API操作 taobao.custom 调用地址 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_se…

【JavaEE进阶】部署Web项目到Linux服务器

文章目录 &#x1f343;前言&#x1f340;什么是部署&#x1f332;环境配置&#x1f6a9;数据准备&#x1f6a9;程序配置⽂件修改 &#x1f384;构建项目并打包&#x1f38b;上传Jar包到服务器,并运行&#x1f6a9;上传Jar包&#x1f6a9;运行程序&#x1f6a9;开放端口号 &…

HotFix原理学习 IL2CPP 学习

原文链接&#xff1a;Unity 游戏用XLua的HotFix实现热更原理揭秘-CSDN博客 本文通过对XLua的HoxFix使用原理的研究揭示出来这样的一套方法。这个方法的 第一步&#xff1a;通过对C#的类与函数设置Hotfix标签。来标识需要支持热更的类和函数。第二步&#xff1a;生成函数连接器…

2024年【焊工(初级)】考试题及焊工(初级)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;考试题是安全生产模拟考试一点通生成的&#xff0c;焊工&#xff08;初级&#xff09;证模拟考试题库是根据焊工&#xff08;初级&#xff09;最新版教材汇编出焊工&#xff08;初级…

XM外汇平台自行扣除客户账户资金,理由荒谬且无据!

小编在FX110网多年&#xff0c;也算是“见多识广”了&#xff0c;可虽说是见惯了平台的“骚操作”&#xff0c;但对于XM平台这一次的行径&#xff0c;还是挺震惊的&#xff0c;只能说平台方多少有点无赖了&#xff01; 事故源于一位XM用户的一次出金&#xff0c;发现莫名其妙被…

LeetCode每日一题之 复写0

目录 题目介绍&#xff1a; 算法原理&#xff1a; 特殊位置处理&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 这种对数组元素进行修改&#xff0c;移动的题目我们仍然可以…