前面学习了word操作用到的POI-TL:
POI-TL入门
既然学了java对word的操作,那么excel也不能落下。
目录
一、POI-OOXML定义
对excel处理的框架,处理excel2007版本以上的文档,是poi的升级版本,处理的单页数据量也是百万级别的。
二、使用POI-OOXML
2.1 依赖注入
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>
2.2 基础操作
2.2.1 创建工作簿
Workbook workbook = new HSSFWorkbook();
2.2.2 新建sheet页
/**
* @sheetName : sheet页面
**/
new Workbook.createSheet(String sheetName);
/**
* 以sheet+[n]增序的形式创建sheet页面
**/
Sheet sheet = new Workbook.createSheet();
示例:
public void createSheetPage(String file) throws IOException {
//新建一个工作簿
Workbook workbook = new HSSFWorkbook();
//创建sheet页
//创建sheet页
workbook.createSheet("测试页");
workbook.createSheet("第二页");
FileOutputStream fout = new FileOutputStream(file);
workbook.write(fout);
fout.close();
workbook.close();
}
效果:
模板 | 结果 |
---|---|
注意
sheet页不会自动插入原有页之后,而是按顺序自动覆盖
2.2.3 新建行和列
创建的行和列都是从索引0开始,而且需先创建sheet页先。
//创建第n行
Row row = sheet.createRow(int n);
//新建第n个单元格
Cell cell = row.createCell(int n);
//设置单元格的值
cell.setCellValue("这是第一个单元格");
示例:
public void createRowAndCell(String file) throws IOException{
//新建一个工作簿
Workbook workbook = new HSSFWorkbook();
//创建sheet页
Sheet sheet =workbook.createSheet();
//创建第一行
Row row = sheet.createRow(0);
//新建单元格
Cell cell = row.createCell(0);
cell.setCellValue("这是第一个单元格");
FileOutputStream fout = new FileOutputStream(file);
workbook.write(fout);
fout.close();
workbook.close();
}
效果:
2.2.4 单元格格式化
除了单纯的文本单元格,有的时候我们还需要一些特殊的单元格,例如时间单元格。通过以下两个类即可实现:
CreationHelper :创建工具类
CellStyle : 单元格样式类
示例
public void createFormatCell(String file) throws IOException{
//新建一个工作簿
Workbook workbook = new HSSFWorkbook();
//创建sheet页
Sheet sheet =workbook.createSheet();
//创建第一行
Row row = sheet.createRow(0);
//新建单元格
Cell cell = row.createCell(0);
cell.setCellValue(new Date());
//获取工具类
CreationHelper creationHelper = workbook.getCreationHelper();
//单元格样式类
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
cell.setCellStyle(cellStyle);
FileOutputStream fout = new FileOutputStream(file);
workbook.write(fout);
fout.close();
workbook.close();
}
效果:
2.2.5 获取工作表
/**
* inputStream : 输入流
* */
HSSFWorkbook workbook = new HSSFWorkbook(InputStream inputStream)
2.2.6 获取sheet页
//获取第几页
workbook.getSheetAt(int page);
2.2.7 获取行
//获取第几行
sheet.getRow(rowNum);
//获取第一条数据的行数
sheet.getFirstRowNum();
//获取表格数据总行数
sheet.getPhysicalNumberOfRows()
示例 :
//获取sheet页
public void getRow(String fileName) throws IOException{
File file = new File(fileName);
if(!file.exists()){
throw new IOException("文件不存在");
}
FileInputStream fin = new FileInputStream(file);
//获取工作簿
HSSFWorkbook workbook = new HSSFWorkbook(fin);
//获取页
HSSFSheet sheet = workbook.getSheetAt(0);
//获取行
HSSFRow row = sheet.getRow(0);
System.out.println("第一行数据在第:"+sheet.getFirstRowNum()+"行");
System.out.println("总行数:"+sheet.getPhysicalNumberOfRows());
}
效果:
2.2.8 获取单元格
这个是获取excel数据的重点,要注意的是根据数据类型的不同,使用对应的转换数据方法。
- 使用getCellType()获取单元格数据类型
数据类型 | 值 |
---|---|
数字 | NUMERIC(CellType.NUMERIC) |
字符串 | STRING(CellType.STRING) |
布尔 | BOOLEAN(CellType.BOOLEAN) |
- 根据不同类型使用不同方法获取
getNumericCellValue();//获取数字类型单元格的值,返回double类型
getBooleanCellValue();//获取布尔类型单元格的值
getStringCellValue();//获取字符串类型单元格的值
excel中的日期数据会被识别为:NUMERIC类型,需要先根据格式判断,然后进行格式化处理
if(cell.getCellStyle().getDataFormatString().equals("yyyy-MM-dd HH:mm:ss")){
Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
}
示例:
//获取sheet页
public void getCellValue(String fileName) throws IOException{
File file = new File(fileName);
if(!file.exists()){
throw new IOException("文件不存在");
}
FileInputStream fin = new FileInputStream(file);
//获取工作簿
HSSFWorkbook workbook = new HSSFWorkbook(fin);
//获取第一页
HSSFSheet sheet = workbook.getSheetAt(0);
for ( int i = sheet.getFirstRowNum();i<=sheet.getLastRowNum();i++){
//获取行
HSSFRow row = sheet.getRow(i);
if(row==null)
continue;
for(int j = row.getFirstCellNum();j<=row.getLastCellNum();j++){
HSSFCell cell = row.getCell(j);
if(cell==null)
continue;
Object object = null;
switch (cell.getCellType()){
case NUMERIC :
System.out.print("当前单元格为:数字类型,值为:");
if(cell.getCellStyle().getDataFormatString().equals("yyyy-MM-dd HH:mm:ss")){
object = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
}else{
object = cell.getNumericCellValue();
}
break;
case BOOLEAN:
System.out.print("当前单元格为:布尔类型,值为:");
object = cell.getBooleanCellValue();
break;
default:
System.out.print("当前单元格为:字符串类型,值为:");
object = cell.getStringCellValue();
}
System.out.println(object);
}
}
}
效果:
三、使用案例
3.1 导入示例
将文档的学生信息导入
public List<Student> getImportStudent(String fileName) throws IOException{
File file = new File(fileName);
if(!file.exists()){
throw new IOException("文件不存在");
}
FileInputStream fin = new FileInputStream(file);
//获取工作簿
HSSFWorkbook workbook = new HSSFWorkbook(fin);
//获取sheet页
HSSFSheet sheet = workbook.getSheetAt(0);
List<Student> students= new ArrayList<>();
//取第一行的下一行
for ( int i = sheet.getFirstRowNum()+1;i<=sheet.getLastRowNum();i++){
//获取行
HSSFRow row = sheet.getRow(i);
if(row==null)
continue;
Student student = new Student();
student.setName(row.getCell(0).getStringCellValue());
student.setAge((int)row.getCell(1).getNumericCellValue());
students.add(student);
}
return students;
}
3.2 导出示例
将数据写入到excel中
public void exportStudent(String fileName,List<Student> students) throws IOException{
if(students.size()<=0){
return ;
}
//新建一个工作簿
Workbook workbook = new HSSFWorkbook();
//创建sheet页
Sheet sheet =workbook.createSheet();
for(int i =0;i<students.size();i++){
Row row = sheet.createRow(i);
Cell cell1 = row.createCell(0);
cell1.setCellValue(students.get(i).getName());
Cell cell2 = row.createCell(1);
cell2.setCellValue(students.get(i).getAge());
}
FileOutputStream fout = new FileOutputStream(fileName);
workbook.write(fout);
fout.close();
workbook.close();
}
效果:
补充
两个示例只是非常简单的演示了很基础的导入和导出,实际开发绝对没这么简单。
好了,基本就是这样,等后面有学习到新的知识再说。