Java套紅:指定位置合并文檔-NiceXWPFDocument

需求:做個公文系統,需要將正文文檔在某個節點點擊套紅按鈕,實現文檔套紅
試了很多方法,大多數網上能查到但是實際代碼不能找到關鍵方法,可能是跟包的版本有關系,下面記錄能用的這個。

一:添加依賴

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.1</version><exclusions><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc</artifactId><version>12.6.2</version></dependency>

二、文檔

模板:{{date}}是可以獲取到的變量
在這里插入圖片描述
文檔:
在這里插入圖片描述

三、代碼

public static void word2RedDocument(String content, Map<String, Object> data, String destDocx) throws Exception {//模板文件地址String model = "D:\\套紅模板.docx";//模板文件 參數填寫XWPFTemplate template = XWPFTemplate.compile(model).render(data);//獲取模板文件  公文NiceXWPFDocument main = template.getXWPFDocument();//正文文檔NiceXWPFDocument sub = new NiceXWPFDocument(new FileInputStream(content));List<XWPFParagraph> paragraphs = main.getParagraphs();NiceXWPFDocument newDoc = new NiceXWPFDocument();for (XWPFParagraph p:paragraphs) {if( null != p && p.getText().contains("正文")){//這里是要去掉正文兩個字,自己debug看了索引,為了保險起見應該遍歷run判斷p.removeRun(0);XWPFRun run = p.createRun();// 合并兩個文檔到指定位置newDoc = main.merge(Arrays.asList(sub),run);break;}}// 設置頁碼--開始--沒有需求可以刪掉XWPFFooter footer = newDoc.createFooter(HeaderFooterType.DEFAULT);//創建一個新的XWPFFooter對象XWPFParagraph paragraph = footer.createParagraph();//創建新的XWPFParagraph對象paragraph.setAlignment(ParagraphAlignment.CENTER);//設置樣式居中//設置段落對象XWPFRun runPre = paragraph.createRun();//新的段落對象runPre.setText("- ");XWPFRun run = paragraph.createRun();//新的段落對象CTFldChar fldChar = run.getCTR().addNewFldChar();//新的CTFldChar對象fldChar.setFldCharType(STFldCharType.Enum.forString("begin"));CTText ctText = run.getCTR().addNewInstrText();ctText.setStringValue("PAGE  \\* MERGEFORMAT");ctText.setSpace(SpaceAttribute.Space.Enum.forString("preserve"));fldChar = run.getCTR().addNewFldChar();fldChar.setFldCharType(STFldCharType.Enum.forString("end"));//設置段落對象XWPFRun runSuf = paragraph.createRun();//新的段落對象runSuf.setText(" -");// 將頁腳添加到所有的頁面XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(newDoc);headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, new XWPFParagraph[]{paragraph});
// 設置頁碼--結束--沒有需求可以刪掉//可以是生成新文檔,也可以生成到原來的正文content = "D:\\新文檔.docx";// 生成新文檔FileOutputStream out = new FileOutputStream(content);newDoc.write(out);newDoc.close();out.close();//doc轉pdfdoc2Pdf(content);
//        ByteArrayOutputStream os = new ByteArrayOutputStream();
//        newDoc.write(os);
//        InputStream is = new ByteArrayInputStream(os.toByteArray());
//        os.close();}

調用方法測試

 public static void main(String[] args) throws Exception {String sourceFile = "D:\\模板.docx";String targetFile = "D:\\測試.docx";Map<String, Object> data = new HashMap<>(2);List<String> list = Arrays.asList("技術", "測試", "評選結果", "測試", "評選結果", "測試", "評選結果");StringBuilder builder = new StringBuilder();for (int i =0;i<list.size();i++) {builder.append(list.get(i));if (i != list.size() -1){builder.append("  ");}}data.put("num", "931");data.put("year", "2024");data.put("name", "銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心銷售中心");data.put("keyword",builder );
//        data.put("keyword", Arrays.asList("技術","測試","評選結果","測試","評選結果","測試","評選結果"));
//        data.put("keyword", Arrays.asList("技術","測試"));data.put("user", "李斯");
//        data.put("company", "股份有限公司技術股份有限公司");data.put("date", getChineseDate());word2RedDocument(targetFile,data,"新文檔.docx");}

轉換時間的方法,寫稀碎,拋磚引玉吧

public static String getChineseDate() {Calendar cal = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA);String date = sdf.format(cal.getTime());// 將數字轉換為漢字String[] chineseNumbers = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"};StringBuilder chineseDate = new StringBuilder();for (int i = 0; i < date.length(); i++) {if(i==4 || i==7 || i==10){chineseDate.append(date.charAt(i));} else {int number = Character.getNumericValue(date.charAt(i));if(i==5 || i==8 ){if(number==0){continue;}else if(number==1){chineseDate.append("十");continue;}else {chineseDate.append(chineseNumbers[number]);chineseDate.append("十");continue;}}if(i==6 || i==9 ){if(number==0){continue;}}chineseDate.append(chineseNumbers[number]);}}return chineseDate.toString();}

執行方法:
在這里插入圖片描述
合并后文檔如下:
在這里插入圖片描述

XWPFDocument類相關:

在這里插入圖片描述

四、換行:addBreak/addCarriageReturn

場景:如下圖。想要一個倒三角樣式的標題,且會議紀要四個字不能拆開
在這里插入圖片描述
分析需求:
1.模板設置居中
2.會議紀要跟前邊內容分成兩個變量字段
3.行數多于1行就把類型字段換行
這里有個問題,沒有找到能判斷出行數的方法,嘗試了很多,基本上都是根據"\n"判斷,但是打斷點會發現Paragraph.getText()的結果沒有換行符,這里先采用了一個不算辦法的辦法,根據長度判斷,假設這樣的標題格式一行10個左右。
現在判斷條件有了,那么實現3就是添加換行

XWPFParagraph xwpfParagraph = newDoc.getParagraphs().get(0);//判斷長度大于10(分行,至少兩行)添加換行,解決無法判斷幾行且類型內容不切分的問題if (xwpfParagraph.getText().length()>10){XWPFRun existingRun = xwpfParagraph.getRuns().get(0);
//          XWPFParagraph paragraph1 = newDoc.insertNewParagraph(existingRun.getCTR().newCursor());--這個是null很不理解,這段純屬沒用//------  方法一   --------existingRun.addBreak();//------  方法二   --------existingRun .addCarriageReturn();}

模板:
在這里插入圖片描述
效果:
在這里插入圖片描述

五:設置頁面間距

還是為了四的效果,leader說想想辦法要一個在套紅時能設置一行幾個字的功能還不能影響模板設置的字號
查來查去,勉強能通過設置頁面間距實現(如果這樣,為啥不打印或者轉pdf之類的時候自己頁面設置呢還直觀還能隨心所欲的調整)
添加依賴:

  <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-full</artifactId><version>5.0.0</version></dependency>

這個真的給我找哭了,因為CTPageMar報找不到
代碼:

       CTSectPr sectPr = newDoc.getDocument().getBody().addNewSectPr();CTPageMar pageMar = sectPr.addNewPgMar();pageMar.setLeft(BigInteger.valueOf(127L));pageMar.setTop(BigInteger.valueOf(127L));pageMar.setRight(BigInteger.valueOf(127L));pageMar.setBottom(BigInteger.valueOf(127L));

通過設置不同值得頁面效果:(pdf能看出來,word受wps工具設置有影響只會根據你當前wps的設置值展示–看不出來區別)
127的:
在這里插入圖片描述

		pageMar.setLeft(BigInteger.valueOf(318L));pageMar.setTop(BigInteger.valueOf(254L));pageMar.setRight(BigInteger.valueOf(318L));pageMar.setBottom(BigInteger.valueOf(254L));

在這里插入圖片描述
不設置的:
在這里插入圖片描述

六、鏈接

代碼:

		XWPFParagraphWrapper wrapper = new XWPFParagraphWrapper(xwpfParagraph);XWPFRun hyperRun = wrapper.insertNewHyperLinkRun(0, "https://www.baidu.com/");hyperRun.setText("百度");

效果:
在這里插入圖片描述

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

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

相關文章

redis-cli 連接Redis

Redis-cli介紹 redis-cli 是原生 Redis 自帶的命令行工具&#xff0c;您可以在云主機或本地設備上通過 redis-cli 連接 Redis 數據庫&#xff0c;進行數據管理。 redis-cli 客戶端的使用方法&#xff0c;請參考官方文檔。 連接命令 redis-cli -h <redis_instance_address…

一個極簡的 Vue 示例

https://andi.cn/page/621516.html

【qt】客戶端連接到服務器

獲取到IP地址和端口號. 通過connectToHost() 來進行連接. 對于客戶端來講,只需要socket即可. 客戶端連接服務端只需要使用套接字(Socket)來進行通信。客戶端通過創建一個套接字來連接服務端&#xff0c;然后可以通過套接字發送和接收數據。套接字提供了一種簡單而靈活的方式來…

接口安全配置

問題點&#xff1a; 有員工在工位在某個接口下鏈接一個集線器&#xff0c;從而擴展上網接口&#xff0c;這種行為在某些公司是被禁止的&#xff0c;那么網絡管理員如何控制呢&#xff1f;可以配置接口安全來限制鏈接的數量&#xff0c;切被加入安全的mac地址不會老化&#xff…

JS實現:統計字符出現頻率/計算文字在文本中的出現次數

要實現這個功能&#xff0c;JavaScript 一個非常強大的方法&#xff0c;那就是reduce() reduce() 它用于將數組的所有元素減少到一個單一的值。這個值可以是任何類型&#xff0c;包括但不限于數字、字符串、對象或數組。 reduce() 方法接收一個回調函數作為參數&#xff0c;這個…

win10 docker-compose搭建ELK日志收集

elk的威名大家都知道&#xff0c;以前前司有專門的人維護&#xff0c;現在換了環境&#xff0c;實在不想上服務器看&#xff0c;所以就摸索下自己搭建&#xff0c;由于現場服務器是需要類似向日葵那樣連接&#xff0c;我還是把日志弄回來&#xff0c;自己本地filebeat上傳到es中…

ESP32和ESP8266的WIFI的136個問題與答案

ESP32和ESP8266的WIFI的136個問題與答案 ESP32和ESP8266 WIFI相關問題與答案&#xff0c;具有一定的參考價值。ESP32-S3模塊 1. ESP32 和 ESP8266 是否支持中文 SSID&#xff1f; ESP32 和 ESP8266 均支持中文 SSID&#xff0c;但需要使用相應的庫和設置。需要注意的是&#…

自定義函數---隨機數系列函數

大家有沒有發現平常在寫隨機數的時候&#xff0c;需要引入很多的頭文件&#xff0c;然后還需要用一些復雜的函數&#xff0c;大家可能不太習慣&#xff0c;于是我就制作了一個頭文件 // random_number.h #ifndef RANDOM_NUMBER_H // 預處理指令&#xff0c;防止頭文件被重復包含…

六款領先的電腦監控軟件系統(哪些電腦軟件可以監控電腦)

在當今信息時代&#xff0c;企業對數據安全和員工生產力的關注度越來越高。電腦監控軟件系統成為企業管理的重要工具&#xff0c;幫助企業確保信息安全、提高工作效率。本文將介紹幾款領先的電腦監控軟件系統&#xff0c;以便企業選擇最適合的解決方案。固信電腦監控軟件 可免費…

如何在SQLServer中更改端口

在SQL Server中更改端口通常涉及SQL Server配置管理器的使用&#xff0c;以下是一個詳細的步驟指南&#xff1a; 一、打開SQL Server配置管理器 通過開始菜單&#xff1a;點擊“開始”菜單&#xff0c;搜索“SQL Server配置管理器”并打開它。通過運行窗口&#xff1a;按Win …

log4j2的日志框架(詳細,springboot和異步日志的實現)

目錄 log4j2的介紹 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的進階--異步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介紹 Apache Log4j 2是對Log4j的升級版&#xff0c;參考了logback的一些優秀的設計&#xff0c;并且修復了一些問題&#xff0c;因此帶 來…

Go-知識測試-測試參數

Go-知識測試-測試參數 1. -args2. -json3. -o4. -bench5. -benchtime6. -cpu7. -count8. -failfast9. -list10. -parallel11. -run12. -timeout13. -v14 -benchmem 1. -args 指示go test 把-args 后面的參數帶到測試中去。具體的測試函數會根據此參數來控制測試流程。 -args后…

主機安全-進程、命令攻擊與檢測

目錄 概述反彈shell原理nc/dev/xxx反彈shell下載不落地反彈Shell各種語言反彈shell linux提權sudosuid提權mysql提權 Dnslog參考 概述 本文更新通過在主機&#xff08;不含容器&#xff09;上直接執行命令或啟動進程來攻擊的場景。檢測方面以字節跳動的開源HIDS elkeid舉例。每…

磁感應強度檢測模塊使用教程

目錄 一、磁感應強度檢測模塊(AT 協議版本、Modbus 協議版本)1、參數2、報警引腳 二、AT版本1、接線說明2、AT 指令 三、Modbus 版本1、接線說明2、Modbus 指令格式3、Modbus 指令 一、磁感應強度檢測模塊(AT 協議版本、Modbus 協議版本) 圖1 正面 圖2 背面 AT 協議版本和 Modb…

Letter Exchange

這道題目看官方題解就好了&#xff0c;這個轉換圖論挺顯然的 證明一下為什么最后一定是 顯然練完貶值后圖只能長成這個樣子 在消掉長度為\(2\)的環后&#xff0c;如果說圖沒邊了&#xff0c; 那么顯然就不用交換了&#xff0c;否則的話我們任取一條邊 那么對于\(2\)號點來說&am…

韋東山嵌入式linux系列-驅動進化之路:總線設備驅動模型

1 驅動編寫的 3 種方法 以 LED 驅動為例 1.1 傳統寫法 使用哪個引腳&#xff0c;怎么操作引腳&#xff0c;都寫死在代碼中。 最簡單&#xff0c;不考慮擴展性&#xff0c;可以快速實現功能。 修改引腳時&#xff0c;需要重新編譯。 應用程序調用open等函數最簡單的方法是驅動…

(深度估計學習)Depth Anything V2 復現

Depth Anything V2 復現 一、配置環境二、準備數據1. 權重文件2. 訓練數據 三、Test四、Train 代碼&#xff1a;https://github.com/DepthAnything/Depth-Anything-V2 一、配置環境 在本機電腦win跑之后依舊爆顯存&#xff0c;放到服務器跑&#xff1a;Ubuntu22.04&#xff0c…

使用Zabbix進行服務監控:構建高效穩定的IT服務管理平臺

使用Zabbix進行服務監控&#xff1a;構建高效穩定的IT服務管理平臺 在當今的數字化時代&#xff0c;IT服務管理&#xff08;ITSM&#xff09;對于確保企業IT系統的穩定性和性能至關重要。服務監控是ITSM的重要組成部分&#xff0c;可以幫助企業實時了解IT系統的運行狀況&#…

微調Qwen2大語言模型加入領域知識

目錄 試用Qwen2做推理安裝LLaMA-Factory使用自有數據集微調Qwen2驗證微調效果 試用Qwen2做推理 參考&#xff1a;https://qwen.readthedocs.io/en/latest/getting_started/quickstart.html from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda…

極速構建的藝術:Kylin中Cube的并行構建實踐

極速構建的藝術&#xff1a;Kylin中Cube的并行構建實踐 引言 Apache Kylin是一款開源的分布式分析引擎&#xff0c;專為處理大規模數據集的即時查詢而設計。Kylin通過構建數據立方體&#xff08;Cube&#xff09;來優化查詢性能。隨著數據量的不斷增長&#xff0c;Cube的構建…