Apache POI
一、简介
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文件。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); 设置下划线
HSSFName:名称
HSSFDataFormat :日期格式化
HSSFHeader : Sheet的头部
HSSFFooter :Sheet的尾部
HSSFDateUtil :日期工具
HSSFPrintSetup :打印设置
HSSFErrorConstants:错误信息表
Excel中的工作簿、工作表、行、单元格中的关系:
一个Excel文件对应于一个workbook(HSSFWorkbook),
一个workbook可以有多个sheet(HSSFSheet)组成,
一个sheet是由多个row(HSSFRow)组成,
一个row是由多个cell(HSSFCell)组成
四、入门案例
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(0); 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文件写到磁盘 FileOutputStream out = new FileOutputStream("C:\\workFiles\\itcast.xlsx"); workbook.write(out); out.flush(); out.close(); workbook.close(); }
执行完成,生成itcast.xlsx文件,并且文件里写入数据。