jxls——自定义命令设置动态行高

文章目录

  • 前言
  • 依赖引入
  • 绘制 jxls 批注的 excel 模板
  • 测试类编写
  • 自定义命令
  • 关于自动换行

前言

之前的博客中都简单说了数据的渲染和导出excel文件。包括固定的 表头结构,以及动态 表头和表数据等方式。

本篇博客主要说明自定义命令的方式,控制输出excel文件每行记录的行高

依赖引入

主要依赖以及版本如下所示:

<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls</artifactId>
    <version>2.4.5</version>
</dependency>
<dependency>
    <!-- 可以使用poi的实现也可以用jexcelapi的 -->
    <groupId>org.jxls</groupId>
    <artifactId>jxls-poi</artifactId>
    <version>1.0.15</version>
</dependency>
<dependency>
    <groupId>org.jxls</groupId>
    <artifactId>jxls-jexcel</artifactId>
    <version>1.0.7</version>
</dependency>
<dependency>
    <groupId>net.sf.jxls</groupId>
    <artifactId>jxls-core</artifactId>
    <version>1.0.6</version>
</dependency>

绘制 jxls 批注的 excel 模板

在这里插入图片描述
其中两个批注分别如下:

  • 整体数据范围:

    Administrator:
    jx:area(lastCell=”H3”)

  • 列表数据渲染范围:

    Administrator:
    jx:each(items=“bDatas” var=“vo” lastCell=“H3” varIndex=“ojbIndex” )

测试类编写

编写一个简单的数据填充逻辑,并生成对应的excel文件。代码如下所示:

import cn.xj.test.UserPo;
import com.google.common.collect.Lists;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.*;
import java.util.*;

public class Test1 {

    public static void main(String[] args) throws IOException {
        Context context = new Context();
        // 数据集合
        List<UserPo> dataList = Lists.newArrayList();
        for (int i = 0; i < 10; i++) {
            UserPo userPo = new UserPo();
            userPo.setNum("1_"+i);
            userPo.setName("xj_"+i);
            userPo.setAge(i+1);
            userPo.setMail("专注写bug测试中文11111");
            dataList.add(userPo);
        }
        // ${item.num}
        context.putVar("bDatas",dataList);

		// 模板文件再resources 目录下
        Resource resource = new ClassPathResource("/report/test_user1.xlsx");
        InputStream is = resource.getInputStream();

        String outFile = System.getProperty("user.dir")+ File.separator+"springboot-poi"+File.separator+"pdf"+File.separator+System.currentTimeMillis()+ ".xlsx";
        OutputStream outputStream = new FileOutputStream(outFile);

        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        jxlsHelper.getAreaBuilder().getTransformer();
        jxlsHelper.processTemplate(is, outputStream, context);
		
		// JxlsHelper.getInstance().processTemplate(is, outputStream, context);
    }
}

执行后,生成excel文件中内容的效果如下所示:
在这里插入图片描述
每行的行高太大,毕竟再模板中就是配置的这么大,显得很散乱。此时则可以使用自定义命令的方式,动态地修改行高

自定义命令

jxls中自定义命令,可以采取继承 AbstractCommand 类实现。自定义命令需要定义命令名称命令逻辑。如下所示:

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.jxls.area.Area;
import org.jxls.command.AbstractCommand;
import org.jxls.common.CellRef;
import org.jxls.common.Context;
import org.jxls.common.Size;
import org.jxls.transform.poi.PoiTransformer;

/**
 * 自定义列高指令
 * 如:
 * jx:autoRowHeight(lastCell ="C3")
 *
 * 还需要在对应的主程序中调用
 */
public class AutoRowHeightCommand extends AbstractCommand {

    /**
     * 批注中的自定义指令
     * @return
     */
    @Override
    public String getName() {
        return "autoRowHeight";
    }

    /**
     * 列高逻辑
     * @param cellRef
     * @param context
     * @return
     */
    @Override
    public Size applyAt(CellRef cellRef, Context context) {
        Area area=getAreaList().get(0);
        Size size = area.applyAt(cellRef, context);

        PoiTransformer transformer = (PoiTransformer) area.getTransformer();

        Sheet sheet = transformer.getWorkbook().getSheet(cellRef.getSheetName());
//        List bDatas = (List) context.getVar("bDatas");
//        int firstDefaultCol = cellRef.getCol(); // 最开始的第一列
//        if(!CollectionUtils.isEmpty(bDatas)){
//            for (int i = 0; i < bDatas.size(); i++) {
//                // 计算中文、字符的长度  设定列宽
//                Object data = bDatas.get(i);
//                if(!StringUtils.isEmpty(data) && (data.getBytes().length+4)>sheet.getColumnWidth(i)){
//                    sheet.setColumnWidth(i+firstDefaultCol,data.getBytes().length+4);
//                }else{
//                    sheet.setColumnWidth(i+firstDefaultCol,30); // 默认
//                }
//
//            }
//        }
        //sheet.setColumnWidth(cellRef.getCol(),50);

        Row row = sheet.getRow(cellRef.getRow());
        row.setHeight((short) -1);

        return size;
    }
}

自定义命令后,需要再模板中增加命令的标识,否则不会生效。

jx:autoRowHeight(lastCell =“H3”)

在这里插入图片描述
其次,还需要再调用jxls做填充渲染之前,补充命令和逻辑的调用。

import cn.xj.jxls.AutoRowHeightCommand;
import cn.xj.test.UserPo;
import com.google.common.collect.Lists;
import org.jxls.builder.xls.XlsCommentAreaBuilder;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.*;
import java.util.*;

public class Test1 {

    public static void main(String[] args) throws IOException {
        Context context = new Context();
        // 数据集合
        List<UserPo> dataList = Lists.newArrayList();
        for (int i = 0; i < 10; i++) {
            UserPo userPo = new UserPo();
            userPo.setNum("1_"+i);
            userPo.setName("xj_"+i);
            userPo.setAge(i+1);
            userPo.setMail("专注写bug测试中文11111");
            dataList.add(userPo);
        }
        // ${item.num}
        context.putVar("bDatas",dataList);

        // 模板文件再resources 目录下
        Resource resource = new ClassPathResource("/report/test_user1.xlsx");
        InputStream is = resource.getInputStream();

        String outFile = System.getProperty("user.dir")+ File.separator+"springboot-poi"+File.separator+"pdf"+File.separator+System.currentTimeMillis()+ ".xlsx";
        OutputStream outputStream = new FileOutputStream(outFile);

        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        jxlsHelper.getAreaBuilder().getTransformer();
        // 渲染前  载入 自定义 命令
        XlsCommentAreaBuilder.addCommandMapping("autoRowHeight", AutoRowHeightCommand.class);
        jxlsHelper.processTemplate(is, outputStream, context);
    }
}

执行后的效果如下所示:
在这里插入图片描述

关于自动换行

jxls没有对应的自动换行操作,但是jxls可以在模板中定义对应的单元格样式。只需要在模板中对需要做自动换行的列增加如下配置。
在这里插入图片描述
再次执行上述的代码逻辑,查看显示效果。
在这里插入图片描述

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

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

相关文章

bert 相似度任务训练简单版本,faiss 寻找相似 topk

目录 任务 代码 train.py predit.py faiss 最相似的 topk 数 任务 使用 bert-base-chinese 训练相似度任务&#xff0c;参考&#xff1a;微调BERT模型实现相似性判断 - 知乎 参考他上面代码&#xff0c;他使用的是 BertForNextSentencePrediction 模型&#xff0c;Bert…

固定资产管理系统包括哪些

固定资产管理是企业经营过程中一项非常重要的任务。它涉及到公司的核心资产&#xff0c;包括土地、建筑物、设备、车辆等。为了有效地管理这些资产&#xff0c;许多企业选择使用固定资产管理系统。那么&#xff0c;固定资产管理系统的内容是什么呢&#xff1f;本文将为您进行全…

O2OA(翱途)通过服务来调用接口实现单点登录案例

本文介绍O2OA服务管理中&#xff0c;接口的权限设定和调用方式。 创建接口 具有服务管理设计权限的用户&#xff08;具有ServiceManager角色或Manager角色&#xff09;打开“服务管理平台”&#xff0c;进入接口配置视图&#xff0c;点击左上角的新建按钮&#xff0c;可创建一…

webpack基础配置及使用

webpack是什么 是一个现代 JavaScript 应用程序的静态模块打包器。当webpack 处理应用程序时&#xff0c;它会递归地构建一个依赖关系图 &#xff0c;其中包含应用程序需要的每个模块&#xff0c;然后将所有这些模块打包成一个或多个 bundle 。主要有 五个核心概念&#xff1a…

11. Nginx进阶-HTTPS

简介 基本概述 SSL SSL是安全套接层。 主要用于认证用户和服务器&#xff0c;确保数据发送到正确的客户机和服务器上。 SSL可以加密数据&#xff0c;防止数据中途被窃取。 SSL也可以维护数据的完整性&#xff0c;确保数据在传输过程中不被改变。 HTTPS HTTPS就是基于SSL来…

vue中使用echarts实现人体动态图

最近一直处于开发大屏的项目&#xff0c;在开发中遇到了一个小知识点&#xff0c;在大屏中如何实现人体动态图。然后看了下echarts官方文档&#xff0c;根据文档中的示例调整出来自己想要的效果。 根据文档上发现 series 中 type 类型设置为 象形柱形图&#xff0c;象形柱图是…

Gitlab 安装部署

目录 1、Jenkins 结合 Gitlab 构建 CI/CD 环境 CI/CD 介绍 CI/CD 流程 Jenkins 简介 GitLab 简介 项目部署方式 CI系统的工作流程 2、搭建 GitLab 安装 GitLab 配置 GitLab 修改root密码 访问 GitLab 开机自启 3、使用 GitLab 管理 GitLab 关闭 GitLab 注册功能…

Conda笔记--移动Conda环境后pip使用异常的解决

1--概述 由于各种原因&#xff0c;需要将Anaconda转变为Minicoda&#xff0c;为了保留之前安装的所有环境&#xff0c;直接将anaconda3/envs的所有环境拷贝到Miniconda/envs中&#xff0c;但在使用移动后环境时会出现pip的错误&#xff1a;bad interpreter: No such file or di…

AWS的RDS数据库开启慢查询日志

#开启慢日志两个参数 slow_query_log 1 设置为1&#xff0c;来启用慢查询日志 long_query_time 5 &#xff08;单位秒&#xff09; sql执行多长时间被定义为慢日志1. 点击RDS然后点击参数组&#xff0c;选择slow_query_log&#xff0c;设置为1【表示开启慢日志】点击保存…

力扣hot9---滑动窗口

题目&#xff1a; 先记录一下&#xff08;没想到有生之年&#xff0c;还能&#xff09;&#xff1a;其实还能优化&#xff0c;后面会讲述优化思路 思路&#xff1a; 滑动窗口的大小就是固定的&#xff0c;就是len_p。那么依次将窗口从s的最左端向右滑动。在当下的窗口中&#x…

python概率分析:为什么葫芦娃救爷爷是一个一个地救成功率最高?

关键词&#xff1a; Python 、葫芦娃 、 概率计算 、 数学 、 建模 前言 过完年了返工后想起了小孩子们爱看的葫芦娃救爷爷的动画片&#xff0c;葫芦娃为什么是一个一个前去救爷爷&#xff0c;为什么不等着七个一起去救爷爷。带着这个疑问&#xff0c;我决定今天用数学的角度…

微信小程序用户隐私保护指引设置

场景&#xff1a;开发小程序时&#xff0c;有时候需要获取用户隐私信息&#xff0c;在提交小程序审核时&#xff0c;需要填写一份隐私保护协议&#xff0c;经常由于填写不规范导致审核不通过&#xff0c;在网上找到了一份模块可供参考 步骤&#xff1a;小程序后台-》设置-》服…

MySQL 学习笔记(基础篇 Day1)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 MySQL 概述 1.1 数据库相关概念 1.2 MySQL 数据库 2 SQL 2.1 SQL 通用语法 2.2 SQL 分类 2.3 DDL 2.4 图形…

周最佳:詹姆斯场均30.3分8.7助 杰伦-布朗场均28.3分分别当选

直播吧指定地址&#xff1a;www.bdky.cn 3月5日讯 今日NBA官方公布了本赛季第19周周最佳球员&#xff0c;湖人球星勒布朗-詹姆斯和绿军球星杰伦-布朗分别当选。 上周詹姆斯场均可以得到30.3分4.7篮板8.7助攻&#xff0c;湖人取得2胜1负战绩。 布朗场均可以得到28.3分5.3篮板…

Linux中断实验:定时器实现按键消抖处理实验一

一. 简介 前面文章学习了Linux驱动按键中断实验&#xff0c;文章地址如下&#xff1a; Linux驱动按键中断实验&#xff1a;按键中断功能的实现-CSDN博客 本文在Linux驱动按键中断实现的基础上&#xff0c;使用定时器实现按键消抖处理。 二. Linux中断实验&#xff1a;定时器…

java:String和StringBuilder 的相互转换实现字符串拼接

public class StringDemo {/* 练习题&#xff1a;字符串拼接升级版1.定义一个int类型的数组&#xff0c;用静态初始化完成数组元素的初始化2.定义一个方法&#xff0c;用于把int数组中的数据按照指定格式拼接成一个字符串返回3.在方法中用StringBuilder按照要求进行拼接&#x…

新生儿放屁的温馨小贴士:呵护宝宝舒适健康成长

引言 新生儿的生活充满了各种令人惊喜和可爱的瞬间&#xff0c;其中包括他们放臭屁的时刻。尽管这看似简单的行为可能引发父母的担忧&#xff0c;但实际上&#xff0c;它通常是宝宝健康发展的自然表现。在这篇文章中&#xff0c;我们将分享一些关于新生儿放臭屁的注意事项&…

面试经典150题 -- 回溯 (总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 17 . 电话号码的字母组合 1 . 先创建一个下标 与 对应字符串映射的数组&#xff0c;这里使用hash表进行映射也是可以的 &#xff1b; 2 . 对于回溯 &#xff0c;…

MySQL性能优化-Mysql索引篇(1)

什么是索引&#xff1f; 数据库中的索引&#xff0c;就好比一本书的目录&#xff0c;它可以帮我们快速进行特定值的定位与查找&#xff0c;从而加快数据查询的效率。索引就是帮助数据库管理系统高效获取数据的数据结构。如果我们不使用索引&#xff0c;就必须从第 1 条记录开始…

什么台灯护眼效果好?一文搞懂如何正确挑选护眼台灯

现在的孩子学习状态可以用四个字来形容&#xff0c;“学业繁重”&#xff0c;不少孩子从上小学开始&#xff0c;晚上完成功课到八九点都是在正常不过的事情了&#xff0c;因此室内的光线环境是非常重要的&#xff0c;直接影响了视力健康尤其是书桌上的那一盏台灯&#xff0c;有…