POI-入门(基于Maven)
# POI入门操作## 1. 搭建环境
```xml
<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 | 格子单元样式 |
## 4. 基本操作
### 4.1 创建Excel
```java
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 使用POI创建excel
*/
public class PoiTest01 {
public static void main(String[] args) throws IOException {
// 1. 创建工作簿 XSSFWorkbook 2003 xss 2007
Workbook wb = new XSSFWorkbook();
// 2. 创建表单sheet
wb.createSheet("test");
// 3. 文件流
FileOutputStream pis =new FileOutputStream("C:\\Users\\asus\\Desktop\\poi\\test.xlsx");
// 4. 写入文件
wb.write(pis);
pis.close();
}
}
```
### 4.2 创建单元格
```java
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;
import java.io.IOException;
/**
* 创建单元格写入内容
*/
public class PoiTest02 {
public static void main(String[] args) throws IOException {
// 1. 创建工作簿 XSSFWorkbook 2003 xss 2007
Workbook wb = new XSSFWorkbook();
// 2. 创建表单sheet
Sheet sheet = wb.createSheet("test");
// 创建行对象 参数: 索引(从0开始)
Row row = sheet.createRow(2);
// 创建单元格对象
Cell cell = row.createCell(2);
// 向单元格中写入内容
// 3. 文件流
cell.setCellValue("tian");
FileOutputStream pis =new FileOutputStream("C:\\Users\\asus\\Desktop\\poi\\test1.xlsx");
// 4. 写入文件
wb.write(pis);
pis.close();
}
}
```
### 4.3 设置格式
```java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 单元格样式处理
*/
public class PoiTest03 {
public static void main(String[] args) throws IOException {
// 1. 创建工作簿 XSSFWorkbook 2003 xss 2007
Workbook wb = new XSSFWorkbook();
// 2. 创建表单sheet
Sheet sheet = wb.createSheet("test");
// 创建行对象 参数: 索引(从0开始)
Row row = sheet.createRow(2);
// 创建单元格对象
Cell cell = row.createCell(2);
// 向单元格中写入内容
// 3. 文件流
cell.setCellValue("tian");
// 样式处理
// 创建样式对象
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
// 创建字体对象
Font font = wb.createFont();
font.setFontName("华文行楷"); // 字体
font.setFontHeightInPoints((short)28); // 字号
cellStyle.setFont(font);
// 行高和列宽
row.setHeightInPoints(50);// 行高
sheet.setColumnWidth(2,31*256);//列宽 列宽的宽度为字符的宽度
// 居中显示
cellStyle.setAlignment(HorizontalAlignment.CENTER);// 水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
// 向单元格设置样式
cell.setCellStyle(cellStyle);
FileOutputStream pis =new FileOutputStream("C:\\Users\\asus\\Desktop\\poi\\test2.xlsx");
// 4. 写入文件
wb.write(pis);
pis.close();
}
}
```
### 4.4 绘制图形
```java
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;
import java.io.IOException;
/**
* 插入图片
*/
public class PoiTest04 {
public static void main(String[] args) throws IOException {
// 1. 创建工作簿 XSSFWorkbook 2003 xss 2007
Workbook wb = new XSSFWorkbook();
// 2. 创建表单sheet
Sheet sheet = wb.createSheet("test");
// 读取图片流
FileInputStream stream = new FileInputStream("C:\\Users\\asus\\Desktop\\poi\\fenxi.jpg");
// 图片转换为二进制数组
byte[] bytes = IOUtils.toByteArray(stream);
stream.read(bytes);
// 向poi内存中添加一张图片,返回图片在图片集合中的索引
int index = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);// 参数一: 图片的二进制数据,参数二: 图片类型
// 绘制图片工具类
CreationHelper creationHelper = wb.getCreationHelper();
// 创建一个绘图对象
Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();
// 创建锚点,设置图片坐标
ClientAnchor clientAnchor = creationHelper.createClientAnchor();
clientAnchor.setRow1(0);// 从第几行开始
clientAnchor.setCol1(0);// 第几个单元格
// 绘制图片
Picture picture = drawingPatriarch.createPicture(clientAnchor, index);// 图片位置,图片的索引
picture.resize();// 自适应渲染图片
FileOutputStream pis =new FileOutputStream("C:\\Users\\asus\\Desktop\\poi\\test3.xlsx");
// 4. 写入文件
wb.write(pis);
pis.close();
}
}
```
### 4.5 加载读取Excel
```java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
/**
* 读取excel并解析
*/
public class PoiTest05 {
public static void main(String[] args) throws IOException {
// 1.根据Excel文件创建工作簿
Workbook wb = new XSSFWorkbook("C:\\Users\\asus\\Desktop\\poi\\demo.xlsx");
// 2. 获取Sheet
Sheet sheet = wb.getSheetAt(0);// 参数, 索引
// 3. 获取Sheet中的每一行,和每一个单元格中的内容
for (int rowNum = 0; rowNum<=sheet.getLastRowNum();++rowNum) {
Row row = sheet.getRow(rowNum);// 根据索引拿到每一行
StringBuilder sb = new StringBuilder();
for(int cellNum = 2; cellNum<row.getLastCellNum();++cellNum){
// 根据索引获取每一个单元格
Cell cell = row.getCell(cellNum);
// 获取每一个单元格的内容
Object value = getCellValue(cell);
sb.append(value).append("-");
//
}
System.out.println(sb.toString());
}
}
publicstaticObject getCellValue(Cell cell){
// 1. 获取到单元格 的数据类型
CellType cellType = cell.getCellType();
// 2. 根据单元格数据类型获取数据
Object value = null;
switch (cellType){
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;
}
}
```
页:
[1]