Java中使用JXLS工具类导出复杂Excel表格

这篇具有很好参考价值的文章主要介绍了Java中使用JXLS工具类导出复杂Excel表格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

   在项目开发中,我们会遇到各种文件导出的开发场景,但是这种情况并都不常用,于是本人将自己工作中所用的代码封装成工具类,旨在记录工具类使用方法和技术分享。

一、Jxls的简介

   Jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。Java中成熟的excel导出工具备Pol、Jxl,但他们都是使用java代码的方式来导出Excel,编码效率很低且不方便维护。

二、快速开始

1、导入依赖

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.4.6</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.0.12</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-jexcel</artifactId>
    <version>1.0.6</version>
</dependency>


2、定义导出的模板

   导入依赖后,我们导出需要使用到模板,我们要先用word建立一个xlsx的模板(切记:新建excel工作表要使用xlsx格式,不要使用xls格式,因为使用xls导出的时候xlsx表格数据有可能会有问题)
建立好xlsx工作表了就根据实际需求的页面在xlsx表格上把需要的导出的框架画出来就可,赋值就要使用表达式了,表达式可以查看官网也可以查看我下方写的。官方网址,模板弄好之后,需要放在resource目录下,在Java中进行读取,下面代码中有具体实现。
如何写表达式,在工作表中右键插入批注,office中添加批注快捷键(Shit + F2)

jxls,Java导入导出,excel,java,spring boot

jx:each(items="${collection}" var="item" lastCell="A3")

其中items是你传入的集合的名称,var是集合中每个对象的别名,lastCell是循环最后的位置

jxls,Java导入导出,excel,java,spring boot

jx:area(lastCell="H3")

这里设置标题范围,最宽到H3

模板表达式

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

(1)单个值的注入:

${variable},variable是你传入的参数的key

(2)迭代循环注入:

jx:each(items="${collection}" var="item" lastCell="A3")

其中items是你传入的集合的名称,var是集合中每个对象的别名,lastCell是循环最后的位置

(3)条件判断:

jx:if test="${condition}"   条件为真时执行的内容

(4)合并单元格:

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

3、使用工具类

package com.sansint.industry.utils;
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 javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;


/**
 * @author DongJiYong
 * jxls工具类
 */
public class JxlsUtils {


    /**
     * 模板导出
     *
     * @param is
     * @param os
     * @param model
     * @throws IOException
     */
    public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {
        Context context = PoiTransformer.createInitialContext();
        if (model != null) {
            for (Map.Entry<String, Object> Entry : model.entrySet()) {
                context.putVar(Entry.getKey(), Entry.getValue());
            }
        }
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer = jxlsHelper.createTransformer(is, os);
        //获得配置
        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
        //设置静默模式,不报警告
        evaluator.getJexlEngine().setSilent(true);
        //函数强制,自定义功能
        Map<String, Object> funcs = new HashMap<>();
        funcs.put("utils", new JxlsUtils());
        evaluator.getJexlEngine().setFunctions(funcs);
        //必须要这个,否则表格函数统计会错乱
        jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
    }

    /**
     * 导出excel
     *
     * @param templatePath
     * @param os
     * @param model
     * @throws Exception
     */
    public static void exportExcel(String templatePath, OutputStream os, Map<String, Object> model) throws Exception {
        File template = getTemplate(templatePath);
        if (template != null) {
            exportExcel(new FileInputStream(template), os, model);
        } else {
            throw new Exception("Excel 模板未找到。");
        }
    }

    /**
     * 获取jxls模板
     *
     * @param path
     * @return
     */
    public static File getTemplate(String path) {
        File template = new File(path);
        if (template.exists()) {
            return template;
        }
        return null;
    }


    /**
     * 设置响应头、文件名
     *
     * @param response
     * @param fileName
     * @throws UnsupportedEncodingException
     */
    public static void setResponse(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
        fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
    }
}

4、Controller层代码

使用该工具类主要在Controller层或者Service层封装好导出的数据和导出流即可,本人是在Controller层进行封装的数据。文章来源地址https://www.toymoban.com/news/detail-777380.html

 /***
     * excel导出
     * @param request
     * @param sanSintUser
     */
    @GetMapping("/excel")
    public void excelDownload(ParamRequest request, SanSintUser sanSintUser, HttpServletResponse response) {
        try {
            //根据定义的excel模板 构建导出的数据
            Map<String, Object> map = buildData(request, sanSintUser);
            //设置导出流
            JxlsUtils.setResponse(response, "能源档案信息");
            // 获取excel模版路径
            InputStream tplIs = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/档案列表.xlsx");
            JxlsUtils.exportExcel(tplIs, response.getOutputStream(), map);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


   private Map<String, Object> buildData(ParamRequest request, SanSintUser sanSintUser) {
        Map<String, Object> map = new HashMap<>();
        List<Map<String, Object>> energyFileExcelList = new ArrayList<>();
        //从数据库查询出的数据集合
        List<EnergyFile> list = new ArrayList<>();
        if (!CollectionUtils.isEmpty(request.getIds())) {
            //如果有id,则查询id对应的能源档案信息
            list = energyFileService.selectEnergyFileByIds(request.getIds());
        } else {
            //如果没有id,则查询全部能源档案信息
            EnergyFile energyFile = new EnergyFile();
            energyFile.setTenantId(sanSintUser.getTenantId());
            list = energyFileService.selectEnergy(energyFile);
        }
        //构建excel数据
        for (int i = 0; i < list.size(); i++) {
            EnergyFile energyFile = list.get(i);
            Map<String, Object> dataMap = new LinkedHashMap<>();
            dataMap.put("num", i + 1);
            dataMap.put("categoryName", energyFile.getCategoryName());
            dataMap.put("itemName", energyFile.getItemName());
            dataMap.put("fileName", energyFile.getFileName());
            String fileType = buildFileType(energyFile);
            dataMap.put("fileType", fileType);
            String createUserName = energyFileService.selectCreateUserNameByUserId(energyFile.getCreateUser());
            dataMap.put("createUserStr", createUserName);
            dataMap.put("createTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(energyFile.getCreateTime()));
            dataMap.put("deptName", energyFile.getDeptName());
            dataMap.put("jobName", energyFile.getJobName());
            dataMap.put("fileUrl", energyFile.getFileUrl());
            energyFileExcelList.add(dataMap);
        }

到了这里,关于Java中使用JXLS工具类导出复杂Excel表格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jxls 实现动态导出功能

    在实际做项目的过程中,导出报表时需要根据每个人所关注的点不一样,所需导出的字段也不一样,这时后端就需要根据每个所选的字段去相应的报表,这就是本文要讲的动态导出报表。 用户在页面上选择要导出的字段,后端根据所选的字段进行导出 将要导出的所有字段做

    2024年01月18日
    浏览(48)
  • 【vue导入导出Excel】vue简单实现导出和导入复杂表头excel表格功能【纯前端版本和配合后端版本】

    前言 这是一个常用的功能,就是导入和导出excel表格 但是时常会遇到一些复杂表头的表格导出和导入 比如我这个案例里面的三层表头的表格。 网上看了下发现了一个非常简单导出和导入方法 当然这个是纯前端的版本,会出现分页不好下载的情况。所以实际工作中,导出还是

    2024年02月11日
    浏览(64)
  • 【工具插件类教学】NPOI插件使用Excel表格的导入和导出(包含图片)

    目录 一.导入Excel 解析读取 1.选择导入的目标文件 2.解析读取导入的文件

    2024年01月16日
    浏览(53)
  • Easys Excel的表格导入(读)导出(写)-----java

    可以学习一些新知识: EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel excel的一些优点和缺点 java解析excel的框架有很多 : poi jxl,存在问题:非常的消耗内存, easyexcel 我们遇到再大的excel都不会出现内存溢出的问题 能够将一个原本3M excel文件,poi来操作将会占用内存 100MB,

    2024年02月13日
    浏览(56)
  • 使用Java导入、导出excel详解(附有封装好的工具类)

    😜 作           者 :是江迪呀 ✒️ 本文 : Java 、 Excel 、 导出 、 工具类 、 后端 ☀️ 每日   一言 :有些事情不是对的才去坚持,而是坚持了它才是对的! 我们在日常开发中,一定遇到过要将数据导出为 Excel 的需求,那么怎么做呢?在做之前,我们需要思考

    2024年02月06日
    浏览(51)
  • 使用EasyExcel实现Excel表格的导入导出

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重

    2024年02月12日
    浏览(45)
  • EasyPio导入导出excel表格

    EasyPoi是一个功能强大且易于使用的Java Excel操作框架,其主要特点如下: 简单易用:EasyPoi提供简洁而直观的API,使Java开发人员能够轻松地进行Excel导入导出操作,无需繁琐的代码和复杂的配置。 支持多种数据源:EasyPoi支持从数据库、List集合、Map等各种数据源快速生成Excel文

    2024年02月12日
    浏览(57)
  • C#读写导入导出Excel表格模板(NPOI)

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。 NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。 1、您可以完全免费使用该框架 2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等) 3、专业的技

    2023年04月08日
    浏览(38)
  • [软件工具]AI软件离线表格识别工具使用教程图像转excel转表格可复制文字表格导出实时截图识别成表格

    【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR.git 【算法介绍】 PaddleOCR是一个基于PaddlePaddle框架的开源光学字符识别(OCR)工具库,由百度公司开发。它提供了一套完整的OCR解决方案,包括文字检测、文字识别以及版面分析等功能。PaddleOCR旨在帮助开发者和研究者快速构

    2024年01月18日
    浏览(55)
  • 前端vue+elementui导出复杂(单元格合并,多级表头)表格el-table转为excel导出

    需求 :前端对el-table表格导出 插件 : npm install xlsx -S npm install file-saver --save 原理 :直接导出el-table的表格里面的数据,这样就会存在缺点,只会导出当前页面的数据,如果需要导出全部数据,可以自己重新渲染一个全部数据不可见的el-table表格,来导出就可以了 扩展 :经过

    2024年02月04日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包