最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從入門到實(shí)戰(zhàn)詳解如何使用Apache?POI操作Word文檔

 更新時(shí)間:2025年06月12日 09:35:41   作者:pengles  
Apache?POI是Java生態(tài)中最流行的Microsoft?Office文檔操作庫之一,它為Word文檔提供了全面的API支持,下面我們來看看如何使用Apache?POI進(jìn)行word文檔的操作吧

Apache POI是Java生態(tài)中最流行的Microsoft Office文檔操作庫之一,它為Word文檔(包括傳統(tǒng)的.doc格式和現(xiàn)代的.docx格式)提供了全面的API支持。本文將詳細(xì)介紹如何使用Apache POI創(chuàng)建、讀取和修改Word文檔。

一、Apache POI簡介與環(huán)境準(zhǔn)備

1. Apache POI組件

Apache POI包含多個(gè)組件用于處理不同Office文檔:

  • POI-HWPF:處理.doc格式(Word 97-2003)
  • POI-XWPF:處理.docx格式(Word 2007及以后版本)
  • POI-HSLF:處理PowerPoint
  • POI-HSSF/XSSF:處理Excel

2. 添加Maven依賴

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

3. 核心類介紹

XWPFDocument:代表整個(gè)Word文檔

XWPFParagraph:文檔中的段落

XWPFRun:段落中的文本運(yùn)行(具有相同格式的文本段)

XWPFTable:表格

XWPFPicture:圖片

二、創(chuàng)建Word文檔

1. 創(chuàng)建簡單文檔

import org.apache.poi.xwpf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class SimpleDocumentCreator {
    public static void main(String[] args) throws IOException {
        // 1. 創(chuàng)建空文檔
        XWPFDocument document = new XWPFDocument();
        
        // 2. 創(chuàng)建段落
        XWPFParagraph title = document.createParagraph();
        title.setAlignment(ParagraphAlignment.CENTER);
        
        // 3. 創(chuàng)建文本運(yùn)行并設(shè)置樣式
        XWPFRun titleRun = title.createRun();
        titleRun.setText("Apache POI示例文檔");
        titleRun.setBold(true);
        titleRun.setFontSize(16);
        
        // 4. 添加正文段落
        XWPFParagraph body = document.createParagraph();
        body.setAlignment(ParagraphAlignment.LEFT);
        body.setIndentationFirstLine(600); // 首行縮進(jìn)
        
        XWPFRun bodyRun = body.createRun();
        bodyRun.setText("這是使用Apache POI創(chuàng)建的Word文檔。");
        bodyRun.addBreak(); // 換行
        bodyRun.setText("POI支持豐富的文本格式設(shè)置。");
        
        // 5. 保存文檔
        try (FileOutputStream out = new FileOutputStream("SimpleDocument.docx")) {
            document.write(out);
        }
        
        document.close();
        System.out.println("文檔創(chuàng)建成功!");
    }
}

2. 添加復(fù)雜格式

// 創(chuàng)建帶格式的段落
XWPFParagraph styledPara = document.createParagraph();
styledPara.setAlignment(ParagraphAlignment.BOTH); // 兩端對齊

XWPFRun styledRun = styledPara.createRun();
styledRun.setText("格式豐富的文本:");
styledRun.setColor("FF0000"); // 紅色
styledRun.setFontFamily("宋體");
styledRun.addBreak();

// 添加不同格式的文本
styledRun = styledPara.createRun();
styledRun.setText("粗體+斜體");
styledRun.setBold(true);
styledRun.setItalic(true);
styledRun.addTab(); // 制表符

styledRun = styledPara.createRun();
styledRun.setText("下劃線");
styledRun.setUnderline(UnderlinePatterns.SINGLE);

三、操作表格

1. 創(chuàng)建表格

// 創(chuàng)建3行4列的表格
XWPFTable table = document.createTable(3, 4);

// 設(shè)置表格寬度
table.setWidth("100%");

// 填充表頭
XWPFTableRow headerRow = table.getRow(0);
headerRow.getCell(0).setText("序號");
headerRow.getCell(1).setText("姓名");
headerRow.getCell(2).setText("年齡");
headerRow.getCell(3).setText("部門");

// 填充數(shù)據(jù)
for (int i = 1; i < 3; i++) {
    XWPFTableRow row = table.getRow(i);
    row.getCell(0).setText(String.valueOf(i));
    row.getCell(1).setText("員工" + i);
    row.getCell(2).setText(String.valueOf(20 + i));
    row.getCell(3).setText(i % 2 == 0 ? "技術(shù)部" : "市場部");
}

// 合并單元格
table.getRow(2).getCell(3).setText("備注:所有部門");
table.addNewColSpan(2, 3, 2); // 合并第3行的第3-4列

2. 表格樣式設(shè)置

// 設(shè)置表格邊框
CTTblPr tblPr = table.getCTTbl().getTblPr();
CTBorder border = tblPr.addNewTblBorders();
border.addNewBottom().setVal(STBorder.SINGLE);
border.addNewTop().setVal(STBorder.SINGLE);
border.addNewLeft().setVal(STBorder.SINGLE);
border.addNewRight().setVal(STBorder.SINGLE);
border.addNewInsideH().setVal(STBorder.SINGLE);
border.addNewInsideV().setVal(STBorder.SINGLE);

// 設(shè)置表頭背景色
for (XWPFTableCell cell : headerRow.getTableCells()) {
    cell.setColor("D3D3D3"); // 淺灰色背景
}

四、插入圖片

import org.apache.poi.util.Units;

// 從文件插入圖片
try (FileInputStream is = new FileInputStream("logo.png")) {
    XWPFParagraph imagePara = document.createParagraph();
    imagePara.setAlignment(ParagraphAlignment.CENTER);
    
    XWPFRun imageRun = imagePara.createRun();
    imageRun.addPicture(is, 
                       Document.PICTURE_TYPE_PNG, 
                       "logo.png", 
                       Units.toEMU(200), // 寬度
                       Units.toEMU(100)); // 高度
}

// 從字節(jié)數(shù)組插入圖片
byte[] imageData = getImageData(); // 獲取圖片字節(jié)數(shù)組的方法
XWPFRun imageRun = document.createParagraph().createRun();
imageRun.addPicture(new ByteArrayInputStream(imageData),
                   Document.PICTURE_TYPE_JPEG,
                   "photo.jpg",
                   Units.toEMU(150),
                   Units.toEMU(150));

五、讀取和修改現(xiàn)有文檔

1. 讀取文檔內(nèi)容

public void readDocument(String filePath) throws IOException {
    try (FileInputStream fis = new FileInputStream(filePath);
         XWPFDocument document = new XWPFDocument(fis)) {
        
        System.out.println("==== 段落 ====");
        for (XWPFParagraph para : document.getParagraphs()) {
            System.out.println(para.getText());
        }
        
        System.out.println("\n==== 表格 ====");
        for (XWPFTable table : document.getTables()) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    System.out.print(cell.getText() + "\t");
                }
                System.out.println();
            }
        }
    }
}

2. 修改現(xiàn)有文檔

public void modifyDocument(String inputPath, String outputPath) throws IOException {
    try (FileInputStream fis = new FileInputStream(inputPath);
         XWPFDocument document = new XWPFDocument(fis)) {
        
        // 修改第一個(gè)段落
        XWPFParagraph firstPara = document.getParagraphs().get(0);
        if (firstPara != null) {
            XWPFRun run = firstPara.createRun();
            run.setText("\n(本文件由系統(tǒng)自動(dòng)生成)");
            run.setItalic(true);
            run.setColor("808080");
        }
        
        // 在文檔末尾添加新內(nèi)容
        XWPFParagraph newPara = document.createParagraph();
        newPara.setAlignment(ParagraphAlignment.RIGHT);
        XWPFRun newRun = newPara.createRun();
        newRun.setText("生成時(shí)間: " + LocalDate.now());
        newRun.addBreak(BreakType.PAGE); // 分頁符
        
        // 保存修改后的文檔
        try (FileOutputStream fos = new FileOutputStream(outputPath)) {
            document.write(fos);
        }
    }
}

六、高級功能

1. 頁眉頁腳設(shè)置

// 創(chuàng)建頁眉
XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT);
XWPFParagraph headerPara = header.createParagraph();
headerPara.setAlignment(ParagraphAlignment.RIGHT);
XWPFRun headerRun = headerPara.createRun();
headerRun.setText("公司機(jī)密");
headerRun.setColor("FF0000");

// 創(chuàng)建頁腳
XWPFFooter footer = document.createFooter(HeaderFooterType.DEFAULT);
XWPFParagraph footerPara = footer.createParagraph();
footerPara.setAlignment(ParagraphAlignment.CENTER);
XWPFRun footerRun = footerPara.createRun();
footerRun.setText("頁碼: ");
footerRun.getCTR().addNewFldSimple().setInstr("PAGE \\* MERGEFORMAT");

2. 目錄生成

// 創(chuàng)建目錄段落
XWPFParagraph tocPara = document.createParagraph();
tocPara.setStyle("TOCHeading");

XWPFRun tocRun = tocPara.createRun();
tocRun.setText("目錄");
tocRun.setBold(true);
tocRun.setFontSize(16);
tocRun.addBreak();

// 添加目錄字段
tocRun = tocPara.createRun();
tocRun.getCTR().addNewFldSimple().setInstr("TOC \\o \"1-3\" \\h \\z \\u");

3. 批注(注釋)添加

// 在第一個(gè)段落添加批注
XWPFParagraph firstPara = document.getParagraphs().get(0);
String commentText = "這是系統(tǒng)自動(dòng)添加的批注";
String commentAuthor = "AutoSystem";
CTComment ctComment = document.getDocument().getBody().addNewComment();
ctComment.setAuthor(commentAuthor);
ctComment.setDate(new GregorianCalendar());
ctComment.addNewP().addNewR().addNewT().setStringValue(commentText);

// 將段落與批注關(guān)聯(lián)
CTMarkupRange range = firstPara.getCTP().addNewCommentRangeStart();
range.setId(ctComment.getId());
firstPara.getCTP().addNewCommentRangeEnd().setId(ctComment.getId());
firstPara.getCTP().addNewR().addNewCommentReference().setId(ctComment.getId());

七、性能優(yōu)化與最佳實(shí)踐

1. 大文件處理優(yōu)化

對于大文檔,建議使用事件模型(XWPFEventAPI)而非DOM模型:

import org.apache.poi.xwpf.eventusermodel.*;

public class LargeDocumentReader {
    public static void main(String[] args) throws Exception {
        OPCPackage pkg = OPCPackage.open("large.docx");
        XWPFEventBasedParser parser = new XWPFEventBasedParser();
        parser.parse(pkg, new XWPFVisitor() {
            @Override
            public void visitParagraph(XWPFParagraph paragraph) {
                System.out.println("段落: " + paragraph.getText());
            }
            
            @Override
            public void visitTable(XWPFTable table) {
                System.out.println("發(fā)現(xiàn)表格");
            }
        });
        pkg.close();
    }
}

2. 內(nèi)存管理

及時(shí)關(guān)閉文檔對象和流

對于批量處理,考慮復(fù)用XWPFDocument對象

使用try-with-resources確保資源釋放

3. 樣式重用

// 創(chuàng)建并重用樣式
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
CTPageSz pageSz = sectPr.addNewPgSz();
pageSz.setW(BigInteger.valueOf(12240)); // A4寬度
pageSz.setH(BigInteger.valueOf(15840)); // A4高度

// 創(chuàng)建段落樣式
CTStyle ctStyle = CTStyle.Factory.newInstance();
ctStyle.setStyleId("MyStyle");
CTPPr pPr = ctStyle.addNewPPr();
pPr.addNewSpacing().setAfter(BigInteger.valueOf(200)); // 段后間距
document.getStyle().addStyle(ctStyle);

???????// 應(yīng)用樣式
XWPFParagraph para = document.createParagraph();
para.setStyle("MyStyle");

八、常見問題與解決方案

1. 中文亂碼問題

確保使用支持中文的字體:

run.setFontFamily("宋體");

或者在文檔級別設(shè)置默認(rèn)字體:

document.getStyles().setDefaultFonts("宋體", null);

2. 格式不兼容問題

盡量使用.docx格式而非.doc格式

避免使用太新的Office特性

在生成文檔后進(jìn)行兼容性測試

3. 性能問題

對于大文檔,分批次處理內(nèi)容

避免頻繁創(chuàng)建/銷毀XWPFRun對象

考慮緩存常用樣式

九、總結(jié)

Apache POI提供了強(qiáng)大而靈活的API來操作Word文檔,從簡單的文本生成到復(fù)雜的格式設(shè)置、表格處理和圖片插入都能勝任。通過本文的介紹,您應(yīng)該已經(jīng)掌握了:

  • 基本的文檔創(chuàng)建與保存
  • 文本格式設(shè)置與段落控制
  • 表格的創(chuàng)建與樣式設(shè)置
  • 圖片插入方法
  • 現(xiàn)有文檔的讀取與修改
  • 高級功能如頁眉頁腳、目錄生成
  • 性能優(yōu)化技巧

在實(shí)際項(xiàng)目中,建議根據(jù)具體需求選擇合適的API,并注意資源管理和性能優(yōu)化。對于更復(fù)雜的需求,可以結(jié)合模板引擎或考慮商業(yè)解決方案。

到此這篇關(guān)于從入門到實(shí)戰(zhàn)詳解如何使用Apache POI操作Word文檔的文章就介紹到這了,更多相關(guān)Apache POI操作Word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JVM、JRE、JDK之間的聯(lián)系及區(qū)別說明

    JVM、JRE、JDK之間的聯(lián)系及區(qū)別說明

    JVM、JRE和JDK是Java開發(fā)中三個(gè)關(guān)鍵組件,JVM是Java虛擬機(jī),負(fù)責(zé)解析和執(zhí)行Java字節(jié)碼,JRE是Java運(yùn)行環(huán)境,包含JVM和Java核心類庫,JDK是Java開發(fā)工具包,包含JRE和編譯工具,它們之間的關(guān)系是:JDK包含了JRE,JRE包含了JVM
    2026-01-01
  • 淺談Java中return和finally的問題

    淺談Java中return和finally的問題

    在Java中當(dāng)try、finally語句中包含return語句時(shí),執(zhí)行情況到底是怎樣的,finally中的代碼是否執(zhí)行,大家眾說紛紜,有的說會執(zhí)行,有的說不會執(zhí)行,到底哪種說法正確,下面我們來詳細(xì)討論下
    2015-10-10
  • Java生成隨機(jī)數(shù)的2種示例方法代碼

    Java生成隨機(jī)數(shù)的2種示例方法代碼

    在Java中,生成隨機(jī)數(shù)有兩種方法。1是使用Random類。2是使用Math類中的random方法。看下面的例子使用吧
    2013-11-11
  • Java獲取服務(wù)器IP及端口的方法實(shí)例分析

    Java獲取服務(wù)器IP及端口的方法實(shí)例分析

    這篇文章主要介紹了Java獲取服務(wù)器IP及端口的方法,結(jié)合實(shí)例形式分析了java針對客戶端及服務(wù)器端各種常見的信息操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • Java編程構(gòu)造方法與對象的創(chuàng)建詳解

    Java編程構(gòu)造方法與對象的創(chuàng)建詳解

    這篇文章主要介紹了Java編程構(gòu)造方法與對象的創(chuàng)建詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 全面解析SonarQube 7.8安裝與Maven集成指南:兼容JDK 1.8和MySQL的代碼質(zhì)量管理

    全面解析SonarQube 7.8安裝與Maven集成指南:兼容JDK 1.8和MySQL的代碼質(zhì)量

    SonarQube 7.8為JDK1.8和MySQL5.x量身打造,提供穩(wěn)定兼容性,安裝需配置JDK、數(shù)據(jù)庫及插件,Maven集成需調(diào)整settings.xml與pom.xml,下面通過本文給大家介紹SonarQube 7.8安裝與Maven集成指南:兼容JDK 1.8和MySQL的代碼質(zhì)量管理的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • mybatis in查詢條件過長的解決方案

    mybatis in查詢條件過長的解決方案

    這篇文章主要介紹了mybatis in查詢條件過長的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java IO字符流緩沖區(qū)實(shí)現(xiàn)原理解析

    Java IO字符流緩沖區(qū)實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java IO字符流緩沖區(qū)實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot @FunctionalInterface注解的項(xiàng)目實(shí)戰(zhàn)

    SpringBoot @FunctionalInterface注解的項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了Java中的@FunctionalInterface注解及其在SpringBoot項(xiàng)目中的應(yīng)用,包括如何使用函數(shù)式接口和Lambda表達(dá)式簡化代碼,感興趣的可以了解一下
    2025-11-11
  • Java中的內(nèi)部類使用詳情

    Java中的內(nèi)部類使用詳情

    說起內(nèi)部類這個(gè)詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時(shí)編寫代碼時(shí)可能用到的場景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來一探究竟
    2022-03-03

最新評論

青神县| 左贡县| 图木舒克市| 廊坊市| 宣威市| 临洮县| 星子县| 邯郸县| 逊克县| 大余县| 元阳县| 东城区| 浦县| 永年县| 广水市| 合阳县| 台东市| 张家口市| 朝阳区| 鄂托克前旗| 西藏| 金塔县| 新巴尔虎左旗| 呼伦贝尔市| 卢龙县| 平泉县| 裕民县| 遂宁市| 嘉禾县| 吉安县| 临潭县| 高州市| 门头沟区| 泽州县| 麻栗坡县| 钦州市| 临城县| 织金县| 赤城县| 中方县| 石林|