Apache Poi 简明教程

Apache POI - Quick Guide

Apache POI - Overview

许多时候,一个软件应用程序需要生成 Microsoft Excel 文件格式的报告。有时,甚至希望一个应用程序接收 Excel 文件作为输入数据。例如,为公司财务部门开发的应用程序将需要以 Excel 形式输出所有输出。

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

What is Apache POI?

Apache POI 是一个流行的 API,它允许编程人员使用 Java 程序创建、修改和显示 MS Office 文件。这是一个由 Apache Software Foundation 开发和分发的开放源代码库,用于使用 Java 程序设计或修改 Microsoft 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 处理 Excel 文件的流程。因此,讨论仅限于 HSSF 和 XSSF 组件。

Note − 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 APIs

本章介绍了一些 Java Excel API 的演变及其功能。许多供应商提供了 Java Excel 相关的 API;本章中考虑了一些。

Aspose Cells for Java

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

此 API 的常见用途如下 −

  1. Excel 报告,构建动态 Excel 报告

  2. 高保真 Excel 渲染和打印

  3. 从 Excel 电子表格导入和导出数据

  4. 生成、编辑和转换电子表格

JXL

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

基本功能如下 −

  1. Generate Excel files

  2. 从工作簿和电子表格导入数据

  3. 获取总行数和总列数

Note − JXL 仅支持 .xls 文件格式,并且无法处理较大的数据量。

JExcel

JExcel 是 Team Dev 提供的一个纯粹许可的 API。通过使用此 API,程序员能轻松使用 .xls.xlsx 格式读取、编写、显示和修改 Excel 工作簿。此 API 能轻松与 Java Swing 和 AWT 嵌入。此 API 的最新版本是 2009 年发布的 Jexcel-2.6.12。

主要功能如下:

  1. 自动化 Excel 应用程序、工作簿、电子表格等

  2. 将工作簿作为普通 Swing 组件嵌入到 Java Swing 应用程序中

  3. 向工作簿和电子表格添加事件监听器

  4. 添加事件处理器来处理工作簿和电子表格事件的行为

  5. 添加本地对等点来开发自定义功能

Apache POI - Environment

本教程将指导你完成在 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,请从 https://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 - Core Classes

本章将讲解 Apache POI API 下的几个类和方法,它们对于使用 Java 程序处理 Excel 文件至关重要。

Workbook

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

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

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

HSSFWorkbook

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

Class Constructors

Sr.No.

Constructor & Description

1

HSSFWorkbook() 从头创建一个新的 HSSFWorkbook 对象。

2

HSSFWorkbook(DirectoryNode directory, boolean preserveNodes) 在特定目录内创建一个新的 HSSFWworkbook 对象。

3

HSSFWorkbook(DirectoryNode directory, POIFSFileSystem fs, boolean preserveNodes) 给定一个 POIFSFileSystem 对象及其内部的特定目录,它会创建一个 SSFWorkbook 对象来读取指定的工作簿。

4

HSSFWorkbook(java.io.InputStream s) 使用输入流创建一个新的 HSSFWorkbook 对象。

5

HSSFWorkbook(java.io.InputStream s, boolean preserveNodes) 在输入流周围构建一个 POI 文件系统。

6

HSSFWorkbook(POIFSFileSystem fs) 使用 POIFSFileSystem 对象构建一个新的 HSSFWorkbook 对象。

7

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

这些构造函数中经常使用的参数有 −

  1. directory − 要处理的 POI 文件系统目录。

  2. fs − 包含工作簿流的 POI 文件系统。

  3. preservenodes − 此参数是可选项,用于决定是否保留诸如宏等其他节点。如果已设置该参数,则它将占用大量内存,因为它将所有 POIFileSystem 都存储在内存中。

Note − HSSFWorkbook 类包含许多方法;但是,它们仅与 xls 格式兼容。在本教程中,重点在于最新版本的 Excel 文件格式。因此,此处未列出 HSSFWorkbook 的类方法。如果您需要这些类方法,那么可以在 https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html. 处参考 POI-HSSFWorkbook 类 API。

XSSFWorkbook

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

Class Constructors

Sr.No.

Constructor & Description

1

XSSFWorkbook() 创建一个新的空 XSSFworkbook 对象。

2

XSSFWorkbook(java.io.File file) 根据给定的文件构造一个 XSSFWorkbook 对象。

3

XSSFWorkbook(java.io.InputStream is) 缓存整个输入流到内存中,然后打开一个 OPCPackage 对象来构造一个 XSSFWorkbook 对象。

4

XSSFWorkbook(java.lang.String path) 根据文件的完整路径构造一个 XSSFWorkbook 对象。

Class Methods

Sr.No.

Method & Description

1

createSheet() 为此工作簿创建一个 XSSFSheet,将它添加到工作表中,并返回高级表示形式。

2

createSheet(java.lang.String sheetname) 为此工作簿创建一个新的工作表并返回高级表示形式。

3

createFont() 创建一个新字体并将其添加到工作簿的字体表中。

4

createCellStyle() 创建一个新的 XSSFCellStyle 并将其添加到工作簿的样式表中。

5

createFont() 创建一个新字体并将其添加到工作簿的字体表中。

6

setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow,int endRow) 根据指定的参数设置给定工作表的打印区域。

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

Sheet

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

HSSFSheet

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

Class Constructors

Sr.No.

Constructor & Description

1

HSSFSheet(HSSFWorkbook workbook) 创建 HSSFWorkbook 调用的新 HSSFSheet 从头开始创建工作表。

2

HSSFSheet(HSSFWorkbook workbook, InternalSheet sheet) 创建表示给定工作表对象的 HSSFSheet。

XSSFSheet

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

Class Constructors

Sr.No.

Constructor & Description

1

XSSFSheet() 创建新的 XSSFShet − 由 XSSFWorkbook 调用以从头开始创建工作表。

2

XSSFSheet(PackagePart part, PackageRelationship rel) 创建一个 XSSFSheet 并表示给定的包部分和关系。

Class Methods

Sr.No.

Method & Description

1

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

2

autoSizeColumn(int column) 调整列宽以适应内容。

3

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

4

addHyperlink(XSSFHyperlink hyperlink) 在此工作表的超链接集合中注册一个超链接

有关此类的其余方法,请参阅以下位置的完整 API − https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html.

Row

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

XSSFRow

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

Class Methods

Sr.No.

Method & Description

1

createCell(int columnIndex) 在行内创建新单元格并返回它。

2

setHeight(short height) 短单位设置高度。

有关此类的其余方法,请遵循给定的链接 https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html

Cell

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

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

XSSFCell

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

Class Methods

Sr.No.

Method & Description

1

setCellStyle(CellStyle style) 设置单元格样式。

2

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

3

setCellValue(boolean value) 为单元格设置一个布尔值。

4

setCellValue(java.util.Calendar value) 设置单元格的日期值。

5

setCellValue(double value) 设置单元格的数字值。

6

setCellValue(java.lang.String str) 设置单元格的字符串值。

7

setHyperlink(Hyperlink hyperlink) 为该单元格分配超链接。

有关此类的剩余方法和字段,请访问以下链接 − https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html

XSSFCellStyle

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

Class Constructors

Sr.No.

Constructor & Description

1

XSSFCellStyle(int cellXfId, int cellStyleXfId, StylesTable stylesSource, ThemesTable theme) 从提供的部件创建单元格样式

2

XSSFCellStyle(StylesTable stylesSource) 创建一个空的单元格样式

Class Methods

Sr.No

Method & Description

1

setAlignment(short align) 设置单元格的水平对齐类型

2

setBorderBottom(short border) 设置单元格底边框的边框类型

3

setBorderColor(XSSFCellBorder.BorderSide side, XSSFColor color) 设置所选边框的颜色

4

setBorderLeft(Short border) 设置单元格左边框的边框类型

5

setBorderRight(short border) 设置单元格右边框的边框类型

6

setBorderTop(short border) 设置单元格上边框的边框类型

7

setFillBackgroundColor(XSSFColor color) 设置以 XSSFColor 值表示的背景填充色。

8

setFillForegroundColor(XSSFColor color) 设置以 XSSFColor 值表示的前景填充色。

9

setFillPattern(short fp) 指定图案和纯色单元格填充的单元格填充信息。

10

setFont(Font font) 设置此样式的字体。

11

setRotation(short rotation) 设置单元格中文本的旋转角度。

12

setVerticalAlignment(short align) 设置单元格的垂直对齐类型。

有关此类中的剩余方法和字段,请通过以下链接查找 − https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCellStyle.html

HSSFColor

这是一个属于 org.apache.poi.hssf.util 包的类。它以嵌套类的形式提供不同的颜色。通常,用它们自己的索引来表示这些嵌套类。它实现了颜色接口。

Nested classes

此类中的所有嵌套类均为静态类,且每个类都有自己的索引。这些嵌套颜色类用于单元格格式设置,例如单元格内容、边框、前景色和背景色。如下列出的几个嵌套类。

Sr.No.

Class names (colors)

1

HSSFColor.AQUA

2

HSSFColor.AUTOMATIC

3

HSSFColor.BLACK

4

HSSFColor.BLUE

5

HSSFColor.BRIGHT_GREEN

6

HSSFColor.BRIGHT_GRAY

7

HSSFColor.CORAL

8

HSSFColor.DARK_BLUE

9

HSSFColor.DARK_GREEN

10

HSSFColor.SKY_BLUE

11

HSSFColor.WHITE

12

HSSFColor.YELLOW

Class Methods

此类中只有一个方法非常重要,用于获取索引值。

Sr.No.

Method & Description

1

getIndex() 此方法用于获取嵌套类的索引值。

有关剩余方法和嵌套类,请参考以下链接 − https://poi.apache.org/apidocs/org/apache/poi/hssf/util/HSSFColor.html

XSSFColor

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

Class Constructors

Sr.No.

Constructor & Description

1

XSSFColor() 创建一个新的 XSSFColor 实例。

2

XSSFColor(byte[] rgb) 使用 RGB 创建一个新的 XSSFColor 实例。

3

XSSFColor(java.awt.Color clr) 使用 awt 包中的颜色类创建一个新的 XSSFColor 实例。

Class Methods

Sr.No.

Method & Description

1

setAuto(boolean auto) 设置一个布尔值,以指示 ctColor 是自动的,且系统 ctColor 是依赖的。

2

setIndexed(int indexed) 将索引 ctColor 值设置为系统 ctColor。

XSSFFont

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

Class Constructor

Sr.No.

Constructor & Description

1

XSSFFont() 创建一个新的 XSSFont 实例。

Class Methods

Sr.No.

Method & Description

1

setBold(boolean bold) 设置“加粗”属性的布尔值。

2

setColor(short color) 设置字体的索引颜色。

3

setColor(XSSFColor color) 在标准 Alpha RGB 颜色值中设置字体的颜色。

4

setFontHeight(short height) 将字体高度设为磅数。

5

setFontName(java.lang.String name) 设置字体的名称。

6

setItalic(boolean italic) 设置“斜体”属性的布尔值。

对于其余方法,请通过以下链接进行 − https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFFont.html

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

Class Methods

Sr.No.

Method & Description

1

setAddress(java.lang.String address) Hyperlink address.

XSSFCreationHelper

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

Class Methods

Sr.No.

Method & Description

1

createFormulaEvaluator() 创建一个 XSSFFormulaEvaluator 实例,该对象评估公式单元格。

2

createHyperlink(int type) 创建一个新的 XSSFHyperlink。

XSSFPrintSetup

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

Class Methods

Sr.No.

Method & Description

1

setLandscape(boolean ls) 设置布尔值以允许或阻止横向打印。

2

setLeftToRight(boolean ltor) 设置打印时是按左到右还是按从上到下的顺序。

3

setPaperSize(short size) 设置纸张尺寸。

Apache POI - Workbooks

这里的术语“工作簿”意味着 Microsoft Excel 文件。完成本章后,您将可以用 Java 程序创建新工作簿并打开现有工作簿。

Create Blank Workbook

以下简单程序用于创建一个空白 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

Open Existing Workbook

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

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 - Spreadsheets

本章介绍了如何创建电子表格以及使用 Java 操纵它。电子表格是 Excel 文件中的一页;它包含具有特定名称的行和列。

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

Create a Spreadsheet

首先,我们使用前面章节中讨论的引用类创建电子表格。按照上一章节,首先创建一个工作簿,然后再创建一张工作表。

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

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

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

Rows on Spreadsheet

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

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

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

Write into a Spreadsheet

让我们考虑一个员工数据示例。此处,员工数据采用表格形式给出。

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

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

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

Read from a Spreadsheet

让我们将上述名为 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 - Cells

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

Create a Cell

创建单元格之前,您需要创建一行。行只不过是一组单元格。

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

//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);

Types of Cells

单元格类型指定单元格可以包含字符串、数值或公式。字符串单元格不能容纳数值,数值单元格不能容纳字符串。

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

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

typesofcells

Cell Styles

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

以下代码用于使用 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 - Fonts

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

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

Fonts and Font Styles

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

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

fontstyle

Text Direction

在这里,您可以了解如何在不同的角度设置文本方向。通常,单元格内容从左到右水平显示,角度为 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 文件如下所示−

textdirection

Apache POI - Formula

本章将引导您了解使用 Java 编程在单元格上应用不同的公式。Excel 应用程序的基本目的是通过在其上应用公式来维护数字数据。

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

Operation

Syntax

Adding multiple numbers

= SUM(Loc1:Locn) or = SUM(n1,n2,)

Count

= COUNT(Loc1:Locn) or = COUNT(n1,n2,)

Power of two numbers

= POWER(Loc1,Loc2) or = POWER(number, power)

Max of multiple numbers

= MAX(Loc1:Locn) or = MAX(n1,n2,)

Product

=PRODUCT(Loc1:Locn) or = PRODUCT(n1,n2,)

Factorial

= FACT(Locn) or = FACT(数字)

Absolute number

= ABS(Locn) or = ABS(数字)

Today date

=TODAY()

Converts lowercase

= LOWER(Locn) or = LOWER(文本)

Square root

= SQRT(locn) or = 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 文件如下: −

formula

本章解释了如何向单元格中的内容添加超链接。通常使用超链接来访问任意网页 URL、电子邮件或外部文件。

以下代码展示了如何创建单元格上的超链接。

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

import org.apache.poi.common.usermodel.Hyperlink;
import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.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.XSSFHyperlink;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class HyperlinkEX {
   public static void main(String[] args) throws Exception {
      XSSFWorkbook workbook = new XSSFWorkbook();
      XSSFSheet spreadsheet = workbook.createSheet("Hyperlinks");
      XSSFCell cell;
      CreationHelper createHelper = workbook.getCreationHelper();
      XSSFCellStyle hlinkstyle = workbook.createCellStyle();
      XSSFFont hlinkfont = workbook.createFont();
      hlinkfont.setUnderline(XSSFFont.U_SINGLE);
      hlinkfont.setColor(IndexedColors.BLUE.index);
      hlinkstyle.setFont(hlinkfont);

      //URL Link
      cell = spreadsheet.createRow(1).createCell((short) 1);
      cell.setCellValue("URL Link");
      XSSFHyperlink link = (XSSFHyperlink)createHelper.createHyperlink(HyperlinkType.URL);
      link.setAddress("https://www.tutorialspoint.com/");
      cell.setHyperlink((XSSFHyperlink) link);
      cell.setCellStyle(hlinkstyle);

      //Hyperlink to a file in the current directory
      cell = spreadsheet.createRow(2).createCell((short) 1);
      cell.setCellValue("File Link");
      link = (XSSFHyperlink)createHelper.createHyperlink(HyperlinkType.FILE);
      link.setAddress("cellstyle.xlsx");
      cell.setHyperlink(link);
      cell.setCellStyle(hlinkstyle);

      //e-mail link
      cell = spreadsheet.createRow(3).createCell((short) 1);
      cell.setCellValue("Email Link");
      link = (XSSFHyperlink)createHelper.createHyperlink(HyperlinkType.EMAIL);
      link.setAddress("mailto:contact@tutorialspoint.com?" + "subject = Hyperlink");
      cell.setHyperlink(link);
      cell.setCellStyle(hlinkstyle);

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

将上述代码保存为 HyperlinkEX.java 。从命令提示符按照如下方式进行编译并执行 −

$javac HyperlinkEX.java
$java HyperlinkEX

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

hyperlink.xlsx written successfully

hyperlink.xlsx 文件看起来如下 −

hyperlink

Apache POI - Print Area

这一章解释了如何在电子表格上设置打印区域。在 Excel 电子表格中,常见的打印区域是从左上角打印到右下角。可以根据你的要求定制打印区域。这意味着你可以从整个电子表格打印特定范围的单元格,自定义纸张大小,在网格线打开的情况下打印内容,等等。

以下代码用于在电子表格上设置打印区域。

import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.xssf.usermodel.XSSFPrintSetup;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class PrintArea
{
   public static void main(String[] args)throws Exception
   {
      XSSFWorkbook workbook = new XSSFWorkbook();
      XSSFSheet spreadsheet = workbook
      .createSheet("Print Area");
      //set print area with indexes
      workbook.setPrintArea(
         0, //sheet index
         0, //start column
         5, //end column
         0, //start row
         5 //end row
      );
      //set paper size
      spreadsheet.getPrintSetup().setPaperSize(
      XSSFPrintSetup.A4_PAPERSIZE);
      //set display grid lines or not
      spreadsheet.setDisplayGridlines(true);
      //set print grid lines or not
      spreadsheet.setPrintGridlines(true);
      FileOutputStream out = new FileOutputStream(
      new File("printarea.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("printarea.xlsx written successfully");
   }
}

让我们将以上代码保存在文件中 PrintArea.java 。从命令提示符编译并执行代码,如下所示:

$javac PrintArea.java
$java PrintArea

它将在你的当前目录中生成一个名为 printarea.xlsx 的文件,然后在命令提示符上显示以下输出。

printarea.xlsx written successfully

在以上代码中,我们没有添加任何单元格值。因此 printarea.xlsx 是一个空白文件。但你可以观察到,在下图中,打印预览显示了带有网格线的打印区域。

printarea

Apache POI - Database

本章介绍 POI 库如何与数据库交互。借助 JDBC,您可以从数据库中检索数据并使用 POI 库将该数据插入到电子表格中。让我们考虑使用 MySQL 数据库进行 SQL 操作。

Write into Database

让我们假设要从 MySQL 数据库 test 中检索以下名为 emp_tbl 的员工数据表。

EMP ID

EMP NAME

DEG

SALARY

DEPT

1201

Gopal

Technical Manager

45000

IT

1202

Manisha

Proof reader

45000

Testing

1203

Masthanvali

Technical Writer

45000

IT

1204

Kiran

Hr Admin

40000

HR

1205

Kranthi

Op Admin

30000

Admin

使用以下代码从数据库中检索数据并将其插入电子表格。

import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
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 ExcelDatabase {
   public static void main(String[] args) throws Exception {
      Class.forName("com.mysql.jdbc.Driver");
      Connection connect = DriverManager.getConnection(
         "jdbc:mysql://localhost:3306/test" ,
         "root" ,
         "root"
      );
      Statement statement = connect.createStatement();
      ResultSet resultSet = statement
      .executeQuery("select * from emp_tbl");
      XSSFWorkbook workbook = new XSSFWorkbook();
      XSSFSheet spreadsheet = workbook
      .createSheet("employe db");
      XSSFRow row=spreadsheet.createRow(1);
      XSSFCell cell;
      cell=row.createCell(1);
      cell.setCellValue("EMP ID");
      cell=row.createCell(2);
      cell.setCellValue("EMP NAME");
      cell=row.createCell(3);
      cell.setCellValue("DEG");
      cell=row.createCell(4);
      cell.setCellValue("SALARY");
      cell=row.createCell(5);
      cell.setCellValue("DEPT");
      int i=2;
      while(resultSet.next()) {
         row=spreadsheet.createRow(i);
         cell=row.createCell(1);
         cell.setCellValue(resultSet.getInt("eid"));
         cell=row.createCell(2);
         cell.setCellValue(resultSet.getString("ename"));
         cell=row.createCell(3);
         cell.setCellValue(resultSet.getString("deg"));
         cell=row.createCell(4);
         cell.setCellValue(resultSet.getString("salary"));
         cell=row.createCell(5);
         cell.setCellValue(resultSet.getString("dept"));
         i++;
      }
      FileOutputStream out = new FileOutputStream(
      new File("exceldatabase.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("exceldatabase.xlsx written successfully");
   }
}

让我们将上述代码另存为 ExcelDatabase.java 。如下所示从命令提示符对其进行编译并执行。

$javac ExcelDatabase.java
$java ExcelDatabase

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

exceldatabase.xlsx written successfully

exceldatabase.xlsx 文件如下所示:

exceldatabase