Java使用XWPFDocument生成word文檔的示例代碼
以下是針對 XWPFDocument 的詳細解析,涵蓋其核心功能、常見用法及實際開發(fā)中的關(guān)鍵點:
1. XWPFDocument 簡介
XWPFDocument 是 Apache POI 庫中用于操作 .docx 格式 Word 文檔的核心類。它提供對文檔內(nèi)容(段落、表格、圖片、樣式等)的動態(tài)生成和修改能力,適用于需要自動化生成復(fù)雜 Word 文檔的場景。
在pom.xml中添加Apache POI依賴:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
2. 核心結(jié)構(gòu)與類
| 類/接口 | 功能說明 |
|---|---|
| XWPFDocument | 文檔對象,代表整個 .docx 文件,管理所有內(nèi)容元素。 |
| XWPFParagraph | 段落對象,控制文本塊(如標題、正文、列表)。 |
| XWPFRun | 段落內(nèi)的文本片段,可單獨設(shè)置樣式(字體、顏色、加粗等)。 |
| XWPFTable | 表格對象,支持動態(tài)創(chuàng)建表格、合并單元格、設(shè)置邊框等。 |
| XWPFPicture | 圖片對象,用于插入本地或網(wǎng)絡(luò)圖片。 |
| XWPFHeader/XWPFFooter | 頁眉和頁腳,支持全局或分節(jié)設(shè)置。 |
3. 核心操作詳解
3.1 段落與文本
// 1. 加載模板(文件要在src/main/resources目錄下)
ClassPathResource resource = new ClassPathResource("template/report_template.docx");
XWPFDocument document = new XWPFDocument(resource.getInputStream());
// 創(chuàng)建段落
XWPFParagraph para = document.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER); // 對齊方式(居中)
para.setIndentationFirstLine(600); // 首行縮進(單位:TWIP)
// 添加文本片段
XWPFRun run = para.createRun();
run.setText("Hello World!");
run.setBold(true); // 加粗
run.setFontSize(14); // 字號
run.setFontFamily("宋體"); // 解決中文亂碼的關(guān)鍵
run.setColor("FF0000"); // 字體顏色(RGB 十六進制)
run.addBreak(); // 換行(類似 <br>)
3.2 表格操作
// 創(chuàng)建表格(3行3列)
XWPFTable table = document.createTable(3, 3);
// 設(shè)置列寬(單位:TWIP)
CTTblGrid grid = table.getCTTbl().addNewTblGrid();
grid.addNewGridCol().setW(3000);
grid.addNewGridCol().setW(3000);
grid.addNewGridCol().setW(3000);
// 填充表頭
XWPFTableRow headerRow = table.getRow(0);
headerRow.getCell(0).setText("姓名");
headerRow.getCell(1).setText("年齡");
headerRow.getCell(2).setText("部門");
// 合并單元格(橫向)
mergeCellsHorizontal(table, 1, 0, 1);
table.getRow(1).getCell(0).setText("合并示例");
// 設(shè)置表格邊框
CTBorder border = CTBorder.Factory.newInstance();
border.setVal(STBorder.SINGLE);
border.setSz(BigInteger.valueOf(4)); // 邊框粗細
table.setTopBorder(border); // 上邊框
table.setBottomBorder(border); // 下邊框
3.3 列表與編號
// 創(chuàng)建編號列表
XWPFParagraph listPara = document.createParagraph();
listPara.setNumID(/* 編號ID,需通過樣式定義 */);
XWPFRun listRun = listPara.createRun();
listRun.setText("列表項1");
// 多級列表
CTAbstractNum abstractNum = CTAbstractNum.Factory.newInstance();
// ... 定義多級編號規(guī)則(需操作 XML 底層結(jié)構(gòu))
3.4 圖片插入
// 從本地文件讀取圖片
byte[] imageBytes = Files.readAllBytes(Paths.get("path/to/image.png"));
XWPFParagraph imagePara = document.createParagraph();
XWPFRun imageRun = imagePara.createRun();
imageRun.addPicture(
new ByteArrayInputStream(imageBytes),
Document.PICTURE_TYPE_PNG,
"image.png",
Units.toEMU(200), // 寬度(200像素)
Units.toEMU(150) // 高度(150像素)
);
4. 高級功能
4.1 頁眉與頁腳
// 創(chuàng)建頁眉
XWPFHeader header = document.createHeader(HeaderFooterType.DEFAULT);
XWPFParagraph headerPara = header.createParagraph();
headerPara.createRun().setText("公司機密 - 第1頁");
// 創(chuàng)建頁腳(帶頁碼)
XWPFFooter footer = document.createFooter(HeaderFooterType.DEFAULT);
XWPFParagraph footerPara = footer.createParagraph();
footerPara.setAlignment(ParagraphAlignment.CENTER);
footerPara.createRun().setText("頁碼:");
footerPara.getCTP().addNewFldSimple().setInstr("PAGE \\* MERGEFORMAT");
4.2 超鏈接
// 插入超鏈接
CTHyperlink cthyperlink = paragraph.getCTP().addNewHyperlink();
cthyperlink.setId(document.getPackagePart().addExternalRelationship(
"https://example.com",
XWPFRelation.HYPERLINK.getRelation()
).getId());
XWPFRun linkRun = paragraph.createRun();
linkRun.setText("訪問示例網(wǎng)站");
linkRun.setUnderline(UnderlinePatterns.SINGLE);
linkRun.setColor("0000FF");
4.3 分頁符
// 強制分頁 XWPFParagraph pageBreakPara = document.createParagraph(); pageBreakPara.createRun().addBreak(BreakType.PAGE);
5. 樣式與模板
5.1 使用預(yù)定義樣式
// 設(shè)置段落樣式(需提前定義或使用內(nèi)置樣式)
para.setStyle("Heading1");
5.2 自定義樣式
// 創(chuàng)建字符樣式 CTSectPr sectPr = document.getDocument().getBody().addNewSectPr(); CTDocDefaults docDefaults = sectPr.addNewDocDefaults(); CTRPrDefault rPrDefault = docDefaults.addNewRPrDefault(); CTRPr rpr = rPrDefault.addNewRPr(); rpr.addNewB().setVal(STOnOff.TRUE); // 默認加粗
6. 最佳實踐與注意事項
中文亂碼問題
- 必須顯式設(shè)置中文字體(如
run.setFontFamily("宋體"))。 - 確保系統(tǒng)或服務(wù)器環(huán)境支持中文字體。
性能優(yōu)化
- 生成大文檔時,使用
SXSSFWorkbook類似的流式處理(但 POI 對 Word 的支持有限)。 - 及時關(guān)閉資源:生成后調(diào)用
document.close()釋放內(nèi)存。
版本兼容性
Apache POI 5.x+ 支持 Office 2019+ 格式,舊版本需降級至 POI 3.x。
錯誤處理
- 捕獲
IOException和InvalidFormatException。 - 使用
try-with-resources確保流關(guān)閉:
try (XWPFDocument doc = new XWPFDocument();
FileOutputStream out = new FileOutputStream("output.docx")) {
// 操作文檔
}
模板引擎整合
復(fù)雜文檔建議結(jié)合 Freemarker 或 Velocity 模板引擎,避免硬編碼樣式。
7. 常見問題解決
- 表格邊框不顯示:需顯式設(shè)置表格邊框?qū)傩裕≒OI 默認不顯示邊框)。
- 生成的文檔損壞:確保正確關(guān)閉
XWPFDocument和輸出流。 - 樣式不生效:檢查樣式名稱是否正確,或直接通過
XWPFRun設(shè)置樣式覆蓋。
通過掌握 XWPFDocument 的核心 API 和上述技巧,可以高效生成復(fù)雜的 Word 文檔,滿足企業(yè)級應(yīng)用需求。
到此這篇關(guān)于Java使用XWPFDocument生成word文檔的示例代碼的文章就介紹到這了,更多相關(guān)Java XWPFDocument生成word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot3.X 無法解析parameter參數(shù)問題分析
本文介紹了Spring Boot 3.2.1版本中調(diào)用接口時出現(xiàn)的參數(shù)解析問題,該錯誤是由Spring新版本加強的錯誤校驗和報錯提示導(dǎo)致的,在Spring 6.1之后,官方要求URL中的傳參必須使用`@PathVariable`聲明用于接收的變量,而不能省略`@RequestParam`注解,感興趣的朋友一起看看吧2025-03-03
一文詳解Spring中ResponseEntity包裝器的使用
在?Spring?中,ResponseEntity?是?HTTP?響應(yīng)的包裝器,這篇文章主要為大家詳細介紹了ResponseEntity包裝器的使用,感興趣的可以了解一下2025-02-02
SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實例詳解
這篇文章主要介紹了SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Mybatis-plus實現(xiàn)join連表查詢的示例代碼
mybatis-plus在連表查詢上是不行的,如果需要連表查詢,就得乖乖的去寫xml文件了,本文介紹了mybatis-plus-join框架,它支持連表查詢,感興趣的可以了解一下2023-08-08
SpringBoot中定時任務(wù)@Scheduled注解的使用解讀
這篇文章主要介紹了SpringBoot中定時任務(wù)@Scheduled注解的使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
SpringCloud搭建Eureka服務(wù)模塊的過程
Eureka在分布式系統(tǒng)中起到了連接各個微服務(wù)的紐帶作用,使得服務(wù)之間的交互變得更加靈活、可靠,本文將深入探討如何使用Spring?Cloud,逐步引導(dǎo)讀者完成Eureka服務(wù)模塊的搭建,感興趣的朋友跟隨小編一起看看吧2024-02-02
在IntelliJ IDEA中.idea文件是什么可以刪除嗎
相信有很多小伙伴,在用idea寫java代碼的時候,創(chuàng)建工程總是會出現(xiàn).idea文件,該文件也從來沒去打開使用過,那么它在我們項目里面,扮演什么角色,到底能不能刪除它呢?這篇文章主要介紹了在IntelliJ IDEA中.idea文件是什么可以刪除嗎,需要的朋友可以參考下2024-01-01

