Apache POI - 快速指南


Apache POI - 概述

很多时候,需要软件应用程序来生成 Microsoft Excel 文件格式的报告。有时,应用程序甚至需要接收 Excel 文件作为输入数据。例如,为公司财务部门开发的应用程序需要在 Excel 中生成所有输出。

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

什么是 Apache POI?

Apache POI 是一种流行的 API,允许程序员使用 Java 程序创建、修改和显示 MS Office 文件。它是由 Apache Software Foundation 开发和分发的一个开源库,用于使用 Java 程序设计或修改 Microsoft 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(可怕的字处理器格式) - 用于读取和写入 MS-Word 的文档扩展文件。

  • XWPF(XML字处理器格式) - 用于读取和写入MS-Word的docx扩展文件。

  • HSLF(可怕的幻灯片布局格式) - 用于阅读、创建和编辑 PowerPoint 演示文稿。

  • HDGF(可怕的图表格式) - 它包含 MS-Visio 二进制文件的类和方法。

  • HPBF(Horrible PuBlisher 格式) - 用于读取和写入 MS-Publisher 文件。

本教程将指导您完成使用 Java 处理 Excel 文件的过程。因此,讨论仅限于 HSSF 和 XSSF 组件。

- POI 的旧版本支持二进制文件格式,如 doc、xls、ppt 等。从 3.5 版本开始,POI 支持 MS-Office 的 OOXML 文件格式,如 docx、xlsx、pptx 等。

与 Apache POI 一样,各个供应商还提供其他库用于生成 Excel 文件。其中包括 Aspose 的 Aspose cells for Java、Commons Libraries 的 JXL 和 Team Dev 的 JExcel。

Apache POI - Java Excel API

本章将带您了解 Java Excel API 的一些风格及其特性。有很多供应商提供Java Excel相关的API;本章将讨论其中一些问题。

用于 Java 的 Aspose Cell

Aspose Cells for Java 是由供应商 Aspose 开发和分发的纯许可 Java Excel API。该 API 的最新版本是 8.1.2,于 2014 年 7 月发布。它是一个丰富而重型的 API(普通 Java 类和 AWT 类的组合),用于设计可以读取、写入和操作电子表格的 Excel 组件。

该 API 的常见用途如下:

  • Excel报告,构建动态Excel报告
  • 高保真 Excel 渲染和打印
  • 从 Excel 电子表格导入和导出数据
  • 生成、编辑和转换电子表格

江西林

JXL 是专为 Selenium 设计的第三方框架,支持 Web 浏览器上的数据驱动自动化(Web 浏览器上的数据自动更新)。然而,它也被用作 JExcel API 的通用支持库,因为它具有创建、读取和写入电子表格的基本功能。

基本特征如下 -

  • 生成 Excel 文件
  • 从工作簿和电子表格导入数据
  • 获取总行数和总列数

- JXL 仅支持 .xls 文件格式,无法处理大数据量。

杰赛尔

JExcel 是由 Team Dev 提供的纯许可 API。使用它,程序员可以轻松地读取、写入、显示和修改.xls.xlsx格式的 Excel 工作簿。该 API 可以轻松嵌入 Java Swing 和 AWT。该 API 的最新版本是 Jexcel-2.6.12,于 2009 年发布。

主要特点如下:

  • 自动化 Excel 应用程序、工作簿、电子表格等
  • 将工作簿作为普通 Swing 组件嵌入到 Java Swing 应用程序中
  • 将事件侦听器添加到工作簿和电子表格
  • 添加事件处理程序以处理工作簿和电子表格事件的Behave
  • 添加本机对等点以开发自定义功能

Apache POI - 环境

本章将带您完成在基于 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 -版本

java 版本“11.0.11”2021-04-20 LTS

Java(TM) SE 运行时环境 18.9(内部版本 11.0.11+9-LTS-194)

Java HotSpot(TM) 64 位服务器 VM 18.9(内部版本 11.0.11+9-LTS-194,混合模式)

Linux

打开命令终端并输入 -

$java-版本

java 版本“11.0.11”2021-04-20 LTS

打开JDK运行时环境18.9(内部版本11.0.11+9-LTS-194)

打开JDK 64位服务器VM(内部版本11.0.11+9-LTS-194,混合模式)

第 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:$JAVA_HOME/bin/

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

第 3 步 - 安装 Apache POI 库

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

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

先生。 平台及描述
1

Windows

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

类路径 -

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/oox​​ml-lib/commons-compress-1.21.tar:

/usr/share/poi-bin-5.1.0/oox​​ml-lib/commons-logging-1.2.tar:

/usr/share/poi-bin-5.1.0/oox​​ml-lib/curvesapi-1.06.tar:

/usr/share/poi-bin-5.1.0/oox​​ml-lib/slf4j-api-1.7.32.tar:

/usr/share/poi-bin-5.1.0/oox​​ml-lib/xmlbeans-5.0.2.tar:

Apache POI - 核心类

本章介绍了 Apache POI API 下的一些类和方法,它们对于使用 Java 程序处理 Excel 文件至关重要。

练习册

这是创建或维护 Excel 工作簿的所有类的超级接口。它属于org.apache.poi.ss.usermodel包。实现此接口的两个类如下 -

  • HSSFWorkbook - 此类具有读取和写入 .xls 格式的 Microsoft Excel 文件的方法。它与 MS-Office 版本 97-2003 兼容。

  • XSSFWorkbook - 此类具有读取和写入 .xls 或 .xlsx 格式的 Microsoft Excel 和 OpenOffice xml 文件的方法。它与 MS-Office 2007 或更高版本兼容。

HSSF工作簿

它是org.apache.poi.hssf.usermodel包下的高级类。它实现了Workbook接口,用于 .xls 格式的 Excel 文件。下面列出了该类下的一些方法和构造函数。

类构造函数

先生。 构造函数及描述
1

HSSF工作簿()

从头开始创建一个新的 HSSFWorkbook 对象。

2

HSSFWorkbook(DirectoryNode目录,布尔值preserveNodes)

在特定目录中创建新的 HSSFWworkbook 对象。

3

HSSFWorkbook(DirectoryNode目录,POIFSFileSystem fs,布尔值preserveNodes)

给定一个 POIFSFileSystem 对象和其中的特定目录,它会创建一个 SSFWorkbook 对象来读取指定的工作簿。

4

HSSFWorkbook(java.io.InputStream s)

使用输入流创建新的 HSSFWorkbook 对象。

5

HSSFWorkbook(java.io.InputStream s,布尔保留节点)

围绕输入流构建 POI 文件系统。

6

HSSFWorkbook(POIFSFileSystem fs)

使用 POIFSFileSystem 对象构造一个新的 HSSFWorkbook 对象。

7

HSSFWorkbook(POIFSFileSystem fs,布尔保留节点)

给定一个 POIFSFileSystem 对象,它会创建一个新的 HSSFWorkbook 对象来读取指定的工作簿。

这些构造函数中常用的参数是 -

  • 目录- 这是要处理的 POI 文件系统目录。

  • fs - 它是包含工作簿流的​​ POI 文件系统。

  • keepnodes - 这是一个可选参数,决定是否保留其他节点(例如宏)。它消耗大量内存,因为它将所有 POIFileSystem 存储在内存中(如果设置)。

注意- HSSFWorkbook 类包含许多方法;但是它们仅与 xls 格式兼容。在本教程中,重点是最新版本的 Excel 文件格式。因此,这里不列出HSSFWorkbook的类方法。如果您需要这些类方法,请参阅https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html 上的 POI-HSSFWorkbook 类 API。

XSSF工作簿

它是一个用于表示高级和低级 Excel 文件格式的类。它属于org.apache.xssf.usemodel包并实现了Workbook接口。下面列出了该类下的方法和构造函数。

类构造函数

先生。 构造函数及描述
1

XSSF工作簿()

从头开始创建一个新的 XSSFworkbook 对象。

2

XSSFWorkbook(java.io.File 文件)

从给定文件构造 XSSFWorkbook 对象。

3

XSSFWorkbook(java.io.InputStream 是)

通过将整个输入流缓冲到内存中然后为其打开 OPCPackage 对象来构造 XSSFWorkbook 对象。

4

XSSFWorkbook(java.lang.String路径)

在给定文件的完整路径的情况下构造一个 XSSFWorkbook 对象。

类方法

先生。 方法及说明
1

创建表()

为此工作簿创建一个 XSSFSheet,将其添加到工作表中,并返回高级表示。

2

createSheet(java.lang.String 工作表名称)

为此工作簿创建一个新工作表并返回高级表示。

3

创建字体()

创建新字体并将其添加到工作簿的字体表中。

4

创建单元格样式()

创建新的 XSSFCellStyle 并将其添加到工作簿的样式表中。

5

创建字体()

创建新字体并将其添加到工作簿的字体表中。

6

setPrintArea(intsheetIndex,intstartColumn,intendColumn,intstartRow,intendRow)

根据指定参数设置给定纸张的打印区域。

对于此类的其余方法,请参阅完整的 API 文档:https: //poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html。获取方法的完整列表。

床单

Sheet 是org.apache.poi.ss.usermodel包下的一个接口,它是所有创建具有特定名称的高级或低级电子表格的类的超级接口。最常见的电子表格类型是工作表,它表示为单元格网格。

HSSF表

这是org.apache.poi.hssf.usermodel包下的一个类。它可以创建 Excel 电子表格,并允许设置工作表样式和工作表数据的格式。

类构造函数

先生。 构造函数及描述
1

HSSFSheet(HSSFWorkbook工作簿)

创建由 HSSFWorkbook 调用的新 HSSFSheet 以从头开始创建工作表。

2

HSSFSheet(HSSFWorkbook工作簿、InternalSheet工作表)

创建一个表示给定工作表对象的 HSSFSheet。

XSSF表

这是一个代表 Excel 电子表格高级表示的类。它位于org.apache.poi.hssf.usermodel包下。

类构造函数

先生。 构造函数及描述
1

XSSFSheet()

创建新的 XSSFSheet - 由 XSSFWorkbook 调用以从头开始创建工作表。

2

XSSFSheet(PackagePart 部分, PackageRelationship rel)

创建一个表示给定包部分和关系的 XSSFSheet。

类方法

先生。 方法及说明
1

addMergedRegion(CellRangeAddress 区域)

添加单元格的合并区域(因此这些单元格形成一个)。

2

autoSizeColumn(int 列)

调整列宽以适合内容。

3

迭代器()

该方法是 rowIterator() 的别名,用于允许 foreach 循环

4

addHyperlink(XSSFHyperlink 超链接)

在此工作表上的超链接集合中注册超链接

对于此类的其余方法,请参阅完整的 API:https: //poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html。

这是org.apache.poi.ss.usermodel包下的接口。它用于电子表格行的高级表示。它是表示 POI 库中的行的所有类的超级接口。

XSSFR行

这是org.apache.poi.xssf.usermodel包下的一个类。它实现了 Row 接口,因此它可以在电子表格中创建行。下面列出了该类下的方法和构造函数。

类方法

先生。 方法及说明
1

创建单元格(int 列索引)

在行中创建新单元格并返回它。

2

setHeight(短高度)

以短单位设置高度。

对于此类的其余方法,请按照给定的链接https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html

细胞

这是org.apache.poi.ss.usermodel包下的接口。它是表示电子表格行中的单元格的所有类的超级接口。

单元格可以采用各种属性,例如空白、数字、日期、错误等。单元格在添加到行之前应该有自己的数字(从 0 开始)。

XSSF细胞

这是org.apache.poi.xssf.usermodel包下的一个类。它实现了 Cell 接口。它是电子表格行中单元格的高级表示。

类方法

先生。 方法及说明
1

setCellStyle(CellStyle样式)

设置单元格的样式。

2

setCellType(int 单元格类型)

设置单元格的类型(数字、公式或字符串)。

3

setCellValue(布尔值)

设置单元格的布尔值。

4

setCellValue(java.util.日历值)

设置单元格的日期值。

5

setCellValue(双精度值)

设置单元格的数值。

6

setCellValue(java.lang.String str)

设置单元格的字符串值。

7

setHyperlink(Hyperlink 超链接)

分配一个超链接到该单元格。

对于此类的其余方法和字段,请访问以下链接 - https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html

XSSF单元格样式

这是org.apache.poi.xssf.usermodel包下的一个类。它将提供有关电子表格单元格中内容格式的可能信息。它还提供了修改该格式的选项。它实现了 CellStyle 接口。

类构造函数

先生。 构造函数及描述
1

XSSFCellStyle(int cellXfId, int cellStyleXfId, StylesTable stylesSource, ThemesTable 主题)

从提供的部件创建单元格样式

2

XSSFCellStyle(StylesTable stylesSource)

创建一个空单元格样式

类方法

先生编号 方法及说明
1

setAlignment(短对齐)

设置单元格的水平对齐类型

2

setBorderBottom(短边框)

设置单元格下边框的边框类型

3

setBorderColor(XSSFCellBorder.BorderSide 边,XSSFColor 颜色)

设置选定边框的颜色

4

setBorderLeft(短边框)

设置单元格左边框的边框类型

5

setBorderRight(短边框)

设置单元格右边框的边框类型

6

setBorderTop(短边框)

设置单元格上边框的边框类型

7

setFillBackgroundColor(XSSFColor 颜色)

设置以 XSSFColor 值表示的背景填充颜色。

8

setFillForegroundColor(XSSFColor 颜色)

设置表示为 XSSFColor 值的前景填充颜色。

9

setFillPattern(短 fp)

指定图案和纯色单元格填充的单元格填充信息。

10

setFont(字体font)

设置此样式的字体。

11

setRotation(短旋转)

设置单元格中文本的旋转程度。

12

setVerticalAlignment(短对齐)

设置单元格的垂直对齐方式。

对于此类中的其余方法和字段,请访问以下链接 - https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCellStyle.html

HSSF颜色

这是org.apache.poi.hssf.util包下的一个类。它提供不同的颜色作为嵌套类。通常这些嵌套类使用它们自己的索引来表示。它实现了 Color 接口。

嵌套类

该类的所有嵌套类都是静态的,并且每个类都有其索引。这些嵌套颜色类用于单元格格式设置,例如单元格内容、边框、前景和背景。下面列出了一些嵌套类。

先生。 类别名称(颜色)
1 HSSFColor.AQUA
2 HSSF彩色.自动
3 HSSF颜色.黑色
4 HSSF颜色.蓝色
5 HSSFColor.BRIGHT_GREEN
6 HSSFColor.BRIGHT_GRAY
7 HSSF彩色.珊瑚色
8 HSSFColor.DARK_BLUE
9 HSSFColor.DARK_GREEN
10 HSSFColor.SKY_BLUE
11 HSSF颜色.白色
12 HSSF颜色.黄色

类方法

该类中只有一个方法很重要,即用于获取索引值。

先生。 方法及说明
1

获取索引()

该方法用于获取嵌套类的索引值。

对于其余的方法和嵌套类,请参阅以下链接 - https://poi.apache.org/apidocs/org/apache/poi/hssf/util/HSSFColor.html

XSSF颜色

这是org.apache.poi.xssf.usermodel包下的一个类。它用于表示电子表格中的颜色。它实现了 Color 接口。下面列出了它的一些方法和构造函数。

类构造函数

先生。 构造函数及描述
1

XSSFColor()

创建 XSSFColor 的新实例。

2

XSSFColor(字节[] rgb)

使用 RGB 创建 XSSFColor 的新实例。

3

XSSFColor(java.awt.Color clr)

使用 awt 包中的 Color 类创建 XSSFColor 的新实例。

类方法

先生。 方法及说明
1

setAuto(布尔自动)

设置一个布尔值以指示 ctColor 是自动的并且系统 ctColor 是相关的。

2

setIndexed(int 索引)

将索引 ctColor 值设置为系统 ctColor。

对于其余方法,请访问以下链接 - https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFColor.html

XSSFF字体

这是org.apache.poi.xssf.usermodel包下的一个类。它实现了 Font 接口,因此可以处理工作簿中的不同字体。

类构造函数

先生。 构造函数及描述
1

XSSFFont()

创建一个新的 XSSFont 实例。

类方法

先生。 方法及说明
1

setBold(布尔粗体)

为“粗体”属性设置布尔值。

2

setColor(短颜色)

设置字体的索引颜色。

3

setColor(XSSFColor 颜色)

以标准 Alpha RGB 颜色值设置字体颜色。

4

setFontHeight(短高度)

设置字体高度(以磅为单位)。

5

setFontName(java.lang.String 名称)

设置字体的名称。

6

setItalic(布尔斜体)

为“斜体”属性设置布尔值。

对于其余方法,请访问以下链接 - https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFFont.html

XSSF超链接

这是org.apache.poi.xssf.usermodel包下的一个类。它实现了超链接接口。它用于设置电子表格单元格内容的超链接。

类方法

先生。 方法及说明
1

setAddress(java.lang.String 地址)

超链接地址。

对于其余方法,请访问以下链接 - https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFHyperlink.html

XSSF创建助手

这是org.apache.poi.xssf.usermodel包下的一个类。它实现了 CreationHelper 接口。它用作公式评估和设置超链接的支持类。

类方法

先生。 方法及说明
1

创建公式评估器()

创建 XSSFFormulaEvaluator 实例,即计算公式单元格的对象。

2

创建超链接(int类型)

创建新的 XSSFHyperlink。

对于其余方法,请参阅以下链接 - https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCreationHelper.html

XSSF打印设置

这是org.apache.poi.xsssf.usermodel包下的类。它实现了PrintSetup接口。它用于设置打印页面尺寸、区域、选项和设置。

类方法

先生。 方法及说明
1

setLandscape(布尔值 ls)

设置一个布尔值以允许或阻止横向打印。

2

setLeftToRight(布尔值)

设置打印时是从左到右还是从上到下排序。

3

setPaperSize(短尺寸)

设置纸张尺寸。

对于其余方法,请访问以下链接 - https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFPrintSetup.html

Apache POI - 工作簿

这里的术语“工作簿”是指 Microsoft Excel 文件。完成本章后,您将能够使用 Java 程序创建新的工作簿并打开现有的工作簿。

创建空白工作簿

以下简单程序用于创建空白的 Microsoft Excel 工作簿。

import java.io.*;
import org.apache.poi.xssf.usermodel.*;

public class CreateWorkBook {
   public static void main(String[] args)throws Exception {
      //Create Blank workbook
      XSSFWorkbook workbook = new XSSFWorkbook(); 

      //Create file system using specific name
      FileOutputStream out = new FileOutputStream(new File("createworkbook.xlsx"));

      //write operation workbook using file out object 
      workbook.write(out);
      out.close();
      System.out.println("createworkbook.xlsx written successfully");
   }
}

让我们将上面的 Java 代码保存为CreateWorkBook.java,然后从命令提示符编译并执行它,如下所示 -

$javac CreateWorkBook.java
$java CreateWorkBook

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

createworkbook.xlsx written successfully

打开现有工作簿

使用以下代码打开现有工作簿。

import java.io.*;
import org.apache.poi.xssf.usermodel.*;

public class OpenWorkBook {
   public static void main(String args[])throws Exception { 
	   try {
         File file = new File("openworkbook.xlsx");
         FileInputStream fIP = new FileInputStream(file);

         //Get the workbook instance for XLSX file 
         XSSFWorkbook workbook = new XSSFWorkbook(fIP);

         if(file.isFile() && file.exists()) {
            System.out.println("openworkbook.xlsx file open successfully.");
         } else {
            System.out.println("Error to open openworkbook.xlsx file.");
         }
      } catch(Exception e) {
         System.out.println("Error to open openworkbook.xlsx file." + e.getMessage());
      }
   }
}

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

$javac OpenWorkBook.java
$java OpenWorkBook

它将编译并执行以生成以下输出。

openworkbook.xlsx file open successfully.

打开工作簿后,可以对其进行读写操作。

Apache POI - 电子表格

本章介绍如何使用 Java 创建电子表格并对其进行操作。电子表格是 Excel 文件中的一个页面;它包含具有特定名称的行和列。

完成本章后,您将能够创建电子表格并对其执行读取操作。

创建电子表格

首先,让我们使用前面章节中讨论的引用类创建一个电子表格。按照上一章的方法,先创建一个工作簿,然后我们可以继续创建一个工作表。

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

//Create Blank workbook
XSSFWorkbook workbook = new XSSFWorkbook();

//Create a blank spreadsheet
XSSFSheet spreadsheet = workbook.createSheet("Sheet Name");

电子表格上的行

电子表格具有网格布局。行和列用特定名称标识。列用字母标识,行用数字标识。

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

XSSFRow row = spreadsheet.createRow((short)1);

写入电子表格

让我们考虑一个员工数据的例子。这里,员工数据以表格形式给出。

员工 ID 员工姓名 指定
TP01 戈帕尔 技术经理
TP02 马尼沙 校对读者
TP03 马斯坦 技术文件撰稿人
TP04 萨蒂什 技术文件撰稿人
TP05 克里希纳 技术文件撰稿人

以下代码用于将上述数据写入电子表格中。

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Writesheet {
   public static void main(String[] args) throws Exception {
      //Create blank workbook
      XSSFWorkbook workbook = new XSSFWorkbook(); 

      //Create a blank sheet
      XSSFSheet spreadsheet = workbook.createSheet(" Employee Info ");

      //Create row object
      XSSFRow row;

      //This data needs to be written (Object[])
      Map < String, Object[] > empinfo = new TreeMap < String, Object[] >();
      empinfo.put( "1", new Object[] { "EMP ID", "EMP NAME", "DESIGNATION" });
      empinfo.put( "2", new Object[] { "tp01", "Gopal", "Technical Manager" });
      empinfo.put( "3", new Object[] { "tp02", "Manisha", "Proof Reader" });
      empinfo.put( "4", new Object[] { "tp03", "Masthan", "Technical Writer" });
      empinfo.put( "5", new Object[] { "tp04", "Satish", "Technical Writer" });
      empinfo.put( "6", new Object[] { "tp05", "Krishna", "Technical Writer" });
      
      //Iterate over data and write to sheet
      Set < String > keyid = empinfo.keySet();
      int rowid = 0;

      for (String key : keyid) {
         row = spreadsheet.createRow(rowid++);
         Object [] objectArr = empinfo.get(key);
         int cellid = 0;

         for (Object obj : objectArr) {
            Cell cell = row.createCell(cellid++);
            cell.setCellValue((String)obj);
         }
      }
      //Write the workbook in file system
      FileOutputStream out = new FileOutputStream(new File("Writesheet.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("Writesheet.xlsx written successfully");
   }
}

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

$javac Writesheet.java
$java Writesheet

它将编译并执行以在当前目录中生成名为Writesheet.xlsx的 Excel 文件,并且您将在命令提示符中获得以下输出。

Writesheet.xlsx written successfully

Writesheet.xlsx文件如下所示-

书写表

从电子表格中读取

让我们将上面名为Writesheet.xslx的 Excel 文件视为输入。遵守以下代码;它用于从电子表格中读取数据。

import java.io.File;
import java.io.FileInputStream;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Readsheet {
   static XSSFRow row;
   public static void main(String[] args) throws Exception {
      FileInputStream fis = new FileInputStream(new File("WriteSheet.xlsx"));
      XSSFWorkbook workbook = new XSSFWorkbook(fis);
      XSSFSheet spreadsheet = workbook.getSheetAt(0);
      Iterator < Row >  rowIterator = spreadsheet.iterator();
      
      while (rowIterator.hasNext()) {
         row = (XSSFRow) rowIterator.next();
         Iterator < Cell >  cellIterator = row.cellIterator();
         
         while ( cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            
            switch (cell.getCellType()) {
               case NUMERIC:
                  System.out.print(cell.getNumericCellValue() + " \t\t ");
                  break;
               
               case STRING:
                  System.out.print(
                  cell.getStringCellValue() + " \t\t ");
                  break;
            }
         }
         System.out.println();
      }
      fis.close();
   }
}

让我们将上述代码保留在Readsheet.java文件中,然后从命令提示符编译并运行它,如下所示 -

$javac Readsheet.java
$java Readsheet

如果您的系统环境配置了 POI 库,它将编译并执行以在命令提示符中生成以下输出。

EMP ID   EMP NAME       DESIGNATION 
 tp01     Gopal       Technical Manager 
 tp02     Manisha     Proof Reader 
 tp03     Masthan     Technical Writer 
 tp04     Satish      Technical Writer 
 tp05     Krishna     Technical Writer

Apache POI - 细胞

您输入到电子表格中的任何数据始终存储在单元格中。我们使用行和列的标签来识别单元格。本章介绍如何使用 Java 编程来操作电子表格单元格中的数据。

创建一个单元格

您需要在创建单元格之前创建一行。行只不过是单元格的集合。

以下代码片段用于创建单元格。

//create new workbook
XSSFWorkbook workbook = new XSSFWorkbook(); 

//create spreadsheet with a name
XSSFSheet spreadsheet = workbook.createSheet("new sheet");

//create first row on a created spreadsheet
XSSFRow row = spreadsheet.createRow(0);

//create first cell on created row
XSSFCell cell = row.createCell(0);

细胞类型

单元格类型指定单元格是否可以包含字符串、数值或公式。字符串单元格不能保存数字值,数字单元格也不能保存字符串。

以下代码用于在电子表格中创建不同类型的单元格。

import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TypesofCells {
   public static void main(String[] args)throws Exception {
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet spreadsheet = workbook.createSheet("cell types");
      
      XSSFRow row = spreadsheet.createRow((short) 2);
      row.createCell(0).setCellValue("Type of Cell");
      row.createCell(1).setCellValue("cell value");
      
      row = spreadsheet.createRow((short) 3);
      row.createCell(0).setCellValue("set cell type BLANK");
      row.createCell(1);
      
      row = spreadsheet.createRow((short) 4);
      row.createCell(0).setCellValue("set cell type BOOLEAN");
      row.createCell(1).setCellValue(true);
      
      row = spreadsheet.createRow((short) 5);
      row.createCell(0).setCellValue("set cell type date");
      row.createCell(1).setCellValue(new Date());
      
      row = spreadsheet.createRow((short) 6);
      row.createCell(0).setCellValue("set cell type numeric");
      row.createCell(1).setCellValue(20 );
      
      row = spreadsheet.createRow((short) 7);
      row.createCell(0).setCellValue("set cell type string");
      row.createCell(1).setCellValue("A String");
      
      FileOutputStream out = new FileOutputStream(new File("typesofcells.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("typesofcells.xlsx written successfully");
   }
}

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

$javac TypesofCells.java
$java TypesofCells

如果您的系统配置了 POI 库,那么它将编译并执行以在当前目录中生成名为typesofcells.xlsx的 Excel 文件,并显示以下输出。

typesofcells.xlsx written successfully

typesofcells.xlsx文件如下所示 -

细胞类型

单元样式

在这里,您可以学习如何设置单元格格式并应用不同的样式,例如合并相邻单元格、添加边框、设置单元格对齐方式和填充颜色。

以下代码用于使用 Java 编程将不同的样式应用于单元格。

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

import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Color;
import org.apache.poi.ss.usermodel.FillPatternType;

public class CellStyle {
   public static void main(String[] args)throws Exception {
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet spreadsheet = workbook.createSheet("cellstyle");
      XSSFRow row = spreadsheet.createRow((short) 1);
      row.setHeight((short) 800);
      XSSFCell cell = (XSSFCell) row.createCell((short) 1);
      cell.setCellValue("test of merging");

      //MEARGING CELLS 
      //this statement for merging cells

      spreadsheet.addMergedRegion(
         new CellRangeAddress(
            1, //first row (0-based)
            1, //last row (0-based)
            1, //first column (0-based)
            4 //last column (0-based)
         )
      );
      
      //CELL Alignment
      row = spreadsheet.createRow(5); 
      cell = (XSSFCell) row.createCell(0);
      row.setHeight((short) 800);
      
      // Top Left alignment 
      XSSFCellStyle style1 = workbook.createCellStyle();
      spreadsheet.setColumnWidth(0, 8000);
      style1.setAlignment(HorizontalAlignment.LEFT);
      style1.setVerticalAlignment(VerticalAlignment.TOP);
      cell.setCellValue("Top Left");
      cell.setCellStyle(style1);
      row = spreadsheet.createRow(6); 
      cell = (XSSFCell) row.createCell(1);
      row.setHeight((short) 800);
      
      // Center Align Cell Contents 
      XSSFCellStyle style2 = workbook.createCellStyle();
      style2.setAlignment(HorizontalAlignment.CENTER);
      style2.setVerticalAlignment(VerticalAlignment.CENTER);
      cell.setCellValue("Center Aligned"); 
      cell.setCellStyle(style2);
      row = spreadsheet.createRow(7); 
      cell = (XSSFCell) row.createCell(2);
      row.setHeight((short) 800);
      
      // Bottom Right alignment 
      XSSFCellStyle style3 = workbook.createCellStyle();
      style3.setAlignment(HorizontalAlignment.RIGHT);
      style3.setVerticalAlignment(VerticalAlignment.BOTTOM);
      cell.setCellValue("Bottom Right");
      cell.setCellStyle(style3);
      row = spreadsheet.createRow(8);
      cell = (XSSFCell) row.createCell(3);
      
      // Justified Alignment 
      XSSFCellStyle style4 = workbook.createCellStyle();
      style4.setAlignment(HorizontalAlignment.JUSTIFY);
      style4.setVerticalAlignment(VerticalAlignment.JUSTIFY);
      cell.setCellValue("Contents are Justified in Alignment"); 
      cell.setCellStyle(style4);
      
      //CELL BORDER
      row = spreadsheet.createRow((short) 10);
      row.setHeight((short) 800);
      cell = (XSSFCell) row.createCell((short) 1);
      cell.setCellValue("BORDER");
      
      XSSFCellStyle style5 = workbook.createCellStyle();
      style5.setBorderBottom(BorderStyle.THICK);
      style5.setBottomBorderColor(IndexedColors.BLUE.getIndex());
      style5.setBorderLeft(BorderStyle.DOUBLE);
      style5.setLeftBorderColor(IndexedColors.GREEN.getIndex());
      style5.setBorderRight(BorderStyle.HAIR);
      style5.setRightBorderColor(IndexedColors.RED.getIndex());
      style5.setBorderTop(BorderStyle.DOTTED);
      style5.setTopBorderColor(IndexedColors.CORAL.getIndex());
      cell.setCellStyle(style5);
      
      //Fill Colors
      //background color
      row = spreadsheet.createRow((short) 10 );
      cell = (XSSFCell) row.createCell((short) 1);
      
      XSSFCellStyle style6 = workbook.createCellStyle();
      style6.setFillBackgroundColor(IndexedColors.LIME.index);
      style6.setFillPattern(FillPatternType.LESS_DOTS);
      style6.setAlignment(HorizontalAlignment.FILL);
      spreadsheet.setColumnWidth(1,8000);
      cell.setCellValue("FILL BACKGROUNG/FILL PATTERN");
      cell.setCellStyle(style6);
      
      //Foreground color
      row = spreadsheet.createRow((short) 12);
      cell = (XSSFCell) row.createCell((short) 1);
      
      XSSFCellStyle style7 = workbook.createCellStyle();
      style7.setFillForegroundColor(IndexedColors.BLUE.index);
      style7.setFillPattern( FillPatternType.LESS_DOTS);
      style7.setAlignment(HorizontalAlignment.FILL);
      cell.setCellValue("FILL FOREGROUND/FILL PATTERN");
      cell.setCellStyle(style7);

      FileOutputStream out = new FileOutputStream(new File("cellstyle.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("cellstyle.xlsx written successfully");
   }
}

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

$javac CellStyle.java
$java CellStyle

它将在当前目录中生成一个名为cellstyle.xlsx的 Excel 文件并显示以下输出。

cellstyle.xlsx written successfully

Apache POI - 字体

本章介绍如何在 Excel 电子表格中设置不同的字体、应用样式以及以不同方向角度显示文本。

每个系统都捆绑了大量的字体集合,例如 Arial、Impact、Times New Roman 等。如果需要,该集合还可以使用新字体进行更新。同样,字体可以有多种显示样式,例如粗体、斜体、下划线、删除线等。

字体和字体样式

以下代码用于将特定字体和样式应用于单元格的内容。

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.hssf.util.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class FontStyle {
   public static void main(String[] args)throws Exception {
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet spreadsheet = workbook.createSheet("Fontstyle");
      XSSFRow row = spreadsheet.createRow(2);

      //Create a new font and alter it.
      XSSFFont font = workbook.createFont();
      font.setFontHeightInPoints((short) 30);
      font.setFontName("IMPACT");
      font.setItalic(true);
      font.setColor(IndexedColors.BRIGHT_GREEN.index);

      //Set font into style
      XSSFCellStyle style = workbook.createCellStyle();
      style.setFont(font);

      // Create a cell with a value and set style to it.
      XSSFCell cell = row.createCell(1);
      cell.setCellValue("Font Style");
      cell.setCellStyle(style);
      
      FileOutputStream out = new FileOutputStream(new File("fontstyle.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("fontstyle.xlsx written successfully");
   }
}

让我们将上面的代码保存在名为FontStyle.java的文件中。从命令提示符编译并执行它,如下所示 -

$javac FontStyle.java
$java FontStyle

它会在当前目录中生成一个名为fontstyle.xlsx的 Excel 文件,并在命令提示符下显示以下输出。

fontstyle.xlsx written successfully

fontstyle.xlsx文件如下所示 -

字体样式

文字方向

在这里您可以学习如何设置不同角度的文本方向。通常单元格内容是水平显示的,从左到右,00°角;但是,如果需要,您可以使用以下代码来旋转文本方向。

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

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class TextDirection {
   public static void main(String[] args)throws Exception {
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet spreadsheet = workbook.createSheet("Text direction");
      XSSFRow row = spreadsheet.createRow(2);
      XSSFCellStyle myStyle = workbook.createCellStyle();
      myStyle.setRotation((short) 0);
      XSSFCell cell = row.createCell(1);
      cell.setCellValue("0D angle");
      cell.setCellStyle(myStyle);

      //30 degrees
      myStyle = workbook.createCellStyle();
      myStyle.setRotation((short) 30);
      cell = row.createCell(3);
      cell.setCellValue("30D angle");
      cell.setCellStyle(myStyle);

      //90 degrees
      myStyle = workbook.createCellStyle();
      myStyle.setRotation((short) 90);
      cell = row.createCell(5);
      cell.setCellValue("90D angle");
      cell.setCellStyle(myStyle);

      //120 degrees
      myStyle = workbook.createCellStyle();
      myStyle.setRotation((short) 120);
      cell = row.createCell(7);
      cell.setCellValue("120D angle");
      cell.setCellStyle(myStyle);

      //270 degrees
      myStyle = workbook.createCellStyle();
      myStyle.setRotation((short) 270);
      cell = row.createCell(9);
      cell.setCellValue("270D angle");
      cell.setCellStyle(myStyle);

      //360 degrees
      myStyle = workbook.createCellStyle();
      myStyle.setRotation((short) 360);
      cell = row.createCell(12);
      cell.setCellValue("360D angle");
      cell.setCellStyle(myStyle);
      
      FileOutputStream out = new FileOutputStream(new File("textdirection.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("textdirection.xlsx written successfully");
   }
}

将上述代码保留在TextDirectin.java文件中,然后从命令提示符编译并执行它,如下所示 -

$javac TextDirection.java
$java TextDirection

它将编译并执行以在当前目录中生成名为textdirection.xlsx的 Excel 文件,并在命令提示符下显示以下输出。

textdirection.xlsx written successfully

textdirection.xlsx文件如下所示 -

文字方向

Apache POI - 公式

本章将带您完成使用 Java 编程在单元格上应用不同公式的过程。Excel 应用程序的基本目的是通过应用公式来维护数值数据。

在公式中,我们传递动态值或 Excel 工作表中值的位置。执行此公式后,您将获得所需的结果。下表列出了 Excel 中常用的一些基本公式。

手术 句法
添加多个数字 = SUM(Loc1:Locn)= SUM(n1,n2,)
数数 = COUNT(Loc1:Locn)= COUNT(n1,n2,)
两个数的幂 = POWER(Loc1,Loc2)= POWER(数字, 功率)
最大多个数字 = MAX(Loc1:Locn)= MAX(n1,n2,)
产品 = 乘积(Loc1:Locn)= 乘积(n1,n2,)
阶乘 = FACT(Locn)= FACT(数字)
绝对数 = ABS(Locn)= ABS(数字)
今天日期 =今天()
转换为小写 = LOWER(Locn)= LOWER(text)
平方根 = SQRT(locn)= SQRT(数字)

以下代码用于向单元格添加公式并执行它。

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Formula {
   public static void main(String[] args)throws Exception {
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet spreadsheet = workbook.createSheet("formula");
      XSSFRow row = spreadsheet.createRow(1);
      XSSFCell cell = row.createCell(1);
      
      cell.setCellValue("A = ");
      cell = row.createCell(2);
      cell.setCellValue(2);
      row = spreadsheet.createRow(2);
      cell = row.createCell(1);
      cell.setCellValue("B = ");
      cell = row.createCell(2);
      cell.setCellValue(4);
      row = spreadsheet.createRow(3);
      cell = row.createCell(1);
      cell.setCellValue("Total = ");
      cell = row.createCell(2);
      
      // Create SUM formula
      cell.setCellFormula("SUM(C2:C3)");
      cell = row.createCell(3);
      cell.setCellValue("SUM(C2:C3)");
      row = spreadsheet.createRow(4);
      cell = row.createCell(1);
      cell.setCellValue("POWER =");
      cell=row.createCell(2);
      
      // Create POWER formula
      cell.setCellFormula("POWER(C2,C3)");
      cell = row.createCell(3);
      cell.setCellValue("POWER(C2,C3)");
      row = spreadsheet.createRow(5);
      cell = row.createCell(1);
      cell.setCellValue("MAX = ");
      cell = row.createCell(2);
      
      // Create MAX formula
      cell.setCellFormula("MAX(C2,C3)");
      cell = row.createCell(3);
      cell.setCellValue("MAX(C2,C3)");
      row = spreadsheet.createRow(6);
      cell = row.createCell(1);
      cell.setCellValue("FACT = ");
      cell = row.createCell(2);
      
      // Create FACT formula
      cell.setCellFormula("FACT(C3)");
      cell = row.createCell(3);
      cell.setCellValue("FACT(C3)");
      row = spreadsheet.createRow(7);
      cell = row.createCell(1);
      cell.setCellValue("SQRT = ");
      cell = row.createCell(2);
      
      // Create SQRT formula
      cell.setCellFormula("SQRT(C5)");
      cell = row.createCell(3);
      cell.setCellValue("SQRT(C5)");
      workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();
      FileOutputStream out = new FileOutputStream(new File("formula.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("fromula.xlsx written successfully");
   }
}

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

$javac Formula.java
$java Formula

它将在当前目录中生成一个名为Formula.xlsx的 Excel 文件,并在命令提示符下显示以下输出。

fromula.xlsx written successfully

Formula.xlsx文件如下所示 -

公式

Apache POI - 超链接

本章介绍如何向单元格中的内容添加超链接。通常,超链接用于访问任何 Web URL、电子邮件或外部文件。

以下代码显示如何在单元格上创建超链接。

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

import org.apache.poi.common.usermodel.Hyperlink;
impor