Apache POI操作Excel文件
一、简介
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。其中使用最多的就是使用POI操作Excel文件。
jxl:专门操作Excel
POI更加全面。
maven坐标:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
二、Apache POI常用的类

三、HSSF
是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件(.xls文件)。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
常用的类和方法
1、HSSFWorkbook :工作簿,代表一个excel的整个文档
HSSFWorkbook(); // 创建一个新的工作簿
HSSFWorkbook(InputStream inputStream); // 创建一个关联输入流的工作簿,可以将一个excel文件封装成工作簿
HSSFSheet createSheet(String sheetname); 创建一个新的Sheet
HSSFSheet getSheet(String sheetName); 通过名称获取Sheet
HSSFSheet getSheetAt(int index); // 通过索引获取Sheet,索引从0开始
HSSFCellStyle createCellStyle(); 创建单元格样式
int getNumberOfSheets(); 获取sheet的个数
setActiveSheet(int index); 设置默认选中的工作表
write();
write(File newFile);
write(OutputStream stream);
2、HSSFSheet:工作表
HSSFRow createRow(int rownum); 创建新行,需要指定行号,行号从0开始
HSSFRow getRow(int index); 根据索引获取指定的行
int addMergedRegion(CellRangeAddress region); 合并单元格
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 单元格范围, 用于合并单元格,需要指定要合并的首行、最后一行、首列、最后一列。
autoSizeColumn(int column); 自动调整列的宽度来适应内容
getLastRowNum(); 获取最后的行的索引,没有行或者只有一行的时候返回0
setColumnWidth(int columnIndex, int width); 设置某一列的宽度,width=字符个数 * 256,例如20个字符的宽度就是20 * 256
3、HSSFRow :行
HSSFCell createCell(int column); 创建新的单元格
HSSFCell setCell(shot index);
HSSFCell getCell(shot index);
setRowStyle(HSSFCellStyle style); 设置行样式
short getLastCellNum(); 获取最后的单元格号,如果单元格由第一个开始算,lastCellNum就是列的个数
setHeightInPoints(float height); 设置行的高度
4、HSSFCell:单元格
setCellValue(String value); 设置单元格的值
setCellType(); 设置单元格类型,如 字符串、数字、布尔等
setCellStyle(); 设置单元格样式
String getStringCellValue(); 获取单元格中的字符串值
setCellStyle(HSSFCellStyle style); 设置单元格样式,例如字体、加粗、格式化
setCellFormula(String formula); 设置计算公式,计算的结果作为单元格的值,也提供了异常常用的函数,如求和”sum(A1,C1)”、日期函数、字符串相关函数、CountIf和SumIf函数、随机数函数等
5、HSSFCellStyle :单元格样式
setFont(Font font); 为单元格设置字体样式
setAlignment(HorizontalAlignment align); // 设置水平对齐方式
setVerticalAlignment(VerticalAlignment align); // 设置垂直对齐方式
setFillPattern(FillPatternType fp);
setFillForegroundColor(short bg); 设置前景色
setFillBackgroundColor(short bg); 设置背景颜色
6、HSSFFont:字体,
setColor(short color); // 设置字体颜色
setBold(boolean bold); // 设置是否粗体
setItalic(boolean italic); 设置倾斜
setUnderline(byte underline); 设置下划线
7、其他
HSSFName:名称
HSSFDataFormat :日期格式化
HSSFHeader : Sheet的头部
HSSFFooter :Sheet的尾部
HSSFDateUtil :日期工具
HSSFPrintSetup :打印设置
HSSFErrorConstants:错误信息表
四、Excel中的工作簿、工作表、行、单元格中的关系
一个Excel文件对应于一个workbook(HSSFWorkbook),
一个workbook可以有多个sheet(HSSFSheet)组成,
一个sheet是由多个row(HSSFRow)组成,
一个row是由多个cell(HSSFCell)组成
五、xls和xlsx的区别
xls是excel03版本 xlsx是excel07版本
最大的区别是行列数不同:
xls最大支持65536行、256列
xlsx最大支持1048576行、16384列
poi操作:
poi 操作xls
poi-ooml操作xlsx
HSSF用于处理xls,而XSSF用于xlsx。对于大文件写入,HSSF有内存限制,而XSSF会消耗大量内存。SXSSF作为解决方案,提供流式处理,减少内存使用,适合处理大数据量。
1、XSSFWorkbook 详解
XSSFWorkbook 是 Apache POI 库中用于操作 Excel 2007及更高版本(.xlsx 格式)文档的类。它是 org.apache.poi.xssf.usermodel.XSSFWorkbook 类的一个实现。XSSFWorkbook 提供了许多方法,用于创建、修改和操作 Excel 工作簿,包括工作表、单元格、样式等。以下是一些常用的 XSSFWorkbook 方法的详解:
构造函数:
- XSSFWorkbook():创建一个新的空白工作簿。
- XSSFWorkbook(InputStream is):从输入流加载现有的工作簿。
- XSSFWorkbook(String path):从指定文件路径加载现有的工作簿。
- XSSFWorkbook(File file):从指定文件加载现有的工作簿
- XSSFWorkbook(OPCPackage pkg):使用 OPCPackage 对象创建工作簿,这通常用于高级用途。
创建工作表:
- XSSFSheet createSheet(String sheetName):创建一个新的工作表,并指定工作表的名称。
- XSSFSheet getSheetAt(int index):通过索引获取工作表。
- XSSFSheet getSheet(String name):通过名称获取工作表。
工作表操作:
- int getNumberOfSheets():获取工作簿中的工作表数量。
- void removeSheetAt(int index):删除指定索引处的工作表。
- XSSFSheet cloneSheet(int sheetIndex):克隆工作表。
保存工作簿:
- void write(OutputStream out):将工作簿内容写入输出流,通常用于将工作簿保存到文件。
- void write(File file):将工作簿内容写入指定的文件。
- void close():关闭工作簿,释放资源。
样式和格式:
- XSSFCellStyle createCellStyle():创建一个新的单元格样式。
- XSSFFont createFont():创建一个新的字体对象。
- short createDataFormat():创建一个新的数据格式。
日期处理:
- void setCreationHelper(CreationHelper createHelper):设置工作簿的 CreationHelper,用于日期处理和其他数据类型的转换。
密码保护:
- void lockStructure():锁定工作簿的结构,防止用户对工作表的结构进行更改。
- void unlockStructure():解锁工作簿的结构,允许用户对工作表的结构进行更改。
其他:
- int getActiveSheetIndex():获取当前活动工作表的索引。
- void setActiveSheet(int sheetIndex):设置当前活动工作表的索引。
- XSSFFormulaEvaluator getCreationHelper().createFormulaEvaluator():用于计算公式的创建和计算器。
2、XSSFSheet详解
XSSFSheet 是 Apache POI 中用于表示 Excel 工作表的类,通常用于对 Excel 表格的数据进行读取和修改。XSSFSheet 类是 org.apache.poi.xssf.usermodel.XSSFSheet 的实现。以下是一些常用的 XSSFSheet 类的方法和属性:
属性和基本信息:
- int getPhysicalNumberOfRows(): 获取工作表中的物理行数,即非空行的数量。
- int getFirstRowNum(): 获取第一个行的索引,通常为0。
- int getLastRowNum(): 获取最后一个行的索引。
- String getSheetName(): 获取工作表的名称。
行操作:
- XSSFRow createRow(int rowIndex): 创建一个新的行,指定行的索引。
- XSSFRow getRow(int rowIndex): 获取工作表中指定行索引的行对象。
- void removeRow(XSSFRow row): 从工作表中删除指定的行。
- void shiftRows(int startRow, int endRow, int n):向下或向上移动工作表中的行。
列操作:
- int getColumnWidth(int columnIndex): 获取指定列的宽度。
- void setColumnWidth(int columnIndex, int width): 设置指定列的宽度。
工作表的属性:
- boolean getDisplayFormulas(): 获取是否显示公式。
- void setDisplayFormulas(boolean show):设置是否显示公式。
合并单元格:
- void addMergedRegion(CellRangeAddress region): 合并单元格区域。
- void addMergedRegionUnsafe(CellRangeAddress region): 合并单元格区域(不检查冲突)。
- void removeMergedRegion(int index): 移除合并单元格区域。
保护工作表:
- void protectSheet(String password): 保护工作表并设置密码。
- void unprotectSheet(String password): 取消保护工作表,需要提供正确的密码。
页眉和页脚:
- Header getHeader(): 获取工作表的页眉。
- Footer getFooter(): 获取工作表的页脚。
注释:
- XSSFRichTextString getSheetComment(): 获取工作表的注释。
- void setSheetComment(XSSFRichTextString comment): 设置工作表的注释。
图表:
- XSSFDrawing createDrawingPatriarch(): 创建绘图对象,用于插入图表和图形。
数据有效性:
- XSSFDataValidationHelper getDataValidationHelper(): 获取数据有效性帮助器,用于创建数据有效性约束。
打印设置:
- void setPrintArea(int startColumn, int endColumn, int startRow, int endRow): 设置要打印的区域。
其它方法:
- boolean isSelected(): 检查工作表是否被选中。
- void setSelected(boolean select): 设置工作表是否被选中。
3、XSSFRow详解
XSSFRow 是 Apache POI 中用于表示 Excel 工作表中的行的类,通常用于对 Excel 表格的数据进行读取和修改。XSSFRow 类是 org.apache.poi.xssf.usermodel.XSSFRow 的实现。下面是一些常用的 XSSFRow 类的方法和属性:
属性和基本信息:
- int getRowNum(): 获取行的索引,从0开始。
- int getPhysicalNumberOfCells(): 获取该行的物理单元格数量,即非空单元格的数量。
单元格操作:
- XSSFCell createCell(int columnIndex): 创建一个新的单元格,指定单元格在行中的列索引。
- XSSFCell getCell(int columnIndex): 获取行中指定列索引的单元格。
- void removeCell(XSSFCell cell): 从行中删除指定的单元格。
- int getFirstCellNum(): 获取第一个单元格的列索引。
- int getLastCellNum(): 获取最后一个单元格的列索引,包括空单元格。
设置行高和默认列宽:
- void setHeight(short height): 设置行的高度(以20分之1个点为单位)。
- void setZeroHeight(boolean zHeight): 设置行是否为零高度(隐藏行)。
其它方法:
- void shiftCellsRight(int firstCellNum, int lastCellNum, int step): 将行中指定范围内的单元格向右移动。
- void shiftCellsLeft(int firstCellNum, int lastCellNum, int step): 将行中指定范围内的单元格向左移动。
- void shiftCellsRight(int firstCellNum, int lastCellNum): 将行中指定范围内的单元格向右移动一个位置。
- void shiftCellsLeft(int firstCellNum, int lastCellNum): 将行中指定范围内的单元格向左移动一个位置。
4、XSSFCell 详解
XSSFCell 是 Apache POI 中用于表示 Excel 工作表中单元格的类,通常用于读取和修改 Excel 表格中的数据。XSSFCell 类是 org.apache.poi.xssf.usermodel.XSSFCell 的实现。以下是一些常用的 XSSFCell 类的方法和属性:
获取单元格的内容:
- String getStringCellValue(): 获取单元格中的文本值,无论单元格中的内容是文本、数字、日期或其他数据类型,都会以字符串形式返回。
- double getNumericCellValue(): 获取单元格中的数值(仅适用于数值类型的单元格)。
- boolean getBooleanCellValue(): 获取单元格中的布尔值(仅适用于布尔类型的单元格)。
- Date getDateCellValue(): 获取单元格中的日期值
- String getCellFormula(): 获取单元格中的公式。
设置单元格的内容:
- void setCellValue(double value): 设置单元格的值为数值。
- void setCellValue(String value): 设置单元格的值为文本。
- void setCellValue(boolean value): 设置单元格的值为布尔值。
- void setCellFormula(String formula): 设置单元格的公式。
单元格样式:
- XSSFCellStyle getCellStyle(): 获取单元格的样式对象,以便修改单元格的样式。
- void setCellStyle(XSSFCellStyle style): 设置单元格的样式。
单元格类型和属性:
- int getCellType(): 获取单元格的类型,返回常量值(CellType)。
- boolean getBooleanCellValue(): 获取布尔类型的单元格值。
- int getColumnIndex(): 获取单元格所在的列索引。
单元格注释:
- XSSFRichTextString getRichStringCellValue(): 获取富文本字符串对象(支持格式化文本)。
- XSSFRichTextString setCellValue(RichTextString value): 设置单元格的富文本字符串值。
单元格格式:
- void setCellType(int cellType): 设置单元格的类型,可以是 CellType 常量之一。
日期格式:
- void setCellStyle(CellStyle style): 设置单元格的日期格式。
公式计算:
- void setCellType(CellType cellType): 设置单元格的类型,可以是 CellType 常量之一。
- void setCellErrorValue(byte errorCode): 设置单元格的错误值。
其它方法:
- boolean isPartOfArrayFormulaGroup(): 检查单元格是否属于数组公式组。
- void removeCellComment(): 移除单元格的注释。
四、入门案例
1、从Excel文件读取数据
package com.itheima.test;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;
import java.io.File;
public class POITest {
//使用POI读取Excel文件中数据
@Test
public void readExcel() throws Exception {
//加载指定文件,创建一个excel对象(工作簿)
// XSSFWorkbook excel = new XSSFWorkbook("C:\\workFiles\\poi.xlsx");
XSSFWorkbook excel = new XSSFWorkbook(new File("C:\\workFiles\\poi.xlsx"));
//读取excel文件中第一个sheet标签页
XSSFSheet sheet = excel.getSheetAt(0);
//遍历sheet标签页,获得每一行数据
for (Row row : sheet) {
//遍历行,获得每个单元格对象
for (Cell cell : row) {
System.out.println(cell.getStringCellValue());
}
}
//关闭资源
excel.close();
}
}
通过上面的入门案例可以看到,POI操作Excel表格封装了几个核心对象:

还有一种方式就是获取工作表最后一个行号(有数据的行号),从而根据行号获得行对象,通过行获取最后一个单元格索引,从而根据单元格索引获取每行的一个单元格对象,代码如下:
@Test
public void readExcel2() throws Exception {
//加载制定文件,创建一个excel对象(工作簿)
XSSFWorkbook excel = new XSSFWorkbook(new File("C:\\workFiles\\poi.xlsx"));
//读取excel文件中第一个sheet标签页
XSSFSheet sheet = excel.getSheetAt(0);
//获得当前工作表中最后一个行号,需要注意:行号从0开始,即有2行lastRowNum=1
int lastRowNum = sheet.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
//根据行号获取行对象
XSSFRow row = sheet.getRow(i);
//获得当前行最后一个单元格索引
short lastCellNum = row.getLastCellNum();
for (int j = 0; j < lastCellNum; j++) {
String cellValue = row.getCell(j).getStringCellValue();
System.out.println(cellValue);
}
}
//关闭资源
excel.close();
}
2、向Excel文件写入数据
使用POI可以在内存中创建一个Excel文件并将数据写入到这个文件,最后通过输出流将内存中的Excel 文件下载到磁盘
@Test
public void writeExcel() throws Exception {
//在内存中创建一个Excel文件
XSSFWorkbook workbook = new XSSFWorkbook();
//创建工作表,指定工作表名称
XSSFSheet sheet = workbook.createSheet("传智播客");
//在工作表中创建行,0表示第一行
XSSFRow row = sheet.createRow(0);
//在行中创建单元格,0表示第一个单元格
row.createCell(0).setCellValue("编号");
row.createCell(1).setCellValue("名称");
row.createCell(2).setCellValue("年龄");
XSSFRow row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("1");
row1.createCell(1).setCellValue("小明");
row1.createCell(2).setCellValue("10");
XSSFRow row2 = sheet.createRow(2);
row2.createCell(0).setCellValue("2");
row2.createCell(1).setCellValue("小王");
row2.createCell(2).setCellValue("20");
//将excel数据写入到文件中,通过输出流将内存中的excel文件写到磁盘
FileOutputStream out = new FileOutputStream("C:\\workFiles\\itcast.xlsx");
workbook.write(out);
out.flush();
out.close();
workbook.close();
}
执行完成,生成itcast.xlsx文件,并且文件里写入数据。
浙公网安备 33010602011771号