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

 更新时间:2024年08月15日 09:58:06   作者:专注写bug  
这篇文章主要介绍了使用jxls自定义命令设置动态行高,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

之前的博客中都简单说了数据的渲染和导出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可以在模板中定义对应的单元格样式。只需要在模板中对需要做自动换行的列增加如下配置。

再次执行上述的代码逻辑,查看显示效果。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java面向对象之继承的概念详解

    Java面向对象之继承的概念详解

    这篇文章主要介绍了Java面向对象之继承的概念详解,Java是一种面向对象的编程语言,继承是实现面向对象编程的基础之一。通过继承,我们可以使代码更具可读性、可重用性和可维护性,从而提高程序的效率和可靠性,需要的朋友可以参考下
    2023-04-04
  • 基于IDEA 的远程调试 Weblogic的操作过程

    基于IDEA 的远程调试 Weblogic的操作过程

    这篇文章主要介绍了基于IDEA 的远程调试 Weblogic的操作过程,本文通过图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • Java 反射机制详解及实例

    Java 反射机制详解及实例

    这篇文章主要介绍了Java 反射机制详解及实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • java:try...catch跳过异常继续处理循环问题

    java:try...catch跳过异常继续处理循环问题

    这篇文章主要介绍了java:try...catch跳过异常继续处理循环问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Spring MVC中@Controller和@RequestMapping注解使用

    Spring MVC中@Controller和@RequestMapping注解使用

    这篇文章主要介绍了Spring MVC中@Controller和@RequestMapping注解使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java 实现切割文件和合并文件的功能

    java 实现切割文件和合并文件的功能

    这篇文章主要介绍了java 实现切割文件和合并文件的功能的相关资料,这里实现文件的切割的实现代码和文件合并的实现代码,需要的朋友可以参考下
    2017-07-07
  • JavaWeb中的组件Filter过滤器解析

    JavaWeb中的组件Filter过滤器解析

    这篇文章主要介绍了JavaWeb中的组件Filter过滤器解析,Filter过滤器是一种用于处理和转换数据的工具,常用于Web开发中,它可以在请求到达服务器之前或响应返回给客户端之前对数据进行预处理或后处理,需要的朋友可以参考下
    2023-10-10
  • 必须掌握的十个Lambda表达式简化代码提高生产力

    必须掌握的十个Lambda表达式简化代码提高生产力

    这篇文章主要为大家介绍了必须掌握的十个Lambda表达式来简化代码提高生产力,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 详解SpringMVC的url-pattern配置及原理剖析

    详解SpringMVC的url-pattern配置及原理剖析

    这篇文章主要介绍了SpringMVC的url-pattern配置及原理剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java多线程中wait notify等待唤醒机制详解

    Java多线程中wait notify等待唤醒机制详解

    这篇文章主要介绍了Java多线程中wait notify等待唤醒机制,由于线程之间是抢占式执行的,因此线程的执行顺序难以预知,但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序,所以这里我们来介绍下等待唤醒机制,需要的朋友可以参考下
    2024-10-10

最新评论