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(Poor Obfuscation Implementation File System) - 此组件是所有其他POI元素的基本因素。它用于显式读取不同的文件。

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

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

  • HPSF(Horrible Property Set Format) - 用于提取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软件开发工具包(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安装在您计算机上的基本目录位置。例如,

序号 平台和描述
1

Windows

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

2

Linux

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

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

序号 平台和描述
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驱动器上的文件夹中。

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

序号 平台和描述
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

导出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文档的类和方法。

文档

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

XWPFDocument

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

类方法

序号 方法和描述
1

commit()

提交并保存文档。

2

createParagraph()

将新段落附加到此文档。

3

createTable()

创建一个默认只有一行一列的空表格。

4

createTOC()

为Word文档创建目录。

5

getParagraphs()

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

6

getStyle()

返回使用的样式对象。

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

包org.apache.poi.openxml4j.opc.internal.

XWPFParagraph

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

类方法

序号 方法和描述
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 文档

XWPFRun

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

类方法

序号 方法和描述
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 文档

XWPFStyle

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

类方法

序号 方法和描述
1

getNextStyleID()

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

2

getStyleId()

用于获取样式的 StyleID。

3

getStyles()

用于获取样式。

4

setStyleId(java.lang.String styleId)

用于设置 styleID。

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

POI API 文档

XWPFTable

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

类方法

序号 方法和描述
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 文档中提取简单文本。

类方法

序号 方法和描述
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  {
      //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 - 段落

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

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

创建段落

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

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

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

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

在段落中运行

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

以下代码片段用于创建 Run。

XWPFRun run = paragraph.createRun();

写入段落

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

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** 文件如下所示。

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 {

      //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** 文件如下所示:−

Border Paragraph

Apache POI Word - 表格

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

创建表格

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

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** 文件如下所示:−

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 {

      //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** 文件如下所示。

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 {

      //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** 文件如下所示:−

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"));
      
      //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.
广告