一、什么是POI
Apache POI 是一种流行的API,可以使用Java读写MS Excel文件,可以使用Java读写MS Word和MS PowerPoint文件。
POI主要模块
模块名字 | 描述 |
---|---|
HSSF | 提供读写Microsoft Excel XLS格式(Microsoft Excel 97 (-2003))档案的功能 |
XSSF | 提供读写Microsoft Excel OOXML XLSX格式(Microsoft Excel XML (2007+))档案的功能 |
SXSSF | 提供低内存占用量读写Microsoft Excel OOXML XLSX格式档案的功能 |
HWPF | 提供读写Microsoft Word DOC97格式(Microsoft Word 97 (-2003))档案的功能 |
XWPF | 提供读写Microsoft Word DOC2003格式(WordprocessingML (2007+))档案的功能 |
HSLF/XSLF | 提供读写Microsoft PowerPoint格式档案的功能 |
HDGF/XDGF | 提供读Microsoft Visio格式档案的功能 |
HPBF | 提供读Microsoft Publisher格式档案的功能 |
HSMF | 提供读Microsoft Outlook格式档案的功能 |
二、操作Excel常用类
HSSFWorkbook excel文档对象
HSSFSheet excel的sheet
HSSFRow excel的行
HSSFCell excel的单元格
HSSFFont excel字体
HSSFName 名称
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾
HSSFCellStyle cell样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
三、操作Excel
3.1、搭建环境
- 创建Maven项目
- 导入依赖
<dependencies>
<!--easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta2</version>
</dependency>
<!-- xls03版本-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- xlsx07版本-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- 日期格式化工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
3.2、写操作
3.2.1、Excel.xls(03)版本写
- 创建测试方法
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.junit.Test;
import java.io.FileOutputStream;
public class TestWrite {
//生成的文档的地址为桌面
String path = "C:\\Users\\彬彬\\Desktop\\";
/**
* 测试Excel.xls03版本
*/
@Test
public void writeXls03 () throws Exception {
//创建文档对象
Workbook wk =new HSSFWorkbook();
//通过文档对象创建工作簿
Sheet sheet = wk.createSheet();
//通过工作簿对象创建行 0代表第一行
Row row=sheet.createRow(0);
//通过行对象创建列(单元格),0代表第一列
Cell cell = row.createCell(0);
cell.setCellValue("这是第一行第一列");
Cell cell1 = row.createCell(1);
cell1.setCellValue("这是第一行第二列");
Row row1 = sheet.createRow(1);
//通过行对象创建列(单元格),0代表第一列
Cell cell2 = row1.createCell(0);
cell2.setCellValue("这是第二行第一列");
Cell cell13 = row1.createCell(1);
cell13.setCellValue("这是第二行第二列");
//通过流输出文档对象
FileOutputStream fos = new FileOutputStream(path+"test.xls");
//向文档对象传入流对象进行写操作
wk.write(fos);
System.out.println("写操作成功!!!");
//关闭流
fos.close();
}
}
- 执行代码后查看桌面是否生成xls(Excel03版本)文件
- 生成文件成功点击查看
xls文档有内容说明操作成功
大数据批量写操作(Excel.xls 03版本)
注意:03版本最多支持65536行数据,最大列256列
/**
* 03版 批量写
* @throws Exception
*/
@Test
public void writeXls03d () throws Exception {
//获得写操作开始时间
long start=System.currentTimeMillis();
//创建文档对象
Workbook wk =new HSSFWorkbook();
//通过文档对象创建工作簿
Sheet sheet = wk.createSheet("测试表1");
for (int rowNum = 0; rowNum <65535 ; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum <10 ; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue(cellNum);
}
}
//通过流输出文档对象
FileOutputStream fos = new FileOutputStream(path+"test1.xls");
//向文档对象传入流对象进行写操作
wk.write(fos);
//获得写操作结束的时间
long end = System.currentTimeMillis();
System.out.println("批量写操作成功!!!");
System.out.println("批量写操作总共用时:"+(double)(end-start)/1000+"秒");
//关闭流
fos.close();
}
批量写操作成功!!!
批量写操作总共用时:2.43秒
- 批量写成功
3.2.2、Excel.xls(07)版本写
当写的数量大于65536,我们可以使用XSSFWorkbook对象操作Excel.xlsx(07),最大数量可以写到1048576行,最大列数为16384列。
- XSSFWorkbook对象实现少数量写
@Test
public void writePoI07 () throws IOException {
//row --行从0开始0代表第一行
//cell --列 0开始,0代表第一列
//创建工作簿
Workbook wk = new XSSFWorkbook();
//创建工作表
Sheet sh = wk.createSheet("周先生统计表");
//创建行(1,1)
Row row = sh.createRow(0);
//创建单元格
Cell cell = row.createCell(0);
//写数据
cell.setCellValue("姓名");
Cell cell1 = row.createCell(1);
cell1.setCellValue("周彬彬");
Row row2=sh.createRow(1);
Cell cells=row2.createCell(0);
cells.setCellValue("注册日期");
Cell cell2 = row2.createCell(1);
String date = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
cell2.setCellValue(date);
//创建文件流,生存一张表
FileOutputStream fos = new FileOutputStream(path + "666.xlsx");
//把文件写入工作簿中
wk.write(fos);
//关闭流
fos.close();
System.out.println("输出完毕!!!!!!");
}
- 少数量写成功
07版本大数量写
@Test
public void writeXls07d () throws Exception {
//获得写操作开始时间
long start=System.currentTimeMillis();
//创建文档对象
Workbook wk =new XSSFWorkbook();
//通过文档对象创建工作簿
Sheet sheet = wk.createSheet("07大数据写");
for (int rowNum = 0; rowNum <100000 ; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum <10 ; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue(cellNum);
}
}
//通过流输出文档对象
FileOutputStream fos = new FileOutputStream(path+"testS.xls");
//向文档对象传入流对象进行写操作
wk.write(fos);
//获得写操作结束的时间
long end = System.currentTimeMillis();
System.out.println("批量写操作成功!!!");
System.out.println("批量写操作总共用时:"+(double)(end-start)/1000+"秒");
//关闭流
fos.close();
}
批量写操作成功!!!
批量写操作总共用时:13.365秒
3.2.3、SXSSFWorkbook(07)写
如果像读写操作速度效率更高可以使用,SXSSFWorkbook对象。
@Test
public void writeXls07dS () throws Exception {
//获得写操作开始时间
long start=System.currentTimeMillis();
//创建文档对象
Workbook wk =new SXSSFWorkbook();
//通过文档对象创建工作簿
Sheet sheet = wk.createSheet("07大数据写");
for (int rowNum = 0; rowNum <1000000 ; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum <10 ; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue(cellNum);
}
}
//通过流输出文档对象
FileOutputStream fos = new FileOutputStream(path+"testSS.xls");
//向文档对象传入流对象进行写操作
wk.write(fos);
//获得写操作结束的时间
long end = System.currentTimeMillis();
System.out.println("批量写操作成功!!!");
System.out.println("批量写操作总共用时:"+(double)(end-start)/1000+"秒");
//关闭流
fos.close();
}
批量写操作成功!!!
批量写操作总共用时:11.427秒
3.3、读操作
3.3.1、Excel.xls(03)和Excel.xls(07)版本读
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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 org.joda.time.DateTime;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
public class ReadPol07 {
String path ="C:\\Users\\彬彬\\Desktop\\666.xlsx";
//读取不同类型的数据
//07版本读
@Test
public void readPOIs07Type() throws IOException {
//获取文件流
FileInputStream fis = new FileInputStream(path);
// 创建一个工作簿。 使用excel能操作的这边他都可以操作!
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
// 获取标题内容
Row rowTitle = sheet.getRow(0);
if (rowTitle != null) {
// 一定要掌握
int cellCount = rowTitle.getPhysicalNumberOfCells(); // 拿到列数
for (int cellNum = 0; cellNum < cellCount; cellNum++) { // 遍历
Cell cell = rowTitle.getCell(cellNum);
if (cell != null) {
int cellType = cell.getCellType();
String cellValue = cell.getStringCellValue();
System.out.print(cellValue + " | ");
}
}
System.out.println();
}
// 获取表中的内容
int rowCount = sheet.getPhysicalNumberOfRows(); //多少行
for (int rowNum = 1; rowNum < rowCount; rowNum++) {
Row rowData = sheet.getRow(rowNum);
if (rowData != null) {
// 读取列
int cellCount = rowTitle.getPhysicalNumberOfCells();
for (int cellNum = 0; cellNum < cellCount; cellNum++) {
System.out.print("[" + (rowNum + 1) + "-" + (cellNum + 1) + "]");
Cell cell = rowData.getCell(cellNum);
// 匹配列的数据类型
if (cell != null) {
int cellType = cell.getCellType();
String cellValue = "";
switch (cellType) {
case HSSFCell.CELL_TYPE_STRING: // 字符串
System.out.print("【String】");
cellValue = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN: // 布尔
System.out.print("【BOOLEAN】");
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK: // 空
System.out.print("【BLANK】");
break;
case HSSFCell.CELL_TYPE_NUMERIC: // 数字(日期、普通数字)
System.out.print("【NUMERIC】");
if (HSSFDateUtil.isCellDateFormatted(cell)) { // 日期
System.out.print("【日期】");
Date date = cell.getDateCellValue();
cellValue = new DateTime(date).toString("yyyy-MM-dd");
} else {
// 不是日期格式,防止数字过长!
System.out.print("【转换为字符串输出】");
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cellValue = cell.toString();
}
break;
case HSSFCell.CELL_TYPE_ERROR:
System.out.print("【数据类型错误】");
break;
}
System.out.println(cellValue);
}
}
}
}
fis.close();
}
}
//03版本读把文档对象换成HSSFWorkbook,读取的文件类型改成.xls
Workbook workbook = new HSSFWorkbook();
String path ="C:\\Users\\彬彬\\Desktop\\666.xls";
四、EasyPOI
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板语言(熟悉的表达式语法),完成以前复杂的写法.
参照官网学习:EasyPOI
本文含有隐藏内容,请 开通VIP 后查看