一、Apache POI简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
基本功能
结构:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
二、创建工程所需jar包
commons-io-2.4.jar
poi-3.15.jar
三、环境准备
1.User.java
package com.hello.world.pojo;
public class User {
private int id;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex + "]";
}
}
2、Excel文件原始数据
3、读取Excel文件内容
Excel文件保存路径:D:\excel
文件名:poi_test.xls
4、PoiReader.java
package com.hello.world.poi;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.hello.world.pojo.User;
/**
*POI读取Excel文件
*/
public class PoiReader {
public static void main(String[] args) {
// 将读取出来的数据封装到User对象,将User对象添加到集合中
List<User> list = new ArrayList<>();
try {
File file = new File("D:\\excel\\poi_test.xls");
FileInputStream input = new FileInputStream(file);
// HSSFWorkbook用于操作后缀为.xls的excel表格,XSSFWorkbook用于操作.xlsx的excel表格
HSSFWorkbook workbook = new HSSFWorkbook(input);
// 获取工作簿的方法有两种,一种是根据索引获取,第一个sheet的索引为0,还有一种是根据sheet名称获取
// HSSFSheet sheet = workbook.getSheet("poi");
HSSFSheet sheet = workbook.getSheetAt(0);
// 获得最后一行的行号
// 最后一行行号等于sheet的数据行数
int lastNum = sheet.getLastRowNum();
// 遍历获得每一行,第一行是表头,从第二行开始
for (int i = 1; i < lastNum + 1; i++) {
User u = new User();
// 得到每一行
HSSFRow row = sheet.getRow(i);
// 获得最后一列的值,等于每一行的总列数
int lastCellNum = row.getLastCellNum();
// 遍历每一列,得到每一个单元格
for (int j = 0; j < lastCellNum; j++) {
if (j == 0) {
// 第i行第j列单元格,第一列为数字格式
HSSFCell cell = row.getCell(j);
int id = (int) cell.getNumericCellValue();
u.setId(id);
}
if (j == 1) {
HSSFCell cell = row.getCell(j);
String name = cell.getStringCellValue();
u.setName(name);
}
if (j == 2) {
HSSFCell cell = row.getCell(j);
String sex = cell.getStringCellValue();
u.setSex(sex);
}
}
list.add(u);
// 关闭资源
workbook.close();
}
System.out.println(list);
} catch (Exception e) {
e.printStackTrace();
}
}
}
5、结果展示
[User [id=1, name=name 1, sex=男], User [id=2, name=name 2, sex=男], User [id=3, name=name 3, sex=男], User [id=4, name=name 4, sex=男], User [id=5, name=name 5, sex=男], User [id=6, name=name 6, sex=男], User [id=7, name=name 7, sex=男], User [id=8, name=name 8, sex=男], User [id=9, name=name 9, sex=男], User [id=10, name=name 10, sex=男]]
与原始数据一致,这里之所以将读取结果封装到User对象,然后将User对象添加到集合中,是考虑到实际业务处理,所以没有将单元格内容直接打印输出。
6、利用POI写入数据到excel表格中
package com.hello.world.poi;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/*
* 利用POI创建excel文件,并写入数据
*/
public class PoiWrite {
public static void main(String[] args) {
// 表头信息
String[] titles = { "id", "name", "sex" };
// 创建workbook
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建sheet
HSSFSheet sheet = workbook.createSheet("poi");
// 创建第一行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < titles.length; i++) {
// 将标题添加到第一行里
HSSFCell cell = row.createCell(i);
cell.setCellValue(titles[i]);
}
// 从第二行开始添加数据,一共十行
for (int i = 1; i < 11; i++) {
// 得到每一行的对象
HSSFRow row2 = sheet.createRow(i);
// 为第一个单元格赋值
HSSFCell cell2 = row2.createCell(0);
cell2.setCellValue(i + "");
// 为第二个单元格赋值
cell2 = row2.createCell(1);
cell2.setCellValue("name " + i);
// 为第三个单元格赋值
cell2 = row2.createCell(2);
cell2.setCellValue("男");
}
try {
File file = new File("D:\\excel\\poi_test2.xls");
FileOutputStream out = FileUtils.openOutputStream(file);
workbook.write(out);
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果展示:
表格的样式也可以进行设置,这里就不详细介绍了,有兴趣的同学可以查看POI官方文档