apache poi官网:https://poi.apache.org/(基础架子拿来就能用,特殊功能请参阅官方文档)
org.apache.poi poi 3.9 org.apache.poi poi-ooxml 3.9 joda-time joda-time 2.10.1 junit junit 4.12
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class UseExcelForPOI {
private String userDir = System.getProperty("user.dir");
//使用POI进行简单得写操作
@Test
public void test03_07ExcelWrite(){
//创建工作簿03|07 07将所有得HSSF换成XSSF即可
HSSFWorkbook workbook = new HSSFWorkbook();
//创建工作表(sheet)
HSSFSheet sheet = workbook.createSheet("sheet1");
//创建一行并将一些单元格放入其中。行是基于 0 的。
HSSFRow row = sheet.createRow(0);
//创建一个单元格并在其中放入一个值。
row.createCell(0).setCellValue("商品名称");
row.createCell(1).setCellValue("比巴伯");
//第二行
HSSFRow row1 = sheet.createRow(1);
row1.createCell(0).setCellValue("价格");
row1.createCell(1).setCellValue("0.5");
//写入文件
FileOutputStream fo = null;
try {
//03版本后缀xls,07版本后缀xlsx
fo = new FileOutputStream(new File(userDir + "/商品信息表.xls"));
workbook.write(fo);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
(之前为简单示例)数据批量导入
大文件写HSSF
缺点:最多只能处理65536行,超出抛异常
优点:过程中写入缓存,不操作磁盘,最后一次写入磁盘,速度快
@Test
public void mul03ExcelTest() {
//统计开始时间
long start= System.currentTimeMillis();
//创建工作簿03
Workbook workbook = new HSSFWorkbook();
//创建工作表(sheet)
Sheet sheet = workbook.createSheet("sheet1");
//对65535行单元格进行赋值,此处不能使用链式编程,会导致前面单元格没值;65536会报错
for (int i = 0; i < 65535 ; i++) {
Row row = sheet.createRow(i);
for (int j = 0; j < 10; j++) {
row.createCell(j)
.setCellValue(j);
}
}
//写入文件
FileOutputStream fo = null;
try {
//03版本后缀xls,07版本后缀xlsx
fo = new FileOutputStream(new File(userDir + "/商品信息表.xls"));
workbook.write(fo);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//统计结束时间
long end= System.currentTimeMillis();
System.out.println((end-start)/1000.0);
}
运行结果:1.32
Process finished with exit code 0
大文件写XSSF
缺点:写数据速度非常慢,非常耗内存,由于会将写入得数据都暂存在内存中最后一次性写入磁盘,所以会发生内存溢出
优点:可以写较大数据量文件,写入数量看计算机内存。
@Test
public void mul03_07ExcelTest() {
//统计开始时间
long start= System.currentTimeMillis();
//创建工作簿03|07 07将所有得HSSF换成XSSF即可
Workbook workbook = new XSSFWorkbook();
//创建工作表(sheet)
Sheet sheet = workbook.createSheet("sheet1");
//对65535行单元格进行赋值,此处不能使用链式编程,会导致前面单元格没值
for (int i = 0; i < 65535 ; i++) {
Row row = sheet.createRow(i);
for (int j = 0; j < 10; j++) {
row.createCell(j)
.setCellValue(j);
}
}
//写入文件
FileOutputStream fo = null;
try {
//03版本后缀xls,07版本后缀xlsx
fo = new FileOutputStream(new File(userDir + "/商品信息表.xlsx"));
workbook.write(fo);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//统计结束时间
long end= System.currentTimeMillis();
System.out.println((end-start)/1000.0);
}
运行结果:7.454
Process finished with exit code 0
大文件写SXSSF(XSSF优化)
优点:是XSSF得优化方案,写速度快,占用更少内存,可以写大数据量到excel,如100万条或者更多
注意:
1.过程中会产生临时文件,需要清理临时文件
2.默认有100条记录被保存在内存中,超过数量,将会将前面得100条数据全部写入临时文件
3.想要自定义内存数据量,可以使用new SXSSFWorkbook(数量)
@Test
public void mul07SuperExcelTest() {
//统计开始时间
long start= System.currentTimeMillis();
//创建工作簿03
Workbook workbook = new SXSSFWorkbook();
//创建工作表(sheet)
Sheet sheet = workbook.createSheet("sheet1");
//对65535行单元格进行赋值,此处不能使用链式编程,会导致前面单元格没值;65536会报错
for (int i = 0; i < 65535 ; i++) {
Row row = sheet.createRow(i);
for (int j = 0; j < 10; j++) {
row.createCell(j)
.setCellValue(j);
}
}
//写入文件
FileOutputStream fo = null;
try {
//03版本后缀xls,07版本后缀xlsx
fo = new FileOutputStream(new File(userDir + "/商品信息表.xlsx"));
workbook.write(fo);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
//释放临时文件
((SXSSFWorkbook) workbook).dispose();
//释放资源
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//统计结束时间
long end= System.currentTimeMillis();
System.out.println((end-start)/1000.0);
}
运行结果:1.675
Process finished with exit code 0
POI实现读操作(通用,别问,问就是你随意整个excel第一行为表头就行,注意后缀名,03使用xls,HSSF;07使用xlsx,XSSF)
@Test
public void testCellType() throws Exception {
InputStream is = new FileInputStream(userDir+"/food.xls");
Workbook workbook = new HSSFWorkbook(is);
Sheet sheet = workbook.getSheetAt(0);
// 读取标题所有内容
Row rowTitle = sheet.getRow(0);
if (rowTitle != null) {// 行不为空
// 读取cell
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) {// 行不为空
// 读取cell
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】");
//cellValue = String.valueOf(cell.getNumericCellValue());
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 Cell.CELL_TYPE_ERROR:
System.out.print("【数据类型错误】");
break;
}
System.out.println(cellValue);
}
}
}
}
is.close();
}



