小工具知识网

当前位置: 首页 > 行业知识 > jxls——自定义命令设置动态行高

行业知识

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

2026-11-04 19:23:52 来源:互联网转载

文章目录

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

    前言

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

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

    依赖引入

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

        org.jxls    jxls    2.4.5        org.jxls    jxls-poi    1.0.15    org.jxls    jxls-jexcel    1.0.7    net.sf.jxls    jxls-core    1.0.6

    绘制 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 dataList = Lists.newArrayList();        for (int i = 0; i  

      执行后,生成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 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 dataList = Lists.newArrayList();        for (int i = 0; i  

      执行后的效果如下所示:

      关于自动换行

      jxls没有对应的自动换行操作,但是jxls可以在模板中定义对应的单元格样式。只需要在模板中对需要做自动换行的列增加如下配置。

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

上一篇:throw的复数怎么读?

下一篇:mvc怎么发布到服务器错误?