Apache POI Word - 快速指南

Apache POI Word - 概述

很多时候,软件应用程序需要生成 Microsoft Word 文件格式的参考文档。有时,应用程序甚至需要接收 Word 文件作为输入数据。

任何想要生成 MS-Office 文件作为输出的 Java 程序员都必须使用预定义的只读 API 来执行此操作。

什么是 Apache POI?

Apache POI 是一种流行的 API,允许程序员使用 Java 程序创建、修改和显示 MS-Office 文件。它是一个由 Apache 软件基金会开发和分发的开源库,用于使用 Java 程序设计或修改 MS-Office 文件。它包含将用户输入数据或文件解码为 MS-Office 文档的类和方法。

Apache POI 的组件

Apache POI 包含用于处理 MS-Office 的所有 OLE2 复合文档的类和方法。此 API 的组件列表如下 −

  • POIFS(不良混淆实现文件系统) − 此组件是所有其他 POI 元素的基本因素。它用于显式读取不同的文件。

  • HSSF(可怕的电子表格格式) − 它用于读取和写入 MS-Excel 文件的 .xls 格式。

  • XSSF(XML 电子表格格式) − 它用于 MS-Excel 的 .xlsx 文件格式。

  • HPSF(可怕的属性集格式) −它用于提取 MS-Office 文件的属性集。

  • HWPF (Horrible Word Processor Format) − 它用于读取和写入 MS-Word 的 .doc 扩展名文件。

  • XWPF (XML Word Processor Format) − 它用于读取和写入 MS-Word 的 .docx 扩展名文件。

  • HSLF (Horrible Slide Layout Format) − 它用于读取、创建和编辑 PowerPoint 演示文稿。

  • HDGF (Horrible DiaGram Format) − 它包含 MS-Visio 二进制文件的类和方法。

  • HPBF (Horrible Publisher Format) −它用于读取和写入 MS-Publisher 文件。

本教程将指导您使用 Java 处理 MS-Word 文件的过程。因此,讨论仅限于 HWPF 和 XWPF 组件。

注意 − 旧版本的 POI 支持二进制文件格式,例如 DOC、XLS、PPT 等。从版本 3.5 开始,POI 支持 MS-OFFICE 的 OOXML 文件格式,例如 DOCX、XLSX、PPTX 等。

Apache POI Word - 安装

本章将带您了解在基于 Windows 和 Linux 的系统上设置 Apache POI 的过程。只需几个简单的步骤,即可轻松安装 Apache POI 并将其与您当前的 Java 环境集成,无需任何复杂的设置程序。安装时需要用户管理。

系统要求

JDK Java SE 2 JDK 1.5 或更高版本
内存 1 GB RAM(推荐)
磁盘空间 无最低要求
操作系统版本 Windows XP 或更高版本,Linux

现在让我们继续安装 Apache POI 的步骤。

步骤 1:验证您的 Java 安装

首先,您需要具有 Java 软件开发Kit (SDK) 已安装在您的系统上。要验证这一点,请根据您正在使用的平台执行以下两个命令中的任意一个。

如果 Java 安装已正确完成,则它将显示 Java 安装的当前版本和规格。下表给出了示例输出。

平台 命令 示例输出
Windows

打开命令控制台并输入 −

\>java -version

java version "11.0.11" 2021-04-20 LTS

Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)

Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)

Linux

打开命令终端并输入 −

$java -version

java version "11.0.11" 2021-04-20 LTS

Open JDK Runtime Environment 18.9 (build 11.0.11+9-LTS-194)

Open JDK 64-Bit Server VM (build 11.0.11+9-LTS-194, mixed mode)

步骤 2:设置 Java 环境

将环境变量 JAVA_HOME 设置为指向您的计算机上安装 Java 的基本目录位置。例如,

Sr.No. 平台和描述
1

Windows

将 JAVA_HOME 设置为 C:\ProgramFiles\java\jdk11.0.11

2

Linux

导出 JAVA_HOME = /usr/local/java-current

将 Java 编译器位置的完整路径附加到系统路径。

Sr.No. 平台 &描述
1

Windows

将字符串"C:\Program Files\Java\jdk11.0.11\bin"附加到系统变量 PATH 的末尾。

2

Linux

导出 PATH = $PATH:$JAVA_HOME/bin/

按照上述说明从命令提示符执行命令 java -version

步骤 3:安装 Apache POI 库

https://poi.apache.org/download.html 下载最新版本的 Apache POI,并将其内容解压缩到一个文件夹,从该文件夹中可以将所需的库链接到您的 Java 程序。我们假设文件收集在 C 盘上的文件夹中。

将所需 jar 的完整路径添加到 CLASSPATH,如下所示。

Sr.No. 平台和说明
1

Windows

将以下字符串附加到用户变量的末尾

CLASSPATH −

C:\poi-bin-5.1.0\poi-5.1.0.jar;

C:\poi-bin-5.1.0\poi-ooxml-5.1.0.jar;

C:\poi-bin-5.1.0\poi-ooxml-full-5.1.0.jar;

C:\poi-bin-5.1.0\lib\commons-codec-1.15.jar;

C:\poi-bin-5.1.0\lib\commons-collections4-4.4.jar;

C:\poi-bin-5.1.0\lib\commons-io-2.11.0.jar;

C:\poi-bin-5.1.0\lib\commons-math3-3.6.1.jar;

C:\poi-bin-5.1.0\lib\log4j-api-2.14.1.jar;

C:\poi-bin-5.1.0\lib\SparseBitSet-1.2.jar;

C\poi-bin-5.1.0\ooxml-lib\commons-compress-1.21.jar

C\poi-bin-5.1.0\ooxml-lib\commons-logging-1.2.jar

C\poi-bin-5.1.0\ooxml-lib\curvesapi-1.06.jar

C\poi-bin-5.1.0\ooxml-lib\slf4j-api-1.7.32.jar

C\poi-bin-5.1.0\ooxml-lib\xmlbeans-5.0.2.jar

2

Linux

Export CLASSPATH = $CLASSPATH:

/usr/share/poi-bin-5.1.0/poi-5.1.0.jar.tar:

/usr/share/poi-bin-5.1.0/poi-ooxml-5.1.0.tar:

/usr/share/poi-bin-5.1.0/poi-ooxml-full-5.1.0.tar:

/usr/share/poi-bin-5.1.0/lib/commons-codec-1.15.jar.tar:

/usr/share/poi-bin-5.1.0/lib/commons-collections4-4.4.tar:

/usr/share/poi-bin-5.1.0/lib/commons-io-2.11.0.tar:

/usr/share/poi-bin-5.1.0/lib/commons-math3-3.6.1.tar:

/usr/share/poi-bin-5.1.0/lib/log4j-api-2.14.1.tar:

/usr/share/poi-bin-5.1.0/lib/SparseBitSet-1.2.tar:

/usr/share/poi-bin-5.1.0/ooxml-lib/commons-compress-1.21.tar:

/usr/share/poi-bin-5.1.0/ooxml-lib/commons-logging-1.2.tar:

/usr/share/poi-bin-5.1.0/ooxml-lib/curvesapi-1.06.tar:

/usr/share/poi-bin-5.1.0/ooxml-lib/slf4j-api-1.7.32.tar:

/usr/share/poi-bin-5.1.0/ooxml-lib/xmlbeans-5.0.2.tar:

Apache POI Word - 核心类

本章将带您了解 Apache POI 用于管理 Word 文档的类和方法。

Document

这是一个标记接口(接口不包含任何方法),用于通知实现的类可以创建 Word 文档。

XWPFDocument

这是 org.apache.poi.xwpf.usermodel 包下的一个类。它用于创建 .docx 文件格式的 MS-Word 文档。

类方法

Sr.No. 方法 &描述
1

commit()

提交并保存文档。

2

createParagraph()

将新段落附加到此文档。

3

createTable()

创建一个默认为一行一列的空表。

4

createTOC()

为 Word 创建目录文档。

5

getParagraphs()

返回包含页眉或页脚文本的段落。

6

getStyle()

返回使用的样式对象。

有关此类的其余方法,请参阅完整的 API 文档 −

Package org.apache.poi.openxml4j.opc.internal.

XWPFParagraph

这是 org.apache.poi.xwpf.usermodel 包下的一个类,用于在 word 文档中创建段落。此实例还用于将所有类型的元素添加到 word 文档中。

类方法

Sr.No. 方法 &描述
1

createRun()

将新的运行附加到此段落。

2

getAlignment()

返回应用于此段落中文本的段落对齐方式。

3

setAlignment(ParagraphAlignment align)

指定应用于此段落中文本的段落对齐方式。

4

setBorderBottom(Borders border)

指定应显示在一组段落下方的边框,这些段落具有相同的段落边框设置。

5

setBorderLeft(Borders border)

指定应显示在页面左侧的指定段落周围的边框。

6

setBorderRight(Borders border)

指定应显示在页面右侧的指定段落周围的边框。

7

setBorderTop(Borders border)

指定应显示在具有相同段落边框设置的一组段落上方的边框。

有关此类的其余方法,请参阅完整的 API 文档 −

POI API Documentation

XWPFRun

这是 org.apache.poi.xwpf.usermodel 包下的一个类,用于向段落添加一段文本。

类方法

Sr.No. 方法 &描述
1

addBreak()

指定应在运行内容的当前位置放置一个中断。

2

addTab()

指定应在运行内容的当前位置放置一个制表符。

3

setColor(java.lang.String rgbStr)

设置文本颜色。

4

setFontSize(int size)

指定显示此文本串内容时应应用于所有非复杂脚本字符的字体大小。

5

setText(java.lang.String value)

设置此文本串的文本。

6

setBold(boolean value)

指定在文档中显示此文本串内容时是否应将粗体属性应用于所有非复杂脚本字符。

有关此类的其余方法,请参阅完整的 API 文档 −

POI API Documentation

XWPFStyle

这是 org.apache.poi.xwpf.usermodel 包下的一个类,用于为 word 文档中的对象元素添加不同的样式。

类方法

Sr.No. 方法 &说明
1

getNextStyleID()

用于获取下一个样式的StyleID。

2

getStyleId()

用于获取样式的StyleID。

3

getStyles()

用于获取样式。

4

setStyleId(java.lang.String styleId)

用于设置styleID。

有关该类的其余方法,请参阅完整的API文档 −

POI API Documentation

XWPFTable

这是 org.apache.poi.xwpf.usermodel 包下的一个类,用于将表格数据添加到 word 文档中。

类方法

Sr.No. 方法 &描述
1

addNewCol()

为此表中的每一行添加一个新列。

2

addRow(XWPFTableRow row, int pos)

在位置 pos 处向表中添加一个新行。

3

createRow()

创建一个新的 XWPFTableRow 对象,其单元格数量与当时定义的列数相同。

4

setWidth(int width)

设置列的宽度。

有关此类的其余方法,请参阅完整的 API 文档: POI API 文档

XWPFWordExtractor

这是 org.apache.poi.xwpf.extractor 包下的一个类。它是一个基本的解析器类,用于从 Word 文档中提取简单文本。

类方法

Sr.No. 方法和说明
1

getText()

从文档中检索所有文本。

有关此类的其余方法,请参阅完整的 API 文档: POI API 文档

Apache POI Word - 文档

此处的术语"文档"是指 MS-Word 文件。完成本章后,您将能够使用 Java 程序创建新文档并打开现有文档。

创建空白文档

以下简单程序用于创建空白 MS-Word 文档 −

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class CreateDocument {
    public static void main(String[] args)throws Exception {
        //空白文档
        XWPFDocument document = new XWPFDocument();
        
        //将文档写入文件系统
        FileOutputStream out = new FileOutputStream( new File("createdocument.docx"));
        document.write(out);
        out.close();
        System.out.println("createdocument.docx 写入成功");
    }
}

将上述 Java 代码另存为 CreateDocument.java,然后从命令提示符中编译并执行,如下所示 −

$javac CreateDocument.java
$java CreateDocument

如果您的系统环境配置了 POI 库,它将编译并执行以在当前目录中生成一个名为 createdocument.docx 的空白 Word 文档文件,并在命令提示符中显示以下输出 −

createdocument.docx 写入成功

Apache POI Word - 段落

在本章中,您将学习如何创建段落以及如何使用 Java 将其添加到文档中。段落是 Word 文件中页面的一部分。

完成本章后,您将能够创建段落并对其执行读取操作。

创建段落

首先,让我们使用前面章节中讨论的引用类创建一个段落。按照上一章的步骤,先创建一个文档,然后我们可以创建一个段落。

以下代码片段用于创建电子表格 −

//创建空白文档
XWPFDocument document = new XWPFDocument();

//创建空白电子表格
XWPFParagraph passage = document.createParagraph();

在段落上运行

您可以使用Run输入文本或任何对象元素。使用段落实例,您可以创建run

以下代码片段用于创建运行。

XWPFRun run = passage.createRun();

写入段落

让我们尝试在文档中输入一些文本。考虑以下文本数据 −

在 tutorialspoint.com,我们努力为学术、信息技术、管理和计算机编程语言领域的自学目的提供高质量的教程。

以下代码用于将上述数据写入段落。

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class CreateParagraph {
   public static void main(String[] args)throws Exception {
        //空白文档
        XWPFDocument document = new XWPFDocument();
        
        //在文件系统中写入文档
        FileOutputStream out = new FileOutputStream(new File("createparagraph.docx"));
        
        //创建段落
        XWPFParagraph passage = document.createParagraph();
        XWPFRun run = passage.createRun();
        run.setText("在 tutorialspoint.com,我们努力为学术、信息、技术、管理和计算机编程语言等领域的自学提供高质量的教程。");
        
        document.write(out);
        out.close();
        System.out.println("createparagraph.docx 已成功写入");
   }
}

将上述 Java 代码保存为 CreateParagraph.java,然后从命令提示符中编译并运行它,如下所示 −

$javac CreateParagraph.java
$java CreateParagraph

它将编译并执行以在当前目录中生成一个名为 createparagraph.docx 的 Word 文件,您将在命令提示符中获得以下输出 −

createparagraph.docx 已成功写入

createparagraph.docx 文件如下所示。

Create Paragraph

Apache POI Word - 边框

在本章中,您将学习如何使用 Java 编程将边框应用于段落。

应用边框

以下代码用于在文档中应用边框 −

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.Borders;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class ApplyingBorder {

   public static void main(String[] args)throws Exception {

    //空白文档
    XWPFDocument document = new XWPFDocument();
    
    //将文档写入文件系统
    FileOutputStream out = new FileOutputStream(new File("applyingborder.docx"));
    
    //创建段落
    XWPFParagraph passage = document.createParagraph();
    
    //设置段落的下边框
    passage.setBorderBottom(Borders.BASIC_BLACK_DASHES);
    
    //设置段落的左边框
    passage.setBorderLeft(Borders.BASIC_BLACK_DASHES);
    
    //设置段落的右边框
    passage.setBorderRight(Borders.BASIC_BLACK_DASHES);
    
    //设置段落的上边框
    passage.setBorderTop(Borders.BASIC_BLACK_DASHES);
        
      XWPFRun run = paragraph.createRun();
         run.setText("At tutorialspoint.com, we strive hard to " +
         "provide quality tutorials for self-learning " +
         "purpose in the domains of Academics, Information " +
         "Technology, Management and Computer Programming " +
         "Languages.");
        
      document.write(out);
      out.close();
      System.out.println("applyingborder.docx written successully");
   }
}

将上述代码保存在名为 ApplyingBorder.java 的文件中,然后从命令提示符编译并执行它,如下所示 −

$javac ApplyingBorder.java
$java ApplyingBorder

如果您的系统配置了 POI 库,则它将编译并执行以在当前目录中生成名为 applyingborder.docx 的 Word 文档,并显示以下输出 −

applyingborder.docx 写入成功

applyingborder.docx 文件如下所示 −

Border Paragraph

Apache POI Word - 表格

在本章中,您将学习如何在文档中创建数据表。您可以使用 XWPFTable 类创建表格数据。通过将每个 Row 添加到表格并将每个 cell 添加到 Row,您将获得表格数据。

创建表格

以下代码用于在文档中创建表格 −

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

public class CreateTable {

   public static void main(String[] args)throws Exception {

    //空白文档
    XWPFDocument document = new XWPFDocument();
    
    //将文档写入文件系统
    FileOutputStream out = new FileOutputStream(new File("create_table.docx"));
    
    //创建表格
    XWPFTable table = document.createTable();
    
    //创建第一行
    XWPFTableRow tableRowOne = table.getRow(0);
    tableRowOne.getCell(0).setText("col one, row one");
    tableRowOne.addNewTableCell().setText("col two, row one");
    tableRowOne.addNewTableCell().setText("col three, row one");
    
    //创建第二行
    XWPFTableRow tableRowTwo = table.createRow();
    tableRowTwo.getCell(0).setText("col one, row two");
    tableRowTwo.getCell(1).setText("col two, row two");
    tableRowTwo.getCell(2).setText("col three, row two");
    
    //创建第三行
    XWPFTableRow tableRowThree = table.createRow();
    tableRowThree.getCell(0).setText("col one, row three");
    tableRowThree.getCell(1).setText("col two, row three");
    tableRowThree.getCell(2).setText("col three, row three");
    
    document.write(out);
    out.close();
    System.out.println("create_table.docx 已成功写入");
   }
}

将上述代码保存在名为 CreateTable.java 的文件中。编译并从命令提示符执行它,如下所示 −

$javac CreateTable.java
$java CreateTable

它会在当前目录中生成一个名为 createtable.docx 的 Word 文件,并在命令提示符上显示以下输出 −

createtable.docx 已成功写入

createtable.docx 文件如下所示 −

Create Table

Apache POI Word - 字体和对齐

本章介绍如何使用 Java 在 Word 文档中应用不同的字体样式和对齐方式。通常,字体样式包含:字体大小、类型、粗体、斜体和下划线。对齐方式分为左对齐、居中对齐、右对齐和两端对齐。

字体样式

以下代码用于设置不同样式的字体 −

import java.io.File;
import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.VerticalAlign;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class FontStyle {

   public static void main(String[] args)throws Exception {

        //空白文档
        XWPFDocument document = new XWPFDocument();
        
        //将文档写入文件系统
        FileOutputStream out = new FileOutputStream(new File("fontstyle.docx"));
        
        //创建段落
        XWPFParagraph passage = document.createParagraph();
        
        //设置粗体和斜体
        XWPFRun passageOneRunOne = passage.createRun();
        passageOneRunOne.setBold(true);
        passageOneRunOne.setItalic(true);
        passageOneRunOne.setText("字体样式");
        passageOneRunOne.addBreak();
        
        //设置文本位置
        XWPFRun passageOneRunTwo = passage.createRun();
        passageOneRunTwo.setText("字体样式二");
        passageOneRunTwo.setTextPosition(100);
        
        //设置删除线、字体大小和下标
        XWPFRun paragraphOneRunThree = paragraph.createRun();
        paragraphOneRunThree.setStrike(true);
        paragraphOneRunThree.setFontSize(20);
        paragraphOneRunThree.setSubscript(VerticalAlign.SUBSCRIPT);
        paragraphOneRunThree.setText(" Different Font Styles");
        
        document.write(out);
        out.close();
        System.out.println("fontstyle.docx written successully");
   }
}

将上述代码保存为 FontStyle.java,然后编译并从命令提示符执行它,如下所示 −

$javac FontStyle.java
$java FontStyle

它将在当前目录中生成一个名为 fontstyle.docx 的 Word 文件,并在命令提示符上显示以下输出 −

fontstyle.docx 写入成功

fontstyle.docx 文件如下所示。

Font Style

对齐

以下代码用于设置段落文本的对齐方式 −

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class AlignParagraph {

   public static void main(String[] args)throws Exception {

        //空白文档
        XWPFDocument document = new XWPFDocument();
        
        //将文档写入文件系统
        FileOutputStream out = new FileOutputStream(
        new File("alignparagraph.docx"));
        
        //创建段落
        XWPFParagraph passage = document.createParagraph();
        
        //将段落对齐方式设置为右对齐
        paragraph.setAlignment(ParagraphAlignment.RIGHT);
        XWPFRun run = paragraph.createRun();
        run.setText("At tutorialspoint.com, we strive hard to " +
         "provide quality tutorials for self-learning " +
         "purpose in the domains of Academics, Information " +
         "Technology, Management and Computer Programming " +
         "Languages.");
        
        //创建另一个段落
        paragraph = document.createParagraph();
        
        //将段落对齐方式设置为居中
      	paragraph.setAlignment(ParagraphAlignment.CENTER);
      	run = paragraph.createRun();
      	run.setText("The endeavour started by Mohtashim, an AMU " +
         "alumni, who is the founder and the managing director " +
         "of Tutorials Point (I) Pvt. Ltd. He came up with the " +
         "website tutorialspoint.com in year 2006 with the help" +
         "of handpicked freelancers, with an array of tutorials" +
         " for computer programming languages. ");
			
      document.write(out);
      out.close();
      System.out.println("alignparagraph.docx 写入成功");
   }
}

将上述代码保存为 AlignParagraph.java,然后从命令提示符中编译并执行它,如下所示 −

$javac AlignParagraph.java
$java AlignParagraph

它将在当前目录中生成一个名为 alignparagraph.docx 的 Word 文件,并在命令提示符中显示以下输出 −

alignparagraph.docx 写入成功

alignparagraph.docx 文件如下所示 −

Align Paragraph

Apache POI Word - 文本提取

本章介绍如何使用 Java 从 Word 文档中提取简单文本数据。如果您想从 Word 文档中提取元数据,请使用 Apache Tika。

对于 .docx 文件,我们使用类 org.apache.poi.xwpf.extractor.XPFFWordExtractor,该类从 Word 文件中提取并返回简单数据。同样,我们有不同的方法从 Word 文件中提取标题、脚注、表格数据等。

以下代码显示如何从 Word 文件中提取简单文本 −

import java.io.FileInputStream;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class WordExtractor {
    public static void main(String[] args)throws Exception {
        XWPFDocument docx = new XWPFDocument(new FileInputStream("createparagraph.docx"));
        
        //使用 XWPFWordExtractor 类
        XWPFWordExtractor we = new XWPFWordExtractor(docx);
        System.out.println(we.getText());
    }
}

将上述代码保存为 WordExtractor.java。 编译并从命令提示符执行它,如下所示 −

$javac WordExtractor.java
$java WordExtractor

它将生成以下输出−

At tutorialspoint.com, we strive hard to provide quality tutorials for self-learning purpose
in the domains of Academics, Information Technology, Management and Computer Programming Languages.