一、简介
Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对 Microsoft Office 格式档案读和写的功能。
二、POI特点:
2.1 效率高
2. 2 支持公式,宏,一些企业应用上 会非常实用
3. 3. 能够修饰单元格属性
4. 4. 支持字体、数字、日期操作
5. 5. API 丰富,支持多种模式的读写
6. 6. 支持大数量大文件的读写操作
因此:
对于报表类的,涉及月份数据量,多表数据聚合在一起建议使用 POI。
三、POI对象和JXL对象
四、POI导出
<!--引入POI的Jar开始-->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!--引入POI的Jar结束-->
// 简单的导出一个Excel文档
@Test
public void poiOutput1Test() throws Exception{
// 1.创建工作薄
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
// 2.创建工作表
HSSFSheet hssfSheet = hssfWorkbook.createSheet("英雄");
// 3.创建行 参数:创建工作表的第几行
HSSFRow hssfRow = hssfSheet.createRow(0);
// 4.创建单元格 参数:创建本行的第几个单元格
HSSFCell hssfCell = hssfRow.createCell(0);
// 5.给单元格赋值
hssfCell.setCellValue("李白");
// 6.把这个文件导出
hssfWorkbook.write(new FileOutputStream(new File("d:/poiOutput1Test.xls")));
}
程序运行结果:
// 将ArrayList<Hero>类型的数据导出
// 测试
// 运行此单元测试
// ok
@Test
public void poiOutput2Test() throws Exception{
// 1.创建工作薄
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
// 2.创建工作表
HSSFSheet hssfSheet = hssfWorkbook.createSheet("英雄名单");
// 3.创建数据
Hero hero1 = new Hero("1", "李白", new Date());
Hero hero2 = new Hero("2", "韩信", new Date());
Hero hero3 = new Hero("3", "马克菠萝", new Date());
ArrayList<Hero> heroArrayList = new ArrayList<>();
heroArrayList.add(hero1);
heroArrayList.add(hero2);
heroArrayList.add(hero3);
// 4.创建标题行
HSSFRow titleRow = hssfSheet.createRow(0);
String[] strings = {"id","姓名","生日"};
for(int i = 0; i < strings.length; i++){
titleRow.createCell(i).setCellValue(strings[i]);
}
// 5.创建填充内容
for (int i = 0; i < heroArrayList.size(); i++){
HSSFRow row = hssfSheet.createRow(i + 1);
row.createCell(0).setCellValue(heroArrayList.get(i).getId());
row.createCell(1).setCellValue(heroArrayList.get(i).getName());
row.createCell(2).setCellValue(heroArrayList.get(i).getBir());
}
// 6.将内容输出
hssfWorkbook.write(new FileOutputStream(new File("d:/poiOutput2Test.xls")));
}
package com.baizhi.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data // getter() setter() toString() equals() hashCode() 无参构造
@Accessors(chain = true) // 支持链式调用
@AllArgsConstructor
public class Hero implements Serializable {
private String id;
private String name;
private Date bir;
}
// 将ArrayList<Hero>类型的数据导出
// 测试
// 运行此单元测试
// ok
@Test
public void poiOutput2Test() throws Exception{
// 1.创建工作薄
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
// 2.创建工作表
HSSFSheet hssfSheet = hssfWorkbook.createSheet("英雄名单");
// 2.1创建单元格样式
HSSFDataFormat hssfDataFormat = hssfWorkbook.createDataFormat(); // ---创建DataFormat
short format = hssfDataFormat.getFormat("yyyy年mm月dd日");
// 2.2把时间格式设置进单元格样式里面
HSSFCellStyle hssfCellStyle = hssfWorkbook.createCellStyle();
hssfCellStyle.setDataFormat(format);
// 3.创建数据
Hero hero1 = new Hero("1", "李白", new Date());
Hero hero2 = new Hero("2", "韩信", new Date());
Hero hero3 = new Hero("3", "马克菠萝", new Date());
ArrayList<Hero> heroArrayList = new ArrayList<>();
heroArrayList.add(hero1);
heroArrayList.add(hero2);
heroArrayList.add(hero3);
// 4.创建标题行
HSSFRow titleRow = hssfSheet.createRow(0);
String[] strings = {"id","姓名","生日"};
for(int i = 0; i < strings.length; i++){
titleRow.createCell(i).setCellValue(strings[i]);
}
// 5.创建填充内容
for (int i = 0; i < heroArrayList.size(); i++){
HSSFRow row = hssfSheet.createRow(i + 1);
row.createCell(0).setCellValue(heroArrayList.get(i).getId());
row.createCell(1).setCellValue(heroArrayList.get(i).getName());
//row.createCell(2).setCellValue(heroArrayList.get(i).getBir());
HSSFCell hssfCell = row.createCell(2);
hssfCell.setCellStyle(hssfCellStyle);
hssfCell.setCellValue(heroArrayList.get(i).getBir());
}
// 6.将内容输出
hssfWorkbook.write(new FileOutputStream(new File("d:/poiOutput2Test.xls")));
}
运行结果:
五、POI导入
// poi导出
// 测试
// 运行单元测试
// ok
@Test
public void poiInputTest() throws Exception{
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(new File("d:/poiOutput2Test.xls")));
HSSFSheet hssfSheet = hssfWorkbook.getSheet("英雄名单");
int lastRowNum = hssfSheet.getLastRowNum();
for (int i = 1 ; i <= lastRowNum; i++){
HSSFRow row = hssfSheet.getRow(i);
HSSFCell id = row.getCell(0);
HSSFCell name = row.getCell(1);
HSSFCell bir = row.getCell(2);
Hero hero = new Hero();
hero.setId(id.toString());
hero.setName(name.getStringCellValue());
hero.setBir(bir.getDateCellValue());
System.out.println(hero);
/**
Hero(id=1, name=李白, bir=Mon Jan 20 00:29:24 CST 2020)
Hero(id=2, name=韩信, bir=Mon Jan 20 00:29:24 CST 2020)
Hero(id=3, name=马克菠萝, bir=Mon Jan 20 00:29:24 CST 2020)
*/
}
}