概述
公司开发涉及到导入excel数据,自己封装了一个简单的方法,分享一下。
现在实体类只能支持基本的几种数据类型,date类型按照yyyy-MM-dd格式化了,需要不同的可以自行修改。
方法是以poi实现的
实体的创建要和excel的表头顺序对应
如:excel表头:序号,日期,姓名...
实体类:序号,日期,姓名...
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class ImportExcel {
/**
*
* @param workbook
* @param clazz
* @param x x表示从下标x行开始
* @param y y表示从下标y列开始
* @param <T>
* @return
* @throws Exception
*/
public static <T>List<T> importData(XSSFWorkbook workbook,Class<T> clazz,int x, int y) throws Exception {
Field[] fields = clazz.getDeclaredFields();
List<T> list = new ArrayList();
XSSFSheet sheetAt02 = workbook.getSheetAt(0);
for ( int i=x; i <= sheetAt02.getLastRowNum() ; i++) {
XSSFRow row = sheetAt02.getRow(i);
short lastCellNum = row.getLastCellNum();
String[] args = new String[lastCellNum];
for ( int j = y; j < lastCellNum; j++) {
args[j] =
getCellXlsx(row.getCell(j));
}
T o = setParam(clazz, args);
list.add(o);
}
return list;
}
private static <T> T setParam(Class<T> clazz, String[] args)
throws Exception {
if (clazz == null || args == null) {
throw new IllegalArgumentException();
}
T t = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
if (fields == null || fields.length > args.length) {
throw new IndexOutOfBoundsException();
}
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Class<?> type = fields[i].getType();
String name = type.getName();
name = name.substring(name.lastIndexOf(".")+1,name.length());
if (args[i] == null || "".equals(args[i])){
fields[i].set(t, null);
continue;
}
switch (name){
case "Integer" : fields[i].set(t, Integer.valueOf(args[i]));
break;
case "String" : fields[i].set(t, String.valueOf(args[i]));
break;
case "Double" : fields[i].set(t, Double.valueOf(args[i]));
break;
case "Float" : fields[i].set(t, Float.valueOf(args[i]));
break;
case "Boolean" : fields[i].set(t,Boolean.valueOf(args[i]));
break;
case "Short" : fields[i].set(t, Short.valueOf(args[i]));
break;
case "Long" : fields[i].set(t, Long.valueOf(args[i]));
break;
case "BigDecimal" : fields[i].set(t, new BigDecimal(args[i]));
break;
case "Date" : fields[i].set(t,
new SimpleDateFormat("yyyy-MM-dd").parse(args[i]));
break;
}
}
return t;
}
//获取单元格各类型值,返回字符串类型
private static String getCellXlsx(XSSFCell cell) {
//判断是否为null或空串
if (cell==null || cell.toString().trim().equals("")) {
return null;
}
String cellValue = "";
int cellType=cell.getCellType();
if(cellType==XSSFCell.CELL_TYPE_FORMULA){ //表达式类型
try {
return String.valueOf((int)cell.getNumericCellValue()).equals("")?null:String.valueOf((int)cell.getNumericCellValue());
}catch (Exception e){
return String.valueOf(cell.getBooleanCellValue()).equals("")?null:String.valueOf(cell.getBooleanCellValue());
}
}
switch (cellType) {
case XSSFCell.CELL_TYPE_STRING: //字符串类型
cellValue= cell.getStringCellValue().trim();
cellValue= StringUtils.isEmpty(cellValue) ? "" : cellValue;
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
//布尔类型
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_NUMERIC: //数值类型
if (HSSFDateUtil.isCellDateFormatted(cell)) {
//判断日期类型
cellValue = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
} else {
//否
cellValue = new DecimalFormat("#.######").format(cell.getNumericCellValue());
}
break;
default: //其它类型,取空串吧
cellValue = "";
break;
}
return cellValue;
}
}
以下是pom依赖,主要也是以poi为主
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
限制比较多,对于导入的excel不算复杂的业务比较实用
最后
以上就是鲜艳豆芽为你收集整理的导入excel数据,转换为java实体类的全部内容,希望文章能够帮你解决导入excel数据,转换为java实体类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复