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*/@Overridepublic String getName() {return "autoRowHeight";}/*** 列高邏輯* @param cellRef* @param context* @return*/@Overridepublic 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可以在模板中定義對應的單元格樣式。只需要在模板中對需要做自動換行的列增加如下配置。
在這里插入圖片描述
再次執行上述的代碼邏輯,查看顯示效果。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711199.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711199.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity AssetBundle詳解,加載本地包、加載網絡包代碼全分享

在Unity中,AssetBundle(簡稱AB包)是一種將多個文件或資源打包到一個文件中的方式,用于優化資源的加載和管理。使用AB包,可以按需加載資源,減少應用的初始加載時間,并可以實現熱更新等功能。下面是一個基本的流程,展示如何在Unity中加載AB包并顯示其中的資源。 步驟1:…

springboot 實現本地文件存儲

springboot 實現本地文件存儲 實現過程 上傳文件保存文件&#xff08;本地磁盤&#xff09;返回文件HTTP訪問服務器路徑給前端&#xff0c;進行效果展示 存儲 服務端接收上傳的目的是提供文件的訪問服務&#xff0c;對于SpringBoot而言&#xff0c;其對靜態資源訪問提供了很…

H3C防火墻安全授權導入

一、防火墻授權概述 前面我們已經了解了一些防火墻的基本概念&#xff0c;有講過防火墻除了一些基本功能&#xff0c;還有一些高級安全防護&#xff0c;但是這些功能需要另外獨立授權&#xff0c;不影響基本使用。這里以H3C防火墻為例進行大概了解下。 正常情況下&#xff0c;防…

深度學習_15_過擬合欠擬合

過擬合和欠擬合 過擬合和欠擬合是訓練模型中常會發生的事&#xff0c;如所要識別手勢過于復雜&#xff0c;如五角星手勢&#xff0c;那就需要更改高級更復雜的模型去訓練&#xff0c;若用比較簡單模型去訓練&#xff0c;就會導致模型未能抓住手勢的全部特征&#xff0c;那簡單…

[云原生] K8s之pod進階

一、pod的狀態說明 &#xff08;1&#xff09;Pod 一直處于Pending狀態 Pending狀態意味著Pod的YAML文件已經提交給Kubernetes&#xff0c;API對象已經被創建并保存在Etcd當中。但是&#xff0c;這個Pod里有些容器因為某種原因而不能被順利創建。比如&#xff0c;調度不成功(…

原神搶碼,米游社搶碼-首發

本文章僅供學習使用-侵權請聯系刪除_2023年3月14日08:17:06 本來在深淵12層打不過的我偶然在刷到了一個dy的直播間&#xff0c;看到主播在搶碼上號幫忙打深淵還號稱痛苦號打不滿不送原石的旗號我就決定掃碼試試&#xff0c;在直播間內使用了兩部手機互相掃碼在掃了一下午的碼后…

自動駕駛技術詳解

&#x1f3ac;個人簡介&#xff1a;一個全棧工程師的升級之路&#xff01; &#x1f4cb;個人專欄&#xff1a;自動駕駛技術 &#x1f380;CSDN主頁 發狂的小花 &#x1f304;人生秘訣&#xff1a;學習的本質就是極致重復! 目錄 一 自動駕駛視覺感知算法 1目標檢測 1.1 兩階…

代碼隨想錄算法訓練營第四五天 | dp[j] = min(dp[j], dp[j - coins[i]] + 1)

目錄 爬樓梯 &#xff08;進階&#xff09;零錢兌換完全平方數總結 LeetCode 70. 爬樓梯 &#xff08;進階&#xff09; LeetCode 322. 零錢兌換 LeetCode 279.完全平方數 爬樓梯 &#xff08;進階&#xff09; 好做 import java.util.*;public class Main{// dp[i] 爬到有…

css背景圖片屬性

基礎代碼&#xff1a; div {width: 200px;height: 200px;background: url(./css-logo.png); }<div></div> 1、background-repeat&#xff1a;默認是repeat 設置背景圖片在容器內是否平鋪。 background-repeat: repeat-y; background-repeat: repeat-x; background…

消息中間件之RocketMQ源碼分析(二十四)

事務消息 事務消息機制。 事務消息的發送和處理總結為四個過程: 1.生產者發送事務消息和執行本地事務 2.Broker存儲事務消息 3.Broker回查事務消息 4.Broker提交或回滾事務消息 生產者發送事務消息和執行本地事務。 發送過程分為兩個階段: 第一階段,發送事務消息 第二階段,發…

Spring Expression Language (SpEL)

Spring 表達語言&#xff08;SpEL&#xff09;&#xff0c;支持在運行時查詢和操作對象圖&#xff0c;可以用于數據綁定、屬性訪問、方法調用等。使用SpEL可以簡化代碼并提高應用程序的可維護性。 1 概覽 SpelExpressionParser是SpEL的一個核心組件&#xff0c;負責解析和編譯…

CentOS安裝編譯Python3.11.6

CentOs自帶python2版本太低&#xff0c;項目需要python3&#xff0c;于是自己安裝python 操作指南&#xff1a; 重新下載源代碼&#xff1a; # 刪除舊的 Python 源代碼文件&#xff08;如果有&#xff09; rm -rf Python-3.11.6.tar.xz # 下載 Python 3.11.6 的源代碼文件 wget…

Java泛型簡介

Java泛型簡介 Java泛型是在Java 5中引入的一個特性&#xff0c;它允許程序員在編譯時指定類、接口或方法能夠接受的類型。泛型的主要目的是提供編譯時類型安全檢查&#xff0c;避免在運行時因為類型轉換錯誤而導致的ClassCastException。 在沒有泛型之前&#xff0c;Java中的集…

如何利用動態靜態代理IP實現跨地域網絡營銷與市場研究

動態代理IP和靜態代理IP都可以在跨地域網絡營銷與市場研究中發揮關鍵作用&#xff0c;具體實現方式如下&#xff1a; ### 動態代理IP的應用&#xff1a; 1. 跨地域營銷活動測試&#xff1a; - 在進行網絡營銷時&#xff0c;尤其是要驗證廣告投放、SEO效果或A/B測試不同地區用戶…

Ubuntu系統使用Docker搭建Jupyter Notebook并實現無公網ip遠程連接

文章目錄 1. 選擇與拉取鏡像2. 創建容器3. 訪問Jupyter工作臺4. 遠程訪問Jupyter工作臺4.1 內網穿透工具安裝4.2 創建遠程連接公網地址4.3 使用固定二級子域名地址遠程訪問 本文主要介紹如何在Ubuntu系統中使用Docker本地部署Jupyter Notebook&#xff0c;并結合cpolar內網穿透…

C語言系列(所需基礎:大學C語言及格)-4-轉義字符/注釋/選擇語句

文章目錄 一、轉義字符二、注釋三、選擇語句 一、轉義字符 加上\會講原來的字符改變意思&#xff0c;即進行轉義 例如\t會使t變成\t用于表示轉義字符&#xff0c;使得t轉義成水平制表符 其他轉義字符&#xff1a; 三字母詞&#xff08;展示\&#xff1f;的用處&#xff09;…

C#面:接口是一種引用類型,不可以聲明公有的域或私有的成員變量,但是可以聲明什么呢?

可以聲明&#xff1a;方法&#xff0c;屬性&#xff0c;索引器&#xff0c;事件。 接口的主要作用是定義一套規范&#xff0c;使得不同的類可以按照相同的規范進行交互。通過實現接口&#xff0c;類可以具備多態性&#xff0c;即可以以接口類型來引用對象&#xff0c;并調用接…

k8s-001-Centos7內核升級

1. 查看內核 [rootlocalhost ~]# uname -a 2. 執行的命令(安裝最新版內核): 下載: rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 安裝: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm &#xff08; 查看最新版內核&…

杭州默安-安全技術實習生-一面

1.自我介紹 略 2.專業主修的課程 略 3.xss漏洞的類型&#xff0c;原理及防御 原理&#xff0c;服務器對用戶的輸入過濾不嚴格&#xff0c;將用戶的輸入當作Javascript代碼執行并返回給客戶端。 防御&#xff0c;輸入和url參數過濾&#xff0c;HTML實體編碼轉義特殊字符。…

力扣hot100題解(python版33-35題)

33、排序鏈表 給你鏈表的頭結點 head &#xff0c;請將其按 升序 排列并返回 排序后的鏈表 。 示例 1&#xff1a; 輸入&#xff1a;head [4,2,1,3] 輸出&#xff1a;[1,2,3,4]示例 2&#xff1a; 輸入&#xff1a;head [-1,5,3,4,0] 輸出&#xff1a;[-1,0,3,4,5]示例 3&a…