java基础知识—POI
i.POI-Excel写操作
1.新建一个maven项目
2.添加依赖坐标
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--03(xls)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!--07(xlsx)-->
<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.5</version>
</dependency>
3.代码实现
i.03版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite03(){
//1.创建一个工作簿
Workbook workbook = new HSSFWorkbook();
//2.工作簿中创建一张表
Sheet sheet = workbook.createSheet();
//3.表中创建一个行,索引从零开始
//第一行
Row row1 = sheet.createRow(0);
//4.行中创建一个单元格
Cell cell1 = row1.createCell(0);
cell1.setCellValue("qzp");
Cell cell2 = row1.createCell(1);
cell2.setCellValue("你加油啊!");
Cell cell = row1.createCell(2);
String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
cell.setCellValue(time);
//第二行
Row row2 = sheet.createRow(1);
//4.行中创建一个单元格
Cell cell3 = row2.createCell(0);
cell3.setCellValue("中国");
Cell cell4 = row2.createCell(1);
cell4.setCellValue("加油");
Cell cell5 = row2.createCell(2);
cell5.setCellValue(time);
OutputStream outputStream = null;
try {
//生成一张表,使用IO流传输,03版本使用.xls结尾!
outputStream = new FileOutputStream(basepath+"qzp工作表03.xls");
//将数据写出到输出流中
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ii.07版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite07(){
//1.创建一个工作簿
Workbook workbook = new XSSFWorkbook();
//2.工作簿中创建一张表
Sheet sheet = workbook.createSheet();
//3.表中创建一个行,索引从零开始
//第一行
Row row1 = sheet.createRow(0);
//4.行中创建一个单元格
Cell cell1 = row1.createCell(0);
cell1.setCellValue("qzp");
Cell cell2 = row1.createCell(1);
cell2.setCellValue("你加油啊!");
Cell cell = row1.createCell(2);
String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
cell.setCellValue(time);
//第二行
Row row2 = sheet.createRow(1);
//4.行中创建一个单元格
Cell cell3 = row2.createCell(0);
cell3.setCellValue("中国");
Cell cell4 = row2.createCell(1);
cell4.setCellValue("加油");
Cell cell5 = row2.createCell(2);
cell5.setCellValue(time);
OutputStream outputStream = null;
try {
//生成一张表,使用IO流传输,07版本使用.xlsx结尾!
outputStream = new FileOutputStream(basepath+"qzp工作表07.xlsx");
//将数据写出到输出流中
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ii.POI-Excel批量数据导入操作
1.03版本大文件写HSSFWorkbook
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite03BigData(){
long begin = System.currentTimeMillis();
//1.创建一个工作簿
Workbook workbook = new HSSFWorkbook();
//2.工作簿中创建一张表
Sheet sheet = workbook.createSheet();
//3.使用for循环模拟大量数据写入
for (int rowNum = 0; rowNum < 65535; rowNum++) {
//4.创建行
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10; cellNum++) {
//5.创建单元格
Cell cell = row.createCell(cellNum);
//6.填写数据
cell.setCellValue("第"+(cellNum+1)+"格");
}
}
System.out.println("数据填写完成");
OutputStream outputStream = null;
try {
//生成一张表,使用IO流传输,03版本使用.xls结尾!
outputStream = new FileOutputStream(basepath+"qzp批量数据操作工作表03.xls");
//将数据写出到输出流中
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long end = System.currentTimeMillis();
System.out.println("填写数据完毕的时间"+(end-begin));
}
缺点:最多只能处理65535行数据,否则就报异常信息
java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
优点:过程中数据全部写入缓存,不操作磁盘,最有一次性写入到磁盘中,速度快
2.07版本大文件写XSSFWorkbook
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite07BigData(){
long begin = System.currentTimeMillis();
//1.创建一个工作簿
Workbook workbook = new XSSFWorkbook();
//2.工作簿中创建一张表
Sheet sheet = workbook.createSheet();
//3.使用for循环模拟大量数据写入
for (int rowNum = 0; rowNum < 1000000; rowNum++) {
//4.创建行
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10; cellNum++) {
//5.创建单元格
Cell cell = row.createCell(cellNum);
cell.setCellValue("第"+(cellNum+1)+"格");
}
}
System.out.println("数据填写完成");
OutputStream outputStream = null;
try {
//生成一张表,使用IO流传输,07版本使用.xlsx结尾!
outputStream = new FileOutputStream(basepath+"qzp批量数据操作工作表03.xlsx");
//将数据写出到输出流中
workbook.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long end = System.currentTimeMillis();
System.out.println("填写数据完毕的时间"+(end-begin));
}
缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出
优点:可以写入较大的数据量
3.07版本升级版大文件写SXSSFWorkbook
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06poi\\src\\main\\resources\\basepath\\";
@Test
public void testWrite07BigDataPlus(){
long begin = System.currentTimeMillis();
//1.创建一个工作簿
Workbook workbook = new SXSSFWorkbook();
//2.工作簿中创建一张表
Sheet sheet = workbook.createSheet();
//3.使用for循环模拟大量数据写入
for (int rowNum = 0; rowNum < 1000000; rowNum++) {
//4.创建行
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10; cellNum++) {
//5.创建单元格
Cell cell = row.createCell(cellNum);
//6.填写数据
cell.setCellValue("第"+(cellNum+1)+"格");
}
}
System.out.println("数据填写完成");
OutputStream outputStream = null;
try {
//生成一张表,使用IO流传输,07版本使用.xlsx结尾!
outputStream = new FileOutputStream(basepath+"qzp批量数据操作工作表03.xlsx");
//将数据写出到输出流中
workbook.write(outputStream);
//清除临时文件
((SXSSFWorkbook) workbook).dispose();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long end = System.currentTimeMillis();
System.out.println("填写数据完毕的时间"+(end-begin));
}
优点:
- 可以写入较大的数据量,如100万条数据甚至更多,写的速度非常块,占用更少内存
- 可以自定义数据量的大小,使用new SXSSFWorkbook(数据量大小)
缺点:
- 过程中会产生临时文件,需要及时清理临时文件
- 默认上限写100条记录被保存到内存中,如果超过这数量,则之前写入的文件会被写入到临时文件中
- 注意,可能会消耗大量内存,这些内存基于你正在使用的功能,如合并区域,注释…仍然只存储在内存中,广泛使用,可能需要大量内存
注意事项:
- 03版和07版的文件后缀不一样,03版本使用.xls结尾,07版本使用.xlsx结尾!
- 03版和07版的创建工作簿对象不一样
- 03版行数有限制,只有65535行,07版行数限制(1048575)
iii.POI-Excel读操作
代码实现
i.03版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void test03Read(){
//1.创建读取文件的流对象
FileInputStream fileInputStream = null;
try {
//2.将表中数据加载到流对象中
fileInputStream = new FileInputStream(basepath + "qzp工作表03.xls");
// 3.创建一个工作簿,将流中的表加入到工作簿中
Workbook Workbook = new HSSFWorkbook(fileInputStream);
//4.获取表,通过下标获取,也可以通过表名
Sheet sheet = Workbook.getSheetAt(0);
//5.获取表中的行
Row row = sheet.getRow(0);
//6.获取行中的单元格
Cell cell = row.getCell(0);
//7.获取单元格的内容,需要根据单元格的数据的类型进行对应的数据获取,否则类型异常
String value = cell.getStringCellValue();
System.out.println(value);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
ii.07版本
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void test07Read(){
//1.创建读取文件的流对象
FileInputStream fileInputStream = null;
try {
//2.将表中数据加载到流对象中
fileInputStream = new FileInputStream(basepath + "qzp工作表07.xlsx");
// 3.创建一个工作簿,将流中的表加入到工作簿中
Workbook Workbook = new XSSFWorkbook(fileInputStream);
//4.获取表,通过下标获取,也可以通过表名
Sheet sheet = Workbook.getSheetAt(0);
//5.获取表中的行
Row row = sheet.getRow(0);
//6.获取行中的单元格
Cell cell = row.getCell(0);
//7.获取单元格的内容,需要根据单元格的数据的类型进行对应的数据获取,否则类型异常
String value = cell.getStringCellValue();
System.out.println(value);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
iv.POI-Excel批量数据导出操作
代码实现:
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testCellType(){
//1.创建读取文件的流对象
FileInputStream fileInputStream = null;
try {
//2.将表中数据加载到流对象中
fileInputStream = new FileInputStream(basepath + "qzp.xlsx");
// 3.创建一个工作簿,将流中的表加入到工作簿中
Workbook Workbook = new XSSFWorkbook(fileInputStream);
//4.获取表的标题内容,通过下标获取,也可以通过表名
Sheet sheet = Workbook.getSheetAt(0);
//5.获取表中的行的总数
int rowCount = sheet.getPhysicalNumberOfRows();
for (int rowNum = 0; rowNum < rowCount; rowNum++) {
//6.获取每一行的数据
Row row = sheet.getRow(rowNum);
if(row != null){
//6.读取一整行数据中的列数总合
int cellCount = row.getPhysicalNumberOfCells();
for (int cellNum = 0; cellNum < cellCount; cellNum++) {
//7.获取每一个单元格
Cell cell = row.getCell(cellNum);
//System.out.println("【"+(rowNum+1)+"-"+(cellNum+1)+"】");
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 = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BLANK://-空
System.out.print("【Blank】");
break;
case HSSFCell.CELL_TYPE_NUMERIC://-数字(包含日期,普通数字)
System.out.print("【Number】");
if(HSSFDateUtil.isCellDateFormatted(cell)){
System.out.print("【Date】");//-日期
Date dateCellValue = cell.getDateCellValue();
cellValue = new DateTime(dateCellValue).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("【Error】");
break;
}
System.out.println(cellValue);
}
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
v.计算公式
//表存放的地址
String basepath="F:\\ideaProject\\Myproject5\\Spring\\spring-06-poi\\src\\main\\resources\\basepath\\";
@Test
public void testFormuls(){
//1.创建读取文件的流对象
FileInputStream fileInputStream = null;
try {
//2.将表中数据加载到流对象中
fileInputStream = new FileInputStream(basepath + "qzp计算公式.xls");
// 3.创建一个工作簿,将流中的表加入到工作簿中
Workbook workbook = new HSSFWorkbook(fileInputStream);
//4.获取表,通过下标获取,也可以通过表名
Sheet sheet = workbook.getSheetAt(0);
//5.获取表中的索引指代的行
Row row = sheet.getRow(4);
//6.获取当前的单元格
Cell cell = row.getCell(0);
//7.获取到计算公式
FormulaEvaluator formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);
//8.获取单元格的内容的类型
int cellType = cell.getCellType();
System.out.println(cellType);
switch (cellType){
case Cell.CELL_TYPE_FORMULA://公式
String cellFormula = cell.getCellFormula();
System.out.println(cellFormula);
//计算
CellValue evaluate = formulaEvaluator.evaluate(cell);
String cellvalue = evaluate.formatAsString();
System.out.println(cellvalue);
break;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(fileInputStream != null){
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}