一 POI 介绍
POI简介(Apache POI),Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
- HSSF - 提供读写Microsoft Excel格式档案的功能。(.xls)
- XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。(.xlsx)
- HWPF - 提供读写Microsoft Word格式档案的功能。
- HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
- HDGF - 提供读写Microsoft Visio格式档案的功能。
二 导入依赖 – 以Excel为例
Excel文件后缀,2007版本为xlsx,2003版本为xls,二者所需要的依赖是不同的。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tj</groupId>
<artifactId>poi-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--xls(03)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!--xlsx(07)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!--日期格式化工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<!--test-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
三 Demo测试
package cn.tj;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class ExcelTest {
@Test
public void testExcel2003Write() throws Exception {
// 1.创建工作簿/工作表 Excel2003需要使用的处理类是 HSSFWorkbook
Workbook wb = new HSSFWorkbook();
// 2.创建 sheet 页
Sheet sheet = wb.createSheet("疫苗统计");
// 3.创建行 行索引是从0开始的
Row row0 = sheet.createRow(0);
// 4.创建单元格
row0.createCell(0).setCellValue("今日人数");
row0.createCell(1).setCellValue("666");
// 创建另一行
Row row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("统计时间");
row1.createCell(1).setCellValue(new DateTime().toString("YYYY-MM-dd HH:mm:ss"));
// 将文件输出到指定目录
FileOutputStream fos = new FileOutputStream("E:/excel2003Data.xls");
wb.write(fos);
// 释放资源
fos.close();
wb.close();
}
@Test
public void testExcel2007Write() throws Exception {
// 1.创建工作簿/工作表 Excel2003需要使用的处理类是 HSSFWorkbook
Workbook wb = new XSSFWorkbook();
// 2.创建 sheet 页
Sheet sheet = wb.createSheet("疫苗统计2007");
// 3.创建行 行索引是从0开始的
Row row0 = sheet.createRow(0);
// 4.创建单元格
row0.createCell(0).setCellValue("今日人数");
row0.createCell(1).setCellValue("666");
// 创建另一行
Row row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("统计时间");
row1.createCell(1).setCellValue(new DateTime().toString("YYYY-MM-dd HH:mm:ss"));
// 将文件输出到指定目录
FileOutputStream fos = new FileOutputStream("E:/excel2007Data.xlsx");
wb.write(fos);
// 释放资源
fos.close();
wb.close();
}
@Test
public void testExcel2003WriteBigData() throws Exception {
// 记录运行时间
long start = System.currentTimeMillis();
// 1.创建工作簿/工作表 Excel2003需要使用的处理类是 HSSFWorkbook
Workbook wb = new HSSFWorkbook();
// 2.创建 sheet 页
Sheet sheet = wb.createSheet("疫苗统计BigData2003");
for (int i = 0; i < 6; i++) {
Row row = sheet.createRow(i);
row.createCell(0).setCellValue("6666");
}
// 将文件输出到指定目录
FileOutputStream fos = new FileOutputStream("E:/excelBigData2003.xls");
wb.write(fos);
// 释放资源
fos.close();
wb.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
@Test
public void testExcel2007WriteBigData() throws Exception {
// 记录运行时间
long start = System.currentTimeMillis();
// 1.创建工作簿/工作表 Excel2003需要使用的处理类是 HSSFWorkbook
Workbook wb = new XSSFWorkbook();
// 2.创建 sheet 页
Sheet sheet = wb.createSheet("疫苗统计BigData2007");
for (int i = 0; i < 200000; i++) {
Row row = sheet.createRow(i);
row.createCell(0).setCellValue("6666");
}
// 将文件输出到指定目录
FileOutputStream fos = new FileOutputStream("E:/excelBigData2007.xlsx");
wb.write(fos);
// 释放资源
fos.close();
wb.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
@Test
public void testExcel2007WriteBigDataFast() throws Exception {
// 记录运行时间
long start = System.currentTimeMillis();
// 1.创建工作簿/工作表 Excel2003需要使用的处理类是 HSSFWorkbook
SXSSFWorkbook wb = new SXSSFWorkbook();
// 2.创建 sheet 页
Sheet sheet = wb.createSheet("疫苗统计BigDataFast2007");
for (int i = 0; i < 200000; i++) {
Row row = sheet.createRow(i);
row.createCell(0).setCellValue("6666");
}
// 将文件输出到指定目录
FileOutputStream fos = new FileOutputStream("E:/excelBigDataFast2007.xlsx");
wb.write(fos);
// 释放临时文件
wb.dispose();
// 释放资源
fos.close();
wb.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
@Test
public void testExcel2003Read() throws Exception {
// 将需要读取的文件以输入流的形式获取
FileInputStream fis = new FileInputStream("E:/excel2003Data.xls");
// 创建工作簿
Workbook wb = new HSSFWorkbook(fis);
// 获取 sheet 页
Sheet sheet = wb.getSheetAt(0);
//System.out.println("最后一行的索引是" + sheet.getLastRowNum()); // 返回最后一行的索引 不忽略空行
//System.out.println("最后一行的索引是" + sheet.getPhysicalNumberOfRows()); // 返回实际行数 忽略空行
int lastRowNum = sheet.getLastRowNum(); // 从0开始的
for (int i = 0; i < lastRowNum + 1; i++) {
System.out.println("读取第"+i+"行数据");
Row row = sheet.getRow(i);
// 在获取单元格的长度时,是从1开始的
short lastCellNum = row.getLastCellNum();// 从1开始的
for (int j = 0; j < lastCellNum; j++) {
Cell cell = row.getCell(j);
System.out.print("单元格的内容为:" + cell + " ");
}
System.out.println();
}
wb.close();
fis.close();
}
@Test
public void testExcel2007Read() throws Exception {
// 将需要读取的文件以输入流的形式获取
FileInputStream fis = new FileInputStream("E:/excel2007Data.xlsx");
// 创建工作簿
Workbook wb = new XSSFWorkbook(fis);
// 获取 sheet 页
Sheet sheet = wb.getSheetAt(0);
//System.out.println("最后一行的索引是" + sheet.getLastRowNum()); // 返回最后一行的索引 不忽略空行
//System.out.println("最后一行的索引是" + sheet.getPhysicalNumberOfRows()); // 返回实际行数 忽略空行
int lastRowNum = sheet.getLastRowNum(); // 从0开始的
for (int i = 0; i < lastRowNum + 1; i++) {
System.out.println("读取第"+i+"行数据");
Row row = sheet.getRow(i);
// 在获取单元格的长度时,是从1开始的
short lastCellNum = row.getLastCellNum();
for (int j = 0; j < lastCellNum; j++) {
Cell cell = row.getCell(j);
System.out.print("单元格的内容为:" + cell + " ");
}
System.out.println();
}
wb.close();
fis.close();
}
@Test
public void testExcel2007ReadNotType() throws Exception {
// 将需要读取的文件以输入流的形式获取
FileInputStream fis = new FileInputStream("E:/商品信息表.xlsx");
// 创建工作簿
Workbook wb = new XSSFWorkbook(fis);
// 获取 sheet 页
Sheet sheet = wb.getSheetAt(0);
// 获取标题
Row rowTitle = sheet.getRow(0);
if(rowTitle != null){
short lastCellNum = rowTitle.getLastCellNum();
for (int i = 0; i < lastCellNum; i++) {
Cell cell = rowTitle.getCell(i);
if (cell != null) {
System.out.print(cell.getStringCellValue() + "|");
}
}
}
System.out.println();
// 获取内容
int rowIndex = sheet.getLastRowNum();
for (int i = 1; i < rowIndex + 1; i++) {
Row row = sheet.getRow(i);
if(row != null){
short lastIndex = row.getLastCellNum();
for (int j = 0; j < lastIndex; j++) {
Cell cell = row.getCell(j);
if(cell != null){
if(CellType.STRING.equals(cell.getCellType())){
System.out.print("单元格是String类型,内容为:" + cell.getStringCellValue() + "|");
} else if(CellType.NUMERIC.equals(cell.getCellType())){
// 分两种情况: 1.数值型 2.日期型
if(DateUtil.isCellDateFormatted(cell)){
// 说明是日期类型
System.out.print("单元格是Data类型,内容为:" + cell.getDateCellValue().toLocaleString() + "|");
} else {
// 说明是普通数值类型
System.out.print("单元格是Number类型,内容为:" + cell.getNumericCellValue() + "|");
}
} else if(CellType.BOOLEAN.equals(cell.getCellType())){
System.out.print("单元格是Boolean类型,内容为:" + cell.getBooleanCellValue() + "|");
} else if(CellType.BLANK.equals(cell.getCellType())){
System.out.print("单元格是Blank类型,内容为:空串|");
} else{
System.out.println("其他情况");
}
}
}
}
}
wb.close();
fis.close();
}
}