Apache POI詳解

目錄

?

?前言

????????Apache POI是一個強大的Java庫,廣泛用于處理Microsoft Office文檔,包括Word、Excel和PowerPoint等。本文將詳細介紹如何使用Apache POI庫操作Word模板(包括替換占位符、操作表格)、將Word文檔轉換為PDF,以及如何處理PowerPoint文檔。我們將通過代碼示例逐步演示這些操作。

1. Apache POI簡介

依賴配置

2. 操作Word模板中的占位符

示例:替換占位符

3. 操作Word模板中的表格

示例:操作表格

4. 將Word文檔轉換為PDF

示例:使用Apache PDFBox將Word轉換為PDF

5. 處理PowerPoint文檔

示例:操作PowerPoint文檔

6. 總結


?前言

????????Apache POI是一個強大的Java庫,廣泛用于處理Microsoft Office文檔,包括Word、Excel和PowerPoint等。本文將詳細介紹如何使用Apache POI庫操作Word模板(包括替換占位符、操作表格)、將Word文檔轉換為PDF,以及如何處理PowerPoint文檔。我們將通過代碼示例逐步演示這些操作。

1. Apache POI簡介

Apache POI(Poor Obfuscation Implementation)是一個開源的Java庫,主要用于處理Microsoft Office文檔。它支持多種Office文檔格式,包括:

  • Word.doc(舊版)和.docx(新版)。
  • Excel.xls(舊版)和.xlsx(新版)。
  • PowerPoint.ppt(舊版)和.pptx(新版)。

依賴配置

在使用Apache POI之前,需要在項目中添加相關的依賴。以下是Maven項目中常用的依賴配置:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version>
</dependency>
  • poi:包含POI的核心功能,支持舊版Office格式。
  • poi-ooxml:支持新版Office格式(如.docx.xlsx.pptx)。
  • poi-scratchpad:提供了一些額外的功能,如處理Outlook郵件格式。

2. 操作Word模板中的占位符

在Word模板中,我們通常使用${}作為占位符,表示需要動態替換的內容。以下代碼示例展示了如何讀取Word模板并替換占位符。

示例:替換占位符

假設我們有一個Word模板template.docx,內容如下:

尊敬的${name}:您的訂單編號為${orderId},已成功支付。

簡單代碼示例:

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class WordTemplateExample {public static void main(String[] args) throws IOException {// 打開Word模板FileInputStream file = new FileInputStream("template.docx");XWPFDocument document = new XWPFDocument(file);// 定義占位符的替換內容Map<String, String> replacements = new HashMap<>();replacements.put("${name}", "張三");replacements.put("${orderId}", "123456");// 遍歷段落并替換占位符for (XWPFParagraph paragraph : document.getParagraphs()) {String text = paragraph.getText();for (Map.Entry<String, String> entry : replacements.entrySet()) {if (text != null && text.contains(entry.getKey())) {text = text.replace(entry.getKey(), entry.getValue());paragraph.removeRun(0); // 刪除原有內容paragraph.createRun().setText(text); // 插入新內容}}}// 保存修改后的文檔FileOutputStream out = new FileOutputStream("output.docx");document.write(out);// 關閉文檔document.close();out.close();}
}

3. 操作Word模板中的表格

Word文檔中的表格是常見的結構化數據展示方式。以下代碼示例展示了如何讀取和修改Word模板中的表格。

示例:操作表格

假設我們有一個Word模板template.docx,其中包含一個表格:

| 姓名   | 年齡 | 性別 |
|--------|------|------|
| ${name}| ${age}| ${gender}|

?簡單代碼示例:

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class WordTableExample {public static void main(String[] args) throws IOException {// 打開Word模板FileInputStream file = new FileInputStream("template.docx");XWPFDocument document = new XWPFDocument(file);// 定義占位符的替換內容Map<String, String> replacements = new HashMap<>();replacements.put("${name}", "李四");replacements.put("${age}", "25");replacements.put("${gender}", "男");// 遍歷表格并替換占位符for (XWPFTable table : document.getTables()) {for (XWPFTableRow row : table.getRows()) {for (XWPFTableCell cell : row.getTableCells()) {for (XWPFParagraph paragraph : cell.getParagraphs()) {String text = paragraph.getText();for (Map.Entry<String, String> entry : replacements.entrySet()) {if (text != null && text.contains(entry.getKey())) {text = text.replace(entry.getKey(), entry.getValue());paragraph.removeRun(0); // 刪除原有內容paragraph.createRun().setText(text); // 插入新內容}}}}}}// 保存修改后的文檔FileOutputStream out = new FileOutputStream("output.docx");document.write(out);// 關閉文檔document.close();out.close();}
}

4. 將Word文檔轉換為PDF

將Word文檔轉換為PDF是一個常見的需求。我們可以使用Apache POI結合其他庫(如Apache PDFBoxiText)來實現這一功能。

示例:使用Apache PDFBox將Word轉換為PDF

首先,添加PDFBox的依賴:

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version>
</dependency>

簡單代碼示例:

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class WordToPdfExample {public static void main(String[] args) throws IOException {// 打開Word文檔FileInputStream file = new FileInputStream("output.docx");XWPFDocument document = new XWPFDocument(file);// 創建PDF文檔PDDocument pdfDocument = new PDDocument();PDPage page = new PDPage();pdfDocument.addPage(page);// 寫入PDF內容PDPageContentStream contentStream = new PDPageContentStream(pdfDocument, page);contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12);contentStream.beginText();contentStream.newLineAtOffset(100, 700);for (XWPFParagraph paragraph : document.getParagraphs()) {contentStream.showText(paragraph.getText());contentStream.newLineAtOffset(0, -15);}contentStream.endText();contentStream.close();// 保存PDF文件pdfDocument.save("output.pdf");// 關閉文檔pdfDocument.close();document.close();}
}

5. 處理PowerPoint文檔

Apache POI也支持處理PowerPoint文檔。以下代碼示例展示了如何讀取和修改PowerPoint文檔。

示例:操作PowerPoint文檔

假設我們有一個PowerPoint模板template.pptx,其中包含一個幻燈片,內容為:

標題:${title}
內容:${content}

操作PowerPoint文檔的簡單代碼示例:

import org.apache.poi.xslf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class PowerPointExample {public static void main(String[] args) throws IOException {// 打開PowerPoint模板FileInputStream file = new FileInputStream("template.pptx");XMLSlideShow ppt = new XMLSlideShow(file);// 定義占位符的替換內容Map<String, String> replacements = new HashMap<>();replacements.put("${title}", "項目報告");replacements.put("${content}", "這是項目的最新進展。");// 遍歷幻燈片并替換占位符for (XSLFSlide slide : ppt.getSlides()) {for (XSLFShape shape : slide.getShapes()) {if (shape instanceof XSLFTextShape) {XSLFTextShape textShape = (XSLFTextShape) shape;String text = textShape.getText();for (Map.Entry<String, String> entry : replacements.entrySet()) {if (text != null && text.contains(entry.getKey())) {text = text.replace(entry.getKey(), entry.getValue());textShape.clearText(); // 清除原有內容textShape.setText(text); // 插入新內容}}}}}// 保存修改后的文檔FileOutputStream out = new FileOutputStream("output.pptx");ppt.write(out);// 關閉文檔ppt.close();out.close();}
}

6. 總結

通過Apache POI庫,可以輕松地操作Word模板(包括替換占位符、操作表格)、將Word文檔轉換為PDF,以及處理PowerPoint文檔。本文提供了詳細的代碼示例,幫助您快速上手這些操作。如果您有更多需求或問題,歡迎在評論區留言討論!

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

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

相關文章

AutoGen多角色、多用戶、多智能體對話系統

2023-03-11-AutoGen 使用【autoGenchainlitdeepSeek】實現【多角色、多用戶、多智能體對話系統】 1-核心思路 01&#xff09;技術要點&#xff1a;autoGenchainlitdeepSeek02&#xff09;什么是autoGen->autogen是微軟旗下的多智能體的框架03&#xff09;什么是chainlit-&g…

問deepseek: OpenFOAM并行分區后,是如何實現ldumatrix矩陣向量乘法計算邏輯的?

在OpenFOAM中&#xff0c;lduMatrix 是用于存儲稀疏矩陣的類&#xff0c;支持并行計算。并行分區后&#xff0c;lduMatrix 的矩陣向量乘法通過以下步驟實現&#xff1a; 1. 矩陣分區 分區&#xff1a;將矩陣和向量分配到多個處理器上&#xff0c;每個處理器負責一部分。接口&…

數據類設計_圖片類設計之4_規則類圖形混合算法(前端架構)

前言 學的東西多了,要想辦法用出來.C和C是偏向底層的語言,直接與數據打交道.嘗試做一些和數據方面相關的內容 引入 接續上一篇,討論圖片類型設計出來后在場景中如何表達,以及圖片的混合算法.前面的內容屬于鋪墊和基礎,這篇內容和實際聯系起來了. 背景圖和前景圖 這里筆者想先…

【openwebui 搭建本地知識庫(RAG搭建本地知識庫)】

安裝準備 openwebui 這個本地安裝之前寫過使用python安裝。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…

Nginx的流式響應配置詳解

現在大模型場景繁多&#xff0c;項目中涉及nginx轉發大模型的流式數據時&#xff0c;需配置nginx的轉發策略&#xff1a; location /streaming {proxy_pass http://backend_server;proxy_cache off; # 關閉緩存proxy_buffering off; # 關閉代理緩沖chunked_transfer_encoding …

git使用命令總結

文章目錄 Git 復制創建提交步驟Git 全局設置:創建 git 倉庫:已有倉庫? 遇到問題解決辦法&#xff1a;問題一先git pull一下&#xff0c;具體流程為以下幾步&#xff1a; 詳細步驟 Git 復制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git創建提…

flutter 圖片資源路徑管理

1. 創建統一資源管理類 創建一個單獨的 Dart 文件&#xff08;比如 manager.dart&#xff09;&#xff0c;將所有圖片路徑集中管理。這樣在引用圖片時&#xff0c;不需要每次都手動輸入完整路徑&#xff0c;只需通過常量引用即可。 //manager.dartclass Manager { static co…

Android Retrofit 框架配置與構建模塊深入源碼分析(六)

一、引言 Retrofit 是一個在 Android 和 Java 開發中廣泛使用的類型安全的 HTTP 客戶端。它通過簡潔的 API 設計&#xff0c;使得網絡請求的處理變得高效且易于管理。配置與構建模塊作為 Retrofit 的基礎部分&#xff0c;承擔著初始化和定制 Retrofit 實例的重要任務。開發者可…

80.Dictionary 字典 C#例子

使用 C# 中的 Dictionary 數據結構 在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一個非常強大的數據結構&#xff0c;用于存儲鍵值對。它提供了高效的查找、插入和刪除操作&#xff0c;適用于需要快速訪問數據的場景。本文將通過一個簡單的示例&#xff0c;介紹如何…

tomcat負載均衡配置

這里拿Nginx和之前做的Tomcat 多實例來實現tomcat負載均衡 1.準備多實例與nginx tomcat單機多實例部署-CSDN博客 2.配置nginx做負載均衡 upstream tomcat{ server 192.168.60.11:8081; server 192.168.60.11:8082; server 192.168.60.11:8083; } ser…

C語言中scanf(“%c“,s)會出現的問題

scanf("%c%c", &word[0], &word[1]);的行為與輸入緩沖區的內容密切相關。你提到輸入ab后&#xff0c;word[0]是\n&#xff0c;這通常是因為輸入緩沖區中殘留了換行符&#xff08;\n&#xff09;。 一、原因分析 換行符殘留 若在輸入ab之前有其他輸入操作&a…

SealOS部署k8s集群(單節點)

一、 先決條件 每個集群節點應該有不同的主機名。需要在 K8s 集群的第一個 master 節點上運行 sealos run 命令。建議使用干凈的操作系統來創建集群。不要自己裝 Docker&#xff01;支持大多數 Linux發行版&#xff0c;但內核版本建議5以上。例如&#xff1a;Ubuntu、CentOS、…

Linux 服務器安全配置:密碼復雜度與登錄超時設置

Linux服務器安全配置指南:密碼復雜度與登錄超時設置 一、密碼復雜度設置 通過PAM模塊pam_cracklib.so實現密碼強度策略,配置文件: system-auth該文件主要用于定義系統范圍內的認證策略,涵蓋了用戶登錄、su 命令切換用戶、sudo 權限提升等多種認證場景。當用戶嘗試進行系…

AI Agent開發框架分析:前端視角

1. Mastra (https://mastra.ai/docs) 優點&#xff1a; 提供直觀的界面構建器&#xff0c;適合無代碼/低代碼開發支持JavaScript/TypeScript&#xff0c;可直接集成到前端項目可視化工作流設計&#xff0c;降低入門門檻內置多種UI組件&#xff0c;加速前端開發 缺點&#xf…

linux上使用unsloth微調大模型的環境踩坑之路-4070ti、4090

我們實驗室有2套環境 一套&#xff1a;4070ti。安裝了cuda12.4 一套&#xff1a;3張4090.安裝了cuda12.4 現在開始給第一套裝能運行unsloth能運行的環境 第一步&#xff1a;開始創建虛擬環境 conda create -n test_env python3.11 第二步&#xff1a;進入虛擬環境 conda activa…

網絡安全演練有哪些形式

OPENVAS使用 1、確定指定IP是否能ping通 2、創建掃描目標 3、創建掃描任務&#xff08;scan management →newtask&#xff09; 4、開始任務start 5、查看掃描細節 6、查看掃描結果&#xff0c;包含漏洞詳細信息&#xff0c;亦可到處PDF文件 7、導出掃描結果報告 8、為…

ConcurrentModificationException:檢測到并發修改完美解決方法

&#x1f6a6; ConcurrentModificationException&#xff1a;檢測到并發修改完美解決方法 &#x1f4a1; 摘要 1. 什么是ConcurrentModificationException&#xff1f;&#x1f914; 2. ConcurrentModificationException的常見場景 &#x1f6a6; 2.1 使用for-each循環遍歷集合…

電路原理(電容 集成電路NE555)

電容 1.特性&#xff1a;充放電&#xff0c;隔直流&#xff0c;通交流 2.電容是通過聚集正負電荷來存儲電能的 3.電容充放電過程可等效為導通回路 4.多電容并聯可以把容量疊加&#xff0c;但是多電容串聯就不會&#xff0c;只會疊加電容的耐壓值。 6.電容充放電時相當于通路&a…

深入解析 React 最新特性:革新、應用與最佳實踐

深入解析 React 最新特性&#xff1a;革新、應用與最佳實踐 1. 引言 React 作為前端開發的核心技術之一&#xff0c;近年來不斷推出 新的 API 和優化機制&#xff0c;從 Concurrent Rendering&#xff08;并發模式&#xff09; 到 Server Components&#xff08;服務器組件&a…

【氮化鎵】高輸入功率應力誘導的GaN 在下的退化LNA退化

2019年,中國工程物理研究院電子工程研究所的Tong等人基于實驗與第一性原理計算方法,研究了Ka波段GaN低噪聲放大器(LNA)在高輸入功率應力下的退化機制。實驗結果表明,在27 GHz下施加1 W連續波(CW)輸入功率應力后,LNA的增益下降約1 dB,噪聲系數(NF)增加約0.7 dB。進一…