java导入导出excel
1.java导入excel
本文介绍导入的Excel文件转换为java实体类集合,直接看代码和注释叭。
1.1.excel文件处理(excel行数据转换为java实体类集合数据)
// 设置表头及其对应字段
private static final String[] HEAD_NAME = new String[]{"学号", "班级编号", "班级名称", "姓名", "性别", "年龄", "学分"};
private static final String[] HEAD_ID = new String[]{"stuNo", "classNo", "className", "stuName", "gend", "brth", "credit"};
// file->excel文件
// heads->表头字段
// c->需转换的java实体类
// jump->需跳过前多少行(如表头需跳过jump为1)
List excelToList(File file, String[] heads, Class<?> c, int jump){
List list = new ArrayList();
//1.导入文件转为文件流
InputSteam is = file.getInputSteam();
//2.使用poi中的OPCPackage.open()打开Excel文件
//OPCPackage.open()是一个静态方法,用于打开一个包含Office Open XML格式文件的OPCPackage对象。它可以打开Excel、Word、PowerPoint等文件。
OPCPackage pkg = OPCPackage.open(is);
//3.使用poi库中的XSSFWorkBook或HSSFWorkBook读取Excle文件,XSSFWorkBook用于读取.xlsx格式文件,HSSFWorkBook用于读取.xls格式文件
XSSFWorkBook xwb = new XSSFWorkBook(pkg);
//4.使用poi库中的XSSFSheet类读取Excel文件中的sheet表格
XSSFSheet sheet = xwb.getSheetAt(0);
//5.循环获取表中的行和行中的字段
for(Row row:sheet){
// 跳过第一行表头
if(row.getRowNumber()<jump){
continue;
}
// 通过反射机制创建java实体类对象,用于接收表格行数据
Object obj = c.newInstance();
// 循环行获取行中字段赋值给java实体类
for(Cell cell : row){
// 获取单元格字段类型
CellType cellType = cell.getCellType();
// 行数据是否为空
boolean isData = false;
// 根据字段类型使用不同方法获取单元格值
switch(cellType){
case Cell.CELL_TYPE_STRING:
//获取单元格数据
String sData = cell.getStringCellValue();
// 如果单元格数据不为空,设置isdata为true,并给实体类赋值
if(null!=sData){
isData = true;
setFieldValue(obj, cell, heads, c);
}
case Cell.CELL_TYPE_NUMERIC:
//获取单元格数据
double dData = cell.getNumericCellValue();
// 如果单元格数据不为空,设置isdata为true,并给实体类赋值
if(null!=dData){
isData = true;
setFieldValue(obj, cell, heads, c);
}
case Cell.CELL_TYPE_BOOLEAN:
//获取单元格数据
boolean bData = cell.getBooleanCellValue();
// 如果单元格数据不为空,设置isdata为true,并给实体类赋值
if(null!=bData){
isData = true;
setFieldValue(obj, cell, heads, c);
}
case Cell.CELL_TYPE_BLANK:
continue;
}
if(bData){
list.add(obj);
}
return list;
}
}
}
// 给java实体类的字段赋值
static void setFieldValue(Object obj,Cell cell,String[] heads,Class<?> c){
// 日期格式转换对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 获取指定字段
Field field = c.getDeclaredField(heads[cell.getColumnIndex()]);
// 使用Spring 框架中的工具方法,使字段即使是private修饰也可以被访问;
ReflectionUtils.makeAccessible(field);
// 根据单元格类型与实体类字段类型给实体类赋值
switch(cell.getCellType()){
// 若单元格类型为String
case Cell.String:
// 实体类字段类型为日期
if("class java.util.Date".equals(field.getGenericType().toString())){
field.set(obj,sdf.parse(cell.getStringCellValue()))
}
// 实体类字段类型为时间戳
else if("class java.sql.Timestamp".equals(field.getGenericType().toString())){
field.set(obj,Timestamp.valueOf(cell.getStringCellValue()))
}
// 实体类字段类型为小数
else if("class java.util.Bigdecimal".equals(field.getGenericType().toString())){
field.set(obj,new Bigdecimal(cell.getStringCellValue()).setScale(4,Bigdecimal.ROUND_HALF_UP))
}
// 实体类字段类型为浮点型小数
else if("class java.util.Double".equals(field.getGenericType().toString())){
field.set(obj,Double.valueOf(cell.getStringCellValue()))
}
// 实体类字段类型为整数
else if("class java.util.Integer".equals(field.getGenericType().toString())){
field.set(obj,Integer.valueOf(cell.getStringCellValue()))
}
else {
field.set(obj,cell.getStringCellValue())
}
break;
case Cell.Numberic:
// 实体类字段类型为小数
else if("class java.util.Bigdecimal".equals(field.getGenericType().toString())){
field.set(obj,new Bigdecimal(cell.getNumbericCellValue()).setScale(4,Bigdecimal.ROUND_HALF_UP))
}
// 实体类字段类型为浮点型小数
else if("class java.util.Double".equals(field.getGenericType().toString())){
field.set(obj,Double.valueOf(cell.getNumbericCellValue()))
}
// 实体类字段类型为整数
else if("class java.util.Integer".equals(field.getGenericType().toString())){
field.set(obj,Integer.valueOf(cell.getNumbericCellValue()))
}
else {
field.set(obj,cell.getNumbericCellValue())
}
break;
case BOOLEAN:
field.set(obj, cell.getBooleanCellValue());
break;
case BLANK:
field.set(obj, "");
break;
default:
field.set(obj, cell.toString());
break;
}
}