使用jxls自定義命令設(shè)置動態(tài)行高
前言
之前的博客中都簡單說了數(shù)據(jù)的渲染和導出excel文件。包括固定的表頭結(jié)構(gòu),以及動態(tài)表頭和表數(shù)據(jù)等方式。
本篇博客主要說明自定義命令的方式,控制輸出excel文件每行記錄的行高。
依賴引入
主要依賴以及版本如下所示:
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.4.5</version>
</dependency>
<dependency>
<!-- 可以使用poi的實現(xiàn)也可以用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 模板

其中兩個批注分別如下:
- 整體數(shù)據(jù)范圍:
Administrator: jx:area(lastCell=”H3”)
- 列表數(shù)據(jù)渲染范圍:
Administrator: jx:each(items=“bDatas” var=“vo” lastCell=“H3” varIndex=“ojbIndex” )
測試類編寫
編寫一個簡單的數(shù)據(jù)填充邏輯,并生成對應的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();
// 數(shù)據(jù)集合
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);
}
}執(zhí)行后,生成excel文件中內(nèi)容的效果如下所示:

每行的行高太大,畢竟再模板中就是配置的這么大,顯得很散亂。
此時則可以使用自定義命令的方式,動態(tài)地修改行高。
自定義命令
jxls中自定義命令,可以采取繼承 AbstractCommand 類實現(xiàn)。自定義命令需要定義命令名稱和命令邏輯。
如下所示:
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")
*
* 還需要在對應的主程序中調(diào)用
*/
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++) {
// // 計算中文、字符的長度 設(shè)定列寬
// 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”)

其次,還需要再調(diào)用jxls做填充渲染之前,補充命令和邏輯的調(diào)用。
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();
// 數(shù)據(jù)集合
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);
}
}執(zhí)行后的效果如下所示:

關(guān)于自動換行
jxls沒有對應的自動換行操作,但是jxls可以在模板中定義對應的單元格樣式。只需要在模板中對需要做自動換行的列增加如下配置。

再次執(zhí)行上述的代碼邏輯,查看顯示效果。

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot自定義消息轉(zhuǎn)換器的實現(xiàn)與應用
Spring Boot 默認提供了多種消息轉(zhuǎn)換器,如 Jackson 用于 JSON 格式轉(zhuǎn)換、JAXB 用于 XML 格式轉(zhuǎn)換等,然而,實際開發(fā)中往往需要根據(jù)業(yè)務需求進行自定義的消息轉(zhuǎn)換器,文將詳細介紹如何在 Spring Boot 中實現(xiàn)自定義消息轉(zhuǎn)換器,探討其工作原理、配置方式以及實際應用場景2025-01-01
Java設(shè)計模式之迭代模式(Iterator模式)介紹
這篇文章主要介紹了Java設(shè)計模式之迭代模式(Iterator模式)介紹,本文用一個老師點名的現(xiàn)象描述了迭代模式的使用,需要的朋友可以參考下2015-03-03
springboot+vue實現(xiàn)登錄功能的最新方法整理
最近做項目時使用到了springboot+vue實現(xiàn)登錄功能的技術(shù),所以下面這篇文章主要給大家介紹了關(guān)于springboot+vue實現(xiàn)登錄功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06
SpringSecurity?鑒權(quán)與授權(quán)的具體使用
本文介紹了Spring?Security在前后端分離架構(gòu)中的核心應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-07-07

