替換word中的excel

@PostMapping("/make/report/target/performance/first")
public AjaxResult makeTargetReportFirst(@RequestBody MakeReportDTO makeReportDTO) {Map<String, String> textReplaceMap = new HashMap<>();// 替換日期LocalDateTime nowData = LocalDateTime.now();DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");textReplaceMap.put("${nowDate}", nowData.format(dateFormatter));String templatePath = uploadPklExcelPath + "template1.docx";String directoryPath = fileUploadDir;try {if (!Files.exists(Paths.get(directoryPath))) {Files.createDirectories(Paths.get(directoryPath));}try (InputStream is = new FileInputStream(templatePath);XWPFDocument doc = new XWPFDocument(is)) {// 替換普通文本占位符(段落和表格內文本)replaceTextPlaceholders(doc, textReplaceMap);List<List<String>> excelData = makeReportDTO.getExcelData();if (excelData == null || excelData.isEmpty()) {return AjaxResult.error("excelData不能為空");}// 替換表格內容,按列替換,且新增行replaceTableDataByColumns(doc, excelData);// 生成唯一文件名String fileName = generateUniqueFileName();String outPath = directoryPath + fileName;try (OutputStream os = new FileOutputStream(outPath)) {doc.write(os);}return AjaxResult.success(outPath);}} catch (FileNotFoundException e) {return AjaxResult.error("文件未找到:" + e.getMessage());} catch (Exception e) {e.printStackTrace();return AjaxResult.error("報告生成失敗:" + e.getMessage());}
}private void replaceTextPlaceholders(XWPFDocument doc, Map<String, String> replaceMap) {// 替換段落中的占位符doc.getParagraphs().forEach(paragraph -> {paragraph.getRuns().forEach(run -> {String text = run.getText(0);if (text != null) {for (Map.Entry<String, String> entry : replaceMap.entrySet()) {if (text.contains(entry.getKey())) {run.setText(text.replace(entry.getKey(), entry.getValue()), 0);}}}});});// 替換表格中的占位符doc.getTables().forEach(table -> {table.getRows().forEach(row -> {row.getTableCells().forEach(cell -> {cell.getParagraphs().forEach(paragraph -> {paragraph.getRuns().forEach(run -> {String text = run.getText(0);if (text != null) {for (Map.Entry<String, String> entry : replaceMap.entrySet()) {if (text.contains(entry.getKey())) {run.setText(text.replace(entry.getKey(), entry.getValue()), 0);}}}});});});});});}private void replaceTableDataByColumns(XWPFDocument doc, List<List<String>> excelData) {if (doc.getTables().isEmpty()) {throw new IllegalArgumentException("模板中沒有表格");}XWPFTable table = doc.getTables().get(0);// 求最大行數int maxRowCount = excelData.stream().mapToInt(List::size).max().orElse(0);int templateRowCount = table.getNumberOfRows();// 不夠行就新增for (int i = templateRowCount; i < maxRowCount; i++) {table.createRow();}for (int col = 0; col < excelData.size(); col++) {List<String> colData = excelData.get(col);for (int row = 0; row < maxRowCount; row++) {XWPFTableRow tableRow = table.getRow(row);// 設置固定高度為 5mm(約 284 Twips)tableRow.setHeight(284);tableRow.setHeightRule(TableRowHeightRule.EXACT);// 確保當前行有對應列單元格while (tableRow.getTableCells().size() <= col) {tableRow.createCell();}XWPFTableCell cell = tableRow.getCell(col);// 清空舊內容cell.removeParagraph(0);// 寫入新文本并設置字體樣式為小四宋體(12pt)XWPFParagraph paragraph = cell.addParagraph();XWPFRun run = paragraph.createRun();String text = row < colData.size() ? colData.get(row) : "";run.setText(text);run.setFontFamily("宋體");run.setFontSize(10); // 小四:12pt}}}private String generateUniqueFileName() {long timestamp = System.currentTimeMillis();int randomNum = new Random().nextInt(10000);return timestamp + "_" + randomNum + ".docx";}

在這里插入圖片描述
在這里插入圖片描述

{"excelData": [["水用量","水泥用量","水泥-種類","水泥-細度","水泥-28天抗壓強度","礦粉用量","礦粉-細度","礦粉-28天活性指數","粉煤灰用量","粉煤灰-細度","粉煤灰-28天活性指數","砂用量","砂-細度","砂-石粉含量","石用量","石-含泥量","石-壓碎指標值","減水劑用量","減水劑-含固量","減水劑-水泥凈漿流動度","增效劑用量","坍落度","3天抗壓強度","7天抗壓強度","28天抗壓強度"],["150","145","0","1.6","57.7","50","3.9","106","90","32.4","73","895","2.84","9.40","1010","0.92","0","10","11.5","190","1.43","205","22.5","31.8","47.6"]]
}

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

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

相關文章

深入探索百度智能云千帆AppBuilder:從零開始構建AI應用

在數字化轉型的浪潮中&#xff0c;企業對高效、智能的應用開發平臺的需求日益增長。百度智能云千帆AppBuilder&#xff08;以下簡稱AppBuilder&#xff09;憑借其強大的功能和靈活的開發方式&#xff0c;成為企業級大模型應用開發的理想選擇。本文將詳細介紹如何使用AppBuilder…

測試工程師要如何開展單元測試

單元測試是軟件開發過程中至關重要的環節&#xff0c;它通過驗證代碼的最小可測試單元(如函數、方法或類)是否按預期工作&#xff0c;幫助開發團隊在早期發現和修復缺陷&#xff0c;提升代碼質量和可維護性。以下是測試工程師開展單元測試的詳細步驟和方法&#xff1a; 一、理…

NODE-I916 I721模塊化電腦發布,AI算力與超低功耗的完美平衡

在智能工業與邊緣計算蓬勃發展的今天&#xff0c;企業對計算設備的性能與能效需求日益嚴苛。全新推出NODE-I916與NODE-I721模塊化電腦&#xff0c;分別搭載英特爾 酷睿? Ultra 平臺與Alder Lake-N平臺&#xff0c;以差異化CPU配置為核心&#xff0c;為AI推理、工業自動化及嵌入…

采集需要登錄網站的教程

有些網站需要用戶登錄才能顯示相關信息&#xff0c;如果要采集這類網站&#xff0c;有以下幾個方法&#xff1a; 1. 寫發布模塊來抓包獲取post的數據&#xff1b; 2. 有些采集器內置瀏覽器獲取這些信息&#xff0c;但是經常獲取的不準確&#xff0c;可靠性太低&#xff1b; 3. …

六足連桿爬行機器人的simulink建模與仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序 4.系統原理簡介 5.完整工程文件 1.課題概述 六足連桿爬行機器人的simulink建模與仿真。通過simulink&#xff0c;對六足機器人的六足以及機身進行simulink建模&#xff0c;模擬其行走&#xff0c;仿真輸出機器人行走時六足的坐…

什么是物聯網 (IoT):2024 年物聯網概述

物聯網&#xff08;IoT&#xff09;是一個有望徹底改變我們生活、工作以及與環境互動方式的概念。如今&#xff0c;越來越多的新興企業和老牌企業都在利用物聯網的力量創造創新產品與服務。正因為這一轉變&#xff0c;互聯互通已成為我們生活中不可或缺的一部分&#xff0c;科技…

MVC入門(5)-- HttpMessageConverter 消息轉換器

概念 HttpMessageConverter 是 Spring 框架中用于處理 HTTP 請求和響應數據的核心接口&#xff0c;負責在 Java 對象與 HTTP 消息體&#xff08;請求體或響應體&#xff09;之間進行雙向轉換。簡單來說&#xff0c;它是 Spring 用來將 HTTP 請求中的原始數據&#xff08;如 JS…

Spark,連接MySQL數據庫,添加數據,讀取數據

以下是使用Spark連接MySQL數據庫、添加數據和讀取數據的步驟&#xff08;基于Scala API&#xff09;&#xff1a; 1. 準備工作 - 添加MySQL驅動依賴 在Spark項目中引入MySQL Connector JAR包&#xff08;如 mysql-connector-java-8.0.33.jar &#xff09;&#xff0c;或通過Sp…

關于 APK 反編譯與重構工具集

一、apktool — APK 解包 / 重打包 apktool 是一款開源的 Android APK 工具&#xff0c;用于&#xff1a; 反編譯 APK 查看資源和布局文件 生成 smali 文件&#xff08;DEX 的反匯編&#xff09; 對 APK 進行修改后重新打包 它不能還原 Java 源碼&#xff0c;只能將 D…

[解決方案] Word轉PDF

背景&#xff1a; 之前做過一些pdf導出&#xff0c; 客戶提了一個特別急的需求&#xff0c; 要求根據一個模版跟一個csv的數據源&#xff0c; 批量生成PDF&#xff0c; 因為之前用過FOP&#xff0c; 知道調整樣式需要特別長的時間&#xff0c; 這個需求又特別急&#xff0c; 所…

01 基本介紹及Pod基礎

01 查看各種資源 01-1 查看K8s集群的內置資源 [rootmaster01 ~]# kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 …

19 C 語言位運算、賦值、條件、逗號運算符詳解:涵蓋運算符優先級與復雜表達式計算過程分析

1 位運算符 位運算符是對整數的二進制表示&#xff08;補碼形式&#xff09;進行逐位操作的運算符。以下是主要的位運算符及其功能描述&#xff1a; 運算符描述操作數個數副作用&按位與2無|按位或2無^按位異或2無~按位取反1無<<按位左移2無>>按位右移2無 1.1…

哈希查找方法

已知哈希表長度為11&#xff0c;哈希函數為H&#xff08;key&#xff09;&#xff1d;key&#xff05;11&#xff0c;隨機產生待散列的小于50的8個元素&#xff0c;同時采用線性探測再散列的方法處理沖突。任意輸入要查找的數據&#xff0c;無論是否找到均給出提示信息。 int f…

JavaScript性能優化實戰(10):前端框架性能優化深度解析

引言 React、Vue、Angular等框架雖然提供了強大的抽象和開發效率,但不恰當的使用方式會導致嚴重的性能問題,針對這些問題,本文將深入探討前端框架性能優化的核心技術和最佳實踐。 React性能優化核心技術 React通過虛擬DOM和高效的渲染機制提供了出色的性能,但當應用規模…

類和對象------2

目錄 一. C面向對象模型初探1 .成員變量和函數的存儲 二 this指針1 &#xff09;this指針工作原理2 &#xff09;this指針的使用3&#xff09; const修飾成員函數4 &#xff09;const修飾對象(常對象) 3.友元1 )友元語法2) 課堂練習 4 強化訓練(數組類封裝) 四 運算符重載&…

量子計算在金融科技中的應用前景

隨著量子計算技術的飛速發展&#xff0c;其在各行業的應用潛力逐漸顯現&#xff0c;金融科技領域更是備受關注。量子計算的強大計算能力有望為金融行業帶來前所未有的變革&#xff0c;從風險評估到投資組合優化&#xff0c;從高頻交易到加密技術&#xff0c;量子計算都可能成為…

Redisson 四大核心機制實現原理詳解

一、可重入鎖&#xff08;Reentrant Lock&#xff09; 可重入鎖是什么&#xff1f; 通俗定義 可重入鎖類似于一把“智能鎖”&#xff0c;它能識別當前的鎖持有者是否是當前線程&#xff1a; 如果是&#xff0c;則允許線程重復獲取鎖&#xff08;重入&#xff09;&#xff0c;并…

srs-7.0 支持obs推webrtc流

demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 實現原理就是通過WHIP協議來傳輸 SDP信息 1、運行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打開web:ht

面試題——JDBC|Maven|Spring的IOC思想|DI思想|SpringMVC

目錄 一、JDBC 1、jdbc連接數據庫的基本步驟&#xff08;掌握**&#xff09; 2、Statement和PreparedStatement的區別 &#xff08;掌握***&#xff09; 二、Maven 1、maven的作用 2、maven 如何排除依賴 3、maven scope作用域有哪些&#xff1f; 三、Spring的IOC思想 …

從代碼學習數學優化算法 - 拉格朗日松弛 Python版

文章目錄 前言1. 問題定義 (Problem Definition)2. 拉格朗日松弛 (Lagrangian Relaxation)3. 拉格朗日對偶問題 (Lagrangian Dual)4. 次梯度優化 (Subgradient Optimization)5. Python 代碼實現導入庫和問題定義輔助函數:求解拉格朗日松弛子問題次梯度優化主循環結果展示與繪圖…