Apache Poi Word 简明教程

Apache POI Word - Quick Guide

Apache POI Word - Overview

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

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

What is Apache POI?

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

Components of Apache POI

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

  1. POIFS (Poor Obfuscation Implementation File System) − 此组件是所有其他 POI 元素的基本因素。它用于明确读取不同文件。

  2. HSSF (Horrible SpreadSheet Format) − 用于读取和写入 MS-Excel 文件的 .xls 格式。

  3. XSSF (XML SpreadSheet Format) − 用于 MS-Excel 的 .xlsx 文件格式。

  4. HPSF (Horrible Property Set Format) − 它用于提取 MS-Office 文件的属性集。

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

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

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

  8. HDGF (Horrible DiaGram Format) − 包含 MS-Visio 二进制文件所需类和方法。

  9. HPBF (Horrible PuBlisher Format) − 用于读取和写入 MS-Publisher 文件。

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

Note − POI 的较旧版本支持 DOC、XLS、PPT 等二进制文件格式。从版本 3.5 开始,POI 支持 DOCX、XLS、PPTX 等 MS-Office 的 OOXML 文件格式。

Apache POI Word - Installation

本教程将指导你完成在 Windows 和 Linux 系统上设置 Apache POI 的流程。Apache POI 可以在不执行任何复杂设置程序的情况下,使用几个简单的步骤轻松安装并集成到当前的 Java 环境中。在安装时需要有用户管理权限。

System Requirements

JDK

Java SE 2 JDK 1.5 或更高版本

Memory

1 GB RAM (recommended)

Disk Space

No minimum requirement

Operating System Version

Windows XP 或更高版本、Linux

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

Step 1: Verify your Java Installation

首先,你的系统中需要安装 Java 软件开发工具包 (SDK)。要验证这一点,请根据所使用的平台执行以下两个命令。

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

Platform

Command

Sample Output

Windows

打开命令控制台并键入 >java -version

java version "11.0.11" 2021-04-20 LTSJava™ SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)Java HotSpot™ 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 LTSOpen 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)

  1. 我们假设本教程的读者已在他们的系统中安装了 Java SDK 版本 11.0.11。

  2. 如果您没有 Java SDK,请从 www.oracle.com/technetwork/java/javase/downloads/index.html 下载其当前版本并将其安装。

Step 2: Set your Java Environment

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

Sr.No.

Platform & Description

1

Windows Set JAVA_HOME to C:\ProgramFiles\java\jdk11.0.11

2

Linux Export JAVA_HOME = /usr/local/java-current

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

Sr.No.

Platform & Description

1

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

2

Linux Export PATH = $PATH:$JAVA_HOME/bin/

如上所述,从命令提示符执行命令 java -version

Step 3: Install Apache POI Library

https://poi.apache.org/download.html 下载最新版本的 Apache POI,并将其内容解压缩到一个文件夹中,然后可以将该文件夹中的所需库连接到你的 Java 程序。我们假设这些文件保存在 C 驱动器的文件夹中。

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

Sr.No.

Platform & Description

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.jarC\poi-bin-5.1.0\ooxml-lib\commons-logging-1.2.jarC\poi-bin-5.1.0\ooxml-lib\curvesapi-1.06.jarC\poi-bin-5.1.0\ooxml-lib\slf4j-api-1.7.32.jarC\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 - Core Classes

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

Document

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

XWPFDocument

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

Class Methods

Sr.No.

Method & Description

1

commit() 提交并保存文档。

2

createParagraph() 向此文档追加一个新段落。

3

createTable() 默认情况下创建一个只有一行一列的空表。

4

createTOC() 为 Word 文档创建一个目录。

5

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

6

getStyle() 返回已使用的样式对象。

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

XWPFParagraph

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

Class Methods

Sr.No.

Method & Description

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 文档 −

XWPFRun

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

Class Methods

Sr.No.

Method & Description

1

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

2

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

3

setColor(java.lang.String rgbStr) Sets text color.

4

setFontSize(int size) 指定在显示此运行内容时应用于此运行内容中的所有非复杂脚本字符的字体大小。

5

setText(java.lang.String value) 设置此段文本的文本。

6

setBold(boolean value) 指定在文档中显示此运行内容时,是否将粗体属性应用于此运行内容中的所有非复杂脚本字符。

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

XWPFStyle

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

Class Methods

Sr.No.

Method & Description

1

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

2

getStyleId() 用于获取样式的 StyleID。

3

getStyles() 用于获取样式。

4

setStyleId(java.lang.String styleId) 用于设置 styleID。

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

XWPFTable

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

Class Methods

Sr.No.

Method & Description

1

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

2

addRow(XWPFTableRow row, int pos) 在位置 pos 处向表格添加新行。

3

createRow() 创建一个新的 XWPFTableRow 对象,其单元格数与此时定义的列数相同。

4

setWidth(int width) 设置列的宽度。

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

XWPFWordExtractor

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

Class Methods

Sr.No.

Method & Description

1

getText() 从文档中检索所有文本。

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

Apache POI Word - Document

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

Create Blank Document

以下简单程序用于创建一个空白 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  {
      //Blank Document
      XWPFDocument document = new XWPFDocument();

      //Write the Document in file system
      FileOutputStream out = new FileOutputStream( new File("createdocument.docx"));
      document.write(out);
      out.close();
      System.out.println("createdocument.docx written successully");
   }
}

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

$javac  CreateDocument.java
$java CreateDocument

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

createdocument.docx written successfully

Apache POI Word - Paragraph

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

完成本课后,您将能够创建一个段落并在其上执行读取操作。

Create a Paragraph

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

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

//Create Blank document
XWPFDocument document = new XWPFDocument();

//Create a blank spreadsheet
XWPFParagraph paragraph = document.createParagraph();

Run on Paragraph

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

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

XWPFRun run = paragraph.createRun();

Write into a Paragraph

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

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.

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

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 {
      //Blank Document
      XWPFDocument document = new XWPFDocument();

      //Write the Document in file system
      FileOutputStream out = new FileOutputStream(new File("createparagraph.docx"));

      //create Paragraph
      XWPFParagraph paragraph = document.createParagraph();
      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("createparagraph.docx written successfully");
   }
}

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

$javac CreateParagraph.java
$java CreateParagraph

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

createparagraph.docx written successfully

createparagraph.docx 文件如下所示。

createparagraph

Apache POI Word - Borders

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

Applying Border

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

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 {

      //Blank Document
      XWPFDocument document = new XWPFDocument();

      //Write the Document in file system
      FileOutputStream out = new FileOutputStream(new File("applyingborder.docx"));

      //create paragraph
      XWPFParagraph paragraph = document.createParagraph();

      //Set bottom border to paragraph
      paragraph.setBorderBottom(Borders.BASIC_BLACK_DASHES);

      //Set left border to paragraph
      paragraph.setBorderLeft(Borders.BASIC_BLACK_DASHES);

      //Set right border to paragraph
      paragraph.setBorderRight(Borders.BASIC_BLACK_DASHES);

      //Set top border to paragraph
      paragraph.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 written successfully

applyingborder.docx 文件看起来如下 −

borderparagraph

Apache POI Word - Tables

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

Create Table

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

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 {

      //Blank Document
      XWPFDocument document = new XWPFDocument();

      //Write the Document in file system
      FileOutputStream out = new FileOutputStream(new File("create_table.docx"));

      //create table
      XWPFTable table = document.createTable();

      //create first row
      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");

      //create second row
      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");

      //create third row
      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 written successully");
   }
}

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

$javac CreateTable.java
$java CreateTable

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

createtable.docx written successfully

createtable.docx 文件如下所示 −

ctratetable

Apache POI Word - Font & Alignment

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

Font Style

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

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 {

      //Blank Document
      XWPFDocument document = new XWPFDocument();

      //Write the Document in file system
      FileOutputStream out = new FileOutputStream(new File("fontstyle.docx"));

      //create paragraph
      XWPFParagraph paragraph = document.createParagraph();

      //Set Bold an Italic
      XWPFRun paragraphOneRunOne = paragraph.createRun();
      paragraphOneRunOne.setBold(true);
      paragraphOneRunOne.setItalic(true);
      paragraphOneRunOne.setText("Font Style");
      paragraphOneRunOne.addBreak();

      //Set text Position
      XWPFRun paragraphOneRunTwo = paragraph.createRun();
      paragraphOneRunTwo.setText("Font Style two");
      paragraphOneRunTwo.setTextPosition(100);

      //Set Strike through and Font Size and Subscript
      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 written successfully

fontstyle.docx 文件如下所示。

fontstyle

Alignment

使用以下代码将对齐方式设为段落文本 −

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 {

      //Blank Document
      XWPFDocument document = new XWPFDocument();

      //Write the Document in file system
      FileOutputStream out = new FileOutputStream(
      new File("alignparagraph.docx"));

      //create paragraph
      XWPFParagraph paragraph = document.createParagraph();

      //Set alignment paragraph to RIGHT
      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.");

      //Create Another paragraph
      paragraph = document.createParagraph();

      //Set alignment paragraph to CENTER
      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 written successfully");
   }
}

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

$javac AlignParagraph.java
$java AlignParagraph

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

alignparagraph.docx written successfully

alignparagraph.docx 文件如下所示 −

alignparagraph

Apache POI Word - Text Extraction

本章说明如何使用 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"));

      //using XWPFWordExtractor Class
      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.