一. 简介
Apache POI是Apache软件基金会的开源项目,由Java编写的免费开源的跨平台的 Java API,Apache POI提供API
给Java语言操作Microsoft Office的功能。
二. POI的应用场景
- 数据报表生成
- 数据备份
- 数据批量上传
三. 环境搭建
1. 导入依赖
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
2. POI结构说明
HSSF提供读写Microsoft Excel XLS格式档案的功能。
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF提供读写Microsoft Word DOC格式档案的功能。
HSLF提供读写Microsoft PowerPoint格式档案的功能。
HDGF提供读Microsoft Visio格式档案的功能。
HPBF提供读Microsoft Publisher格式档案的功能。
HSMF提供读Microsoft Outlook格式档案的功能。
3. 相关api
API名称 | 介绍 |
Workbook | Excel的文档对象,针对不同的Excel类型分为:HSSFWorkbook(2003)和 XSSFWorkbool(2007) |
Sheet | Excel的表单 |
Row | Excel的行 |
Cell | Excel的格子单元 |
Font | Excel字体 |
CellStyle | 格子单元样式 |
四. 基本操作
- 创建一个新的module
- 导入依赖
- 编写java代码
1. 创建Excel文件
代码执行成功后,在D盘下生成了一个excel文件。
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
public class POITest01 {
//测试创建excel文件
public static void main(String[] args) throws Exception {
//1. 创建workbook工作簿
Workbook workbook = new XSSFWorkbook();
//2. 创建表单Sheet
Sheet sheet = workbook.createSheet("test");
//3. 文件流
FileOutputStream fileOutputStream = new FileOutputStream("D:\\test.xlsx");
//4. 写入文件
workbook.write(fileOutputStream);
workbook.close();
}
}
2. 创建单元格
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
public class POITest02 {
//测试创建excel文件
public static void main(String[] args) throws Exception {
//1. 创建workbook工作簿
Workbook workbook = new XSSFWorkbook();
//2. 创建表单Sheet
Sheet sheet = workbook.createSheet("test");
//3. 创建行对象,从0开始
Row row = sheet.createRow(3);
//4. 创建单元格,从0开始
Cell cell = row.createCell(0);
//5. 单元格写入数据
cell.setCellValue("POI报表导出");
//6. 文件流
FileOutputStream fos = new FileOutputStream("D:\\test.xlsx");
//7. 写入文件
workbook.write(fos);
workbook.close();
}
}
执行结果如下图所示:
从0开始的第四行第一列出现了我们填入的数据。
3. 绘制图形
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class POITest03 {
//测试创建excel文件
public static void main(String[] args) throws Exception {
//1. 创建workbook工作簿
Workbook workbook = new XSSFWorkbook();
//2. 创建表单Sheet
Sheet sheet = workbook.createSheet("test");
//读取图片流
FileInputStream fis = new FileInputStream("D:\\logo.jpg");
byte[] bytes = IOUtils.toByteArray(fis);
//读取图片到二进制数组
fis.read(bytes);
//向Excel添加一张图片,并返回该图片在Excel中的图片集合中的下标
int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
//绘图工具类
CreationHelper helper = workbook.getCreationHelper();
//创建一个绘图对象
Drawing<?> patriarch = sheet.createDrawingPatriarch();
//创建锚点,设置图片坐标
ClientAnchor anchor = helper.createClientAnchor();
anchor.setCol1(0);//从0开始
anchor.setRow1(0);//从0开始
//创建图片
Picture picture = patriarch.createPicture(anchor, pictureIdx);
picture.resize();
//6. 文件流
FileOutputStream fos = new FileOutputStream("D:\\test.xlsx");
//7. 写入文件
workbook.write(fos);
workbook.close();
}
}
打开excel文件后,图片就显示在文档的左上角了。
4. 加载Excel文件
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class POITest04 {
//测试创建excel文件
public static void main(String[] args) throws Exception {
//1. 创建workbook工作簿
Workbook workbook = new XSSFWorkbook("D:\\demo.xlsx");
//2. 创建表单Sheet
Sheet sheet = workbook.getSheetAt(0);
//获取文件的行数
int lastRowNum = sheet.getLastRowNum();
Row row = null;
Cell cell = null;
//循环遍历所有的行
for (int rowNum = 3; rowNum < sheet.getLastRowNum(); rowNum++) {
row = sheet.getRow(rowNum);
StringBuilder builder = new StringBuilder();
for (int cellNum = 2; cellNum < sheet.getLastRowNum(); cellNum++) {
cell = row.getCell(cellNum);
builder.append(getValue(cell)).append("-");
}
System.out.println(builder.toString());
}
//6. 文件流
FileOutputStream fos = new FileOutputStream("D:\\test.xlsx");
//7. 写入文件
workbook.write(fos);
workbook.close();
}
//获取数据
private static Object getValue(Cell cell) {
Object value = null;
switch (cell.getCellType()) {
case STRING: //字符串类型
value = cell.getStringCellValue();
break;
case BOOLEAN: //boolean类型
value = cell.getBooleanCellValue();
break;
case NUMERIC: //数字类型(包含日期和普通数字)
if (DateUtil.isCellDateFormatted(cell)) {
value = cell.getDateCellValue();
} else {
value = cell.getNumericCellValue();
}
break;
case FORMULA: //公式类型
value = cell.getCellFormula();
break;
default:
break;
}
return value;
}
}
输出结果: