Apache Poi Word 简明教程
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 的组件列表如下 -
-
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 组件。
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) |
-
我们假设本教程的读者已在他们的系统中安装了 Java SDK 版本 11.0.11。
-
如果您没有 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 文档。
XWPFDocument
这是一个在 org.apache.poi.xwpf.usermodel 包下的类。它用于创建带 .docx 文件格式的 MS-Word 文档。
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 文档中的对象元素添加不同的样式。
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 文件如下所示。
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 文件看起来如下 −
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 文件如下所示 −
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 文件如下所示。
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 文件如下所示 −
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.