在Java中显示Word文档内容的方法与实践
在Java应用程序中处理和显示Word文档内容是一项常见需求,特别是在企业级应用、文档管理系统或办公自动化工具中,由于Word文档(.doc或.docx)格式复杂,直接解析和显示需要借助第三方库或工具,本文将详细介绍几种主流的实现方法,包括使用Apache POI、Jacob、docx4j以及JavaFX等技术的原理、步骤及注意事项,帮助开发者选择最适合的方案。

使用Apache POI解析并显示Word内容
Apache POI是Java领域最流行的操作Office文档的开源库,支持.doc(HWPF)和.docx(XWPF)格式,其核心思路是通过解析文档结构,提取文本、段落、表格等内容,再以文本形式或富文本形式显示在Java界面中。
添加依赖
首先需在项目中引入Apache POI的Maven依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.3</version>
</dependency>
解析Word文档
通过HWPFDocument(.doc)或XWPFDocument(.docx)类加载文件,并提取内容:
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import java.io.File;
import java.io.FileInputStream;
public class WordReader {
public static void readDoc(String filePath) throws Exception {
FileInputStream fis = new FileInputStream(new File(filePath));
HWPFDocument document = new HWPFDocument(fis);
Range range = document.getRange();
String text = range.text();
System.out.println(text);
fis.close();
}
}
显示到界面
提取的文本可直接显示在JTextArea等Swing组件中,但需注意样式丢失问题,若需保留部分格式,可通过XWPFRun获取字体、颜色等信息,并使用JEditorPane的HTML渲染功能简单模拟。
局限性:Apache POI对.docx格式的支持较好,但对复杂样式(如页眉页脚、图片、图表)的解析能力有限,且无法直接渲染Word的原生布局。
通过Jacob调用COM组件显示Word
Jacob(Java-COM Bridge)允许Java调用Windows的COM组件,可直接操作Word应用程序打开文档并显示内容,此方法依赖本地安装的Microsoft Word,适合Windows环境。
配置Jacob
下载Jacob.dll(32位/64位需与JDK匹配),将其放入System32目录或项目native-libraries路径,并添加Maven依赖:

<dependency>
<groupId>net.sf.jacob-project</groupId>
<artifactId>jacob</artifactId>
<version>1.20</version>
</dependency>
调用Word显示文档
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
public class WordDisplay {
public static void displayWord(String filePath) {
ActiveXComponent word = new ActiveXComponent("Word.Application");
try {
word.setProperty("Visible", true); // 显示Word界面
Dispatch documents = word.getProperty("Documents").toDispatch();
Dispatch document = Dispatch.call(documents, "Open", filePath).toDispatch();
// 文档操作完成后可调用document.invoke("Close", false)
} finally {
word.invoke("Quit", 0);
}
}
}
优点:能完整显示Word的格式、图片和交互功能,用户体验接近原生Word。
缺点:仅支持Windows,需安装Word,且多线程操作时可能出现兼容性问题。
使用docx4j处理.docx文档并转换为HTML
对于.docx格式,docx4j提供了更强大的解析能力,可将文档转换为HTML后再通过JavaFX或Swing的JEditorPane显示,保留部分样式。
添加docx4j依赖
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>11.4.4</version>
</dependency>
转换并显示HTML
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.convert.in.xhtml.XHTMLImageHandler;
import org.docx4j.convert.out.html.HTMLConversion;
public class DocxToHtml {
public static String convertToHtml(String filePath) throws Exception {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(filePath));
XHTMLImageHandler imageHandler = new XHTMLImageHandler();
HTMLConversion conversion = new HTMLConversion(wordMLPackage);
return conversion.convert(imageHandler);
}
}
转换后的HTML字符串可加载到JEditorPane:
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setText(DocxToHtml.convertToHtml("example.docx"));
优势:较好保留.docx的样式,适合无需编辑的场景。
不足:转换过程可能丢失复杂格式,且对.doc格式支持较差。

基于JavaFX的富文本显示(Java 8+)
JavaFX提供了WebView组件,可通过加载HTML或直接嵌入Word内容(需转换),结合docx4j的HTML转换,可实现跨平台的富文本显示。
示例代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WordViewer extends Application {
@Override
public void start(Stage stage) throws Exception {
WebView webView = new WebView();
webView.getEngine().loadContent(DocxToHtml.convertToHtml("example.docx"));
stage.setScene(new Scene(webView, 800, 600));
stage.show();
}
}
特点:界面美观,支持CSS样式,适合桌面应用开发。
选择方案的建议
- 纯文本需求:使用Apache POI,简单高效,但无格式支持。
- Windows环境+完整格式:Jacob调用Word,体验最佳但依赖本地环境。
- 跨平台+.docx格式:docx4j转HTML+JavaFX/Swing,平衡兼容性与样式保留。
- 企业级应用:可考虑集成Aspose.Words(商业库,功能全面但需付费)。
注意事项
- 性能优化:大文件解析时需注意内存管理,可分块读取或使用流式处理。
- 异常处理:文件路径、格式错误等需捕获异常,避免程序崩溃。
- 安全考虑:处理用户上传的Word文件时,需防范恶意宏或代码注入。
通过以上方法,开发者可根据项目需求和技术栈选择合适的方案,实现Java中Word文档内容的灵活显示。


















