什么是POI
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
认识Excel
下图就是一个Workbook工作簿,也就是一张excel工作表。
下图是工作簿的部分组件。
上面的图片很清晰的说明了一个工作簿的组成,就和我们平时用的excel文档一样,而在我们用POI解析Excel文件时,每个组件都有相应的类,最主要的几个如下(创建一个新的工作簿):
(1) 一个Excel表格,就是一个Workbook工作簿类的对象。
Workbook workbook = new HSSFWorkbook();
(2) 一个Sheet工作表,就是一个Sheet类的对象,通过workbook获取。
Sheet sheet = workbook. createSheet(“工作表名字”);
(3) 一行,就是一个Row类的对象,通过sheet获取。
Row row = sheet. createRow(0);
(4) 一个单元格,就是一个Cell类的对象,通过row获取。
Cell cell = row.createCell((short)0);
(5)单元格格式,是一个CellStyle类的对象,通过workbook设置。
CellStyle style = workbook.createCellStyle();
(6)单元格内容格式,是一个DataFormat类的对象,通过workbook设置。
DataFormat format= workbook.createDataFormat();
POI —— Excel导入数据库思路
一. 创建一个文件流
InputStream is = new FileInputStream(excelPath);
二. 通过文件流读取已有的 Workbook工作簿(一切操作excel的基础类)。
(1)Workbook book1 = new HSSFWorkbook(is); //excel文件后缀是xls
(2)Workbook book2 = new XSSFWorkbook(is); //excel文件后缀是xlsx
三. 读取解析Sheet工作表,有两个方法:
(1)Sheet sheet = workbook.getSheet("Sheet1"); //通过表名读取工作表Sheet1
(2)Sheet sheet = workbook.getSheetAt(0); //通过索引读取第一张工作表
四. 得到工作表Sheet以后再读取每一行,将每一行存入一个实体。
Row row = sheet.getRow(rowNum); //rowNum为行号
Cell attribute = row.getCell(index); //获取每一行的每一个字段,index为列号
比如student是一个实体,那么就将获取的每个字段依次存入这个实体的每个属性中。但存入之前首先要把Cell类的值转换成实体的属性对应类型,下面我写一个方法可以将cell转换成string类型:
private String getValue(Cell cell)
{
if (null == cell)
return null;
if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN)
return String.valueOf(cell.getBooleanCellValue());
else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC)
{
DecimalFormat format = new DecimalFormat("#.##");
format.format(cell.getNumericCellValue());
return format.format(cell.getNumericCellValue());
}
else
return cell.getStringCellValue();
}
最后,将读取的每一个字段一一存入实体,将实体更新到数据库就好了。
例:Student student = new Student();
student.setName(getValue(row.getCell(1)) );
student.setPassword(getValue(row.getCell(2)) );
实现代码示例
下面的代码将一个Excel文件解析成一个List对象,可以通过List对象更新数据库表。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
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 com.students.xl.dto.StudentDTO;
//解析Excel
public class ExcelImport {
Logger log = Logger.getLogger(this.getClass().getName());
public List<StudentDTO> readExcel(String filePath){
List<StudentDTO> list = new ArrayList<StudentDTO>(); //返回的学生集合
InputStream is = null;
Workbook workbook = null;
if("".equals(filePath)){
return null;
}else{
try {
is = new FileInputStream(filePath); //创建文件流
if("xls".equals(getPostFix(filePath))){
workbook = new HSSFWorkbook(is); //xls对应的HSSFWorkbook工作簿对象
}else if("xlsx".equals(getPostFix(filePath))){
workbook = new XSSFWorkbook(is); //xlsx对应的XSSFWorkbook工作簿对象
}else{
return null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
log.error("[ExcelImport][readExcel]:Exception" + GetCalendar.getSysdate() + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
log.error("[ExcelImport][readExcel]:Exception" + GetCalendar.getSysdate() + e.getMessage());
}
//循环遍历工作簿里面的sheet表
for(int i = 0; i < workbook.getNumberOfSheets(); i++){
Sheet sheet = workbook.getSheetAt(i); //读取工作表
if (sheet == null) //為空判斷
continue;
for(int j = 1; j <= sheet.getLastRowNum(); j++){
Row row = sheet.getRow(j); //读取每行
if(row != null){
StudentDTO student = new StudentDTO();
//设置学生实体各属性的值
student.setSno(getValue(row.getCell(1)));
student.setStu_name(getValue(row.getCell(2)));
student.setStu_pass("8888");
student.setSex(getValue(row.getCell(3)));
student.setXueyuan(getValue(row.getCell(4)));
student.setMajor(getValue(row.getCell(5)));
student.setS_class(getValue(row.getCell(6)));
student.setPhone(getValue(row.getCell(7)));
list.add(student);
}
}
}
}
return list;
}
//获取文件后缀
private String getPostFix(String path) {
if(path == null || "".equals(path.trim())){
return "";
}
if(path.contains(".") && path.lastIndexOf(".") != path.length() -1 ){
return path.substring(path.lastIndexOf(".") + 1, path.length());
}
return "";
}
//转换Cell类型的值
private String getValue(Cell cell)
{
if (null == cell)
return null;
if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN)
return String.valueOf(cell.getBooleanCellValue());
else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC)
{
DecimalFormat format = new DecimalFormat("#.##");
format.format(cell.getNumericCellValue());
return format.format(cell.getNumericCellValue());
}
else
return cell.getStringCellValue();
}
}
补充:(使用workbook需要的jar包)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。