文章目录
1. 简介
什么是Apache POI?
这里借用百度百科的解释:pache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。
Apache POI有许多结构(即类)来帮我我们操作Microsoft Office中不同格式的文件,具体如下图:
Excek版本的区别 !!!
Excel分为以下两个版本:
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
区别:
HSSF:最多只能处理65536行数据,超过会抛异常;过程中写入缓存,不操作磁盘;最后一次性写入磁盘,速度快。
XSSF:可以写入大量数据,写数据时速度非常慢,非常耗内存,也会发生内存溢出,如写100万条数据。
后续代码默认以XSSF作为栗子。
2. Excel相关对象分析
在Java中我们知道,使用了万物皆对象的思想;那么将Excel揉进Java代码中也应当如此,POI给我们提供了许多Excel相关的Java对象,下面我们来一一介绍。
2.1 工作簿
工作簿即一个Excel表格,如下图,我们在文件夹中见到的一个Excel文件,即一个Wrokbook对象。
接口:org.apache.poi.ss.usermodel.Workbook
实现类:Workbook接口有3个实现类,分别是HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook
- HSSFWorkbook:操作Excel03版本的Excel
- XSSFWorkbook:操作Excel07版本的Excel
- SXSSFWorkbook:[S:SUPER]可以加快速度的处理07版本的Excel
创建Workbook对象 :
Workbook workbook = new XSSFWorkbook();
常用方法:
方法 | 备注 |
---|---|
createSheet() | 创建一个sheet页,有多个重载方法,这里不一一介绍。 |
getSheet(String sheetName); | 通过名称获取Sheet对象 |
getSheetAt(int index); | 通过索引获取Sheet对象 |
getNumberOfSheets(); | 获取Sheet的个数 |
createCellStyle(); | 创建单元格样式 |
setActiveSheet(int index); | 设置默认选中的工作表 |
write(); | 写,多个重载方法,这里不一一介绍 |
2.2 工作表 Sheet
工作表即Excel文件中的Sheet页,如下图:我们打开一个Excel表格后,可以在Excel下方看见Sheet页,每一个Sheet页都代表了一个Sheet对象。
接口:org.apache.poi.ss.usermodel.Sheet
实现类:略
创建一个Sheet对象:
相信大家对Excel的操作也不陌生,Sheet一定是依赖于Workbook存在的。因此我们创建Sheet对象的时候首先需要一个Workbook对象
// 1. 创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 创建sheet页
XSSFSheet sheet = workbook.createSheet("第一个sheet页");
常用方法:
方法 | 备注 |
---|---|
createRow(int rownum); | 创建新行,需要指定行号,行号从0开始。 |
getRow(int index); | 根据索引获取指定的行 |
int addMergedRegion(CellRangeAddress region); | 合并单元格;CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 单元格范围, 用于合并单元格,需要指定要合并的首行、最后一行、首列、最后一列。 |
getLastRowNum(); | 获取最后的行的索引,没有行或者只有一行的时候返回0 |
autoSizeColumn(int column); | 自动调整列的宽度来适应内容 |
setColumnWidth(int columnIndex, int width); | 设置某一列的宽度,width=字符个数 * 256,例如20个字符的宽度就是20 * 256 |
2.3 行 Row
行”顾名思义,即为Sheet页中的一行。
同理,行也是依赖于Sheet存在的,因此创建一个Row对象时,首先需要创建一个Sheet对象。
// 1. 创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 创建sheet页
XSSFSheet sheet = workbook.createSheet("第一个sheet页");
// 3. 创建行对象
XSSFRow row = sheet.createRow(0);
常用方法:
方法 | 备注 |
---|---|
createCell(int column); | 创建新的单元格 。 |
setCell(shot index); | 根据索引设置Cell |
getCell(shot index); | 根据索引获取Cell |
getCell(CellReference.convertColStringToIndex(“A”)); | 根据列名英文字母获取。 |
setRowStyle(HSSFCellStyle style); | 设置行样式 |
getLastCellNum(); | 获取最后的单元格号,如果单元格有第一个开始算,lastCellNum就是列的个数 |
setHeightInPoints(float height); | 设置行的高度 |
2.4 单元格 Cell
“单元格”顾名思义就是Excel中的一个单元格。
如下图所示,“第1行, 第A列” 就是一个单元格。
创建Cell对象:
// 1. 创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 创建sheet页
XSSFSheet sheet = workbook.createSheet("第一个sheet页");
// 3. 创建行对象
XSSFRow row = sheet.createRow(0);
// 4. 创建单元格对象
XSSFCell cell = row.createCell(0);
当我们有了Cell对象之后,就可以往这个单元格中填充数据了
cell.setCellValue("第一个数据");
常用方法:
方法 | 备注 |
---|---|
setCellValue(String value); | 设置单元格的值 。 |
setCellType(); | 设置单元格类型,如 字符串、数字、布尔等 |
setCellStyle(); | 设置单元格样式 |
getStringCellValue(); | 获取单元格中的字符串值 |
setCellStyle(HSSFCellStyle style); | 设置单元格样式,例如字体、加粗、格式化 |
setCellFormula(String formula); | 设置计算公式,计算的结果作为单元格的值,也提供了异常常用的函数,如求和"sum(A1,C1)"、日期函数、字符串相关函数、CountIf和SumIf函数、随机数函数等 |
2.5 单元格样式CellStyle
常用方法:
方法 | 备注 |
---|---|
setFont(Font font); | 为单元格设置字体样式 |
setAlignment(HorizontalAlignment align); | 设置水平对齐方式 |
setVerticalAlignment(VerticalAlignment align); | 设置垂直对齐方式 |
setFillPattern(FillPatternType fp); | |
setFillForegroundColor(short bg); | 设置前景色 |
setFillBackgroundColor(short bg); | 设置背景颜色 |
2.6 字体 Font
常用方法:
方法 | 备注 |
---|---|
setColor(short color); | 设置字体颜色 |
setBold(boolean bold); | 设置是否粗体 |
setItalic(boolean italic); | 设置倾斜 |
setUnderline(byte underline); | 设置下划线 |
3. 快速开始-写Excel
第一步,导入Maven依赖
<!-- xls(03) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- xls(07) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
第二步,创建Excel对象、填充数据、导出为Excel文件
// 1. 创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 创建sheet页
XSSFSheet sheet = workbook.createSheet("第一个sheet页");
// 3. 创建行对象
XSSFRow row = sheet.createRow(0);
// 4. 创建单元格对象
XSSFCell cell = row.createCell(0);
// 5. 写入数据
cell.setCellValue("第一个数据");
// 6. 导出Excel
FileOutputStream fileOutputStream = new FileOutputStream("D:\\data\\Java\\fileupload\\测试导出Excel.xlsx");
workbook.write(fileOutputStream);
fileOutputStream.close();
查看导出结果:
4. 快速开始-读Excel
第一步,导入Maven依赖
<!-- xls(03) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- xls(07) -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
第二步,准备好一个Excel:“D:\data\Java\fileupload\测试导出Excel.xlsx”
第三步,读取 “第1行,第A列” 的数据
@Test
public void testRead() throws Exception {
// 1. 读取文件流
FileInputStream fileInputStream = new FileInputStream("D:\\data\\Java\\fileupload\\测试导出Excel.xlsx");
// 2. 创建workbook
Workbook workbook = new XSSFWorkbook(fileInputStream);
// 3. 获取sheet
Sheet sheet = workbook.getSheetAt(0);
// 4. 获取row
Row row = sheet.getRow(0);
// 5. 获取cell
Cell cell = row.getCell(0);
// 6. 获取数据
String stringCellValue = cell.getStringCellValue();
System.out.println(stringCellValue);
// 7. 关闭流
fileInputStream.close();
}
运行结果: