1.PoiExcelImportUtil类
import com.*.core.annotation.IsNeeded;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
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 java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.Collator;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PoiExcelImportUtil {
/** 无参构造方法 */
public PoiExcelImportUtil(){}
/**
* 导入excel
* <按顺序放入带有注解的实体成员变量中>
*
* @param wb 工作簿
* @param t 实体
* @return List<T> 实体列表
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <T> List<T> excelToList(Workbook wb, T t,Boolean isExam)throws Exception{
List<T> listt = new ArrayList<T>();
/** 得到第一个sheet */
Sheet sheet = wb.getSheetAt(0);
/** 得到Excel的行数 */
// 总行数
int totalRows = sheet.getPhysicalNumberOfRows();
int totalCells = 0;
/** 得到Excel的列数 */
if (totalRows >= 1 && sheet.getRow(0) != null){
// 总列数
totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
}
/** 循环Excel的行 */
for (int r = 1; r < totalRows; r++){
Object newInstance = t.getClass().newInstance();
Row row = sheet.getRow(r);
if (isExam){
String judgeType=sheet.getRow(0).getCell(0).toString();
if(!"题型".equals(judgeType)){
break;
}
}
if (row == null){continue;}
// 成员变量的值
Object entityMemberValue = "";
// 所有成员变量
Field[] fields = t.getClass().getDeclaredFields();
// 列开始下标
int startCell = 0;
int index = 0;
//存放选项的list
List<Object> list = new ArrayList<>();
//上传试题
if(isExam && totalCells>4){
for (int f = 0; f <= totalCells; f++){
fields[index].setAccessible(true);
String fieldName = fields[index].getName();
boolean fieldHasAnno = fields[index].isAnnotationPresent(IsNeeded.class);
// 有注解
if (fieldHasAnno){
IsNeeded annotation = fields[index].getAnnotation(IsNeeded.class);
boolean isNeeded = annotation.isNeeded();
// Excel需要赋值的列
if (isNeeded && fieldName.equals("examOption")){
Cell cell = row.getCell(startCell);
String cellValue = cell==null ? "无" : getCellValue(cell);
list.add(replaceBlank(cellValue));
Collections.sort(list, Collator.getInstance(java.util.Locale.CHINA));
}else if (isNeeded){
Cell cell = row.getCell(startCell);
//String cellValue = getCellValue(cell);
String cellValue = cell==null ? "无" : getCellValue(cell);
entityMemberValue = getEntityMemberValue(entityMemberValue, fields, f, cellValue);
// 赋值
PropertyUtils.setProperty(newInstance, fieldName, entityMemberValue);
index++;
}
// 列的下标加1
startCell++;
}else {
index++;
}
if (f == totalCells){
PropertyUtils.setProperty(newInstance,fieldName,list);
}
}
}else {
//上传成绩
for (int f = 0; f <fields.length; f++){
fields[f].setAccessible(true);
String fieldName = fields[f].getName();
boolean fieldHasAnno = fields[f].isAnnotationPresent(IsNeeded.class);
// 有注解
if (fieldHasAnno){
IsNeeded annotation = fields[f].getAnnotation(IsNeeded.class);
boolean isNeeded = annotation.isNeeded();
// Excel需要赋值的列
if (isNeeded){
Cell cell = row.getCell(startCell);
String cellValue = getCellValue(cell);
entityMemberValue = getEntityMemberValue(entityMemberValue, fields, f, replaceBlank(cellValue));
// 赋值
PropertyUtils.setProperty(newInstance, fieldName, entityMemberValue);
}
// 列的下标加1
startCell++;
}
}
}
listt.add((T)newInstance);
}
return listt;
}
//==========================本类私有方法=========================//
/*
* 去除数据的空格、回车、换行符、制表符
*/
public static String replaceBlank(String str) {
String dest = "";
if (str!=null) {
//空格\t、回车\n、换行符\r、制表符\t
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
Matcher m = p.matcher(str);
dest = m.replaceAll("");
}
return dest;
}
/**
* 根据Excel表格中的数据判断类型得到值
*/
private static String getCellValue(Cell cell){
String cellValue = "";
if (null != cell){
// 以下是判断数据的类型
switch (cell.getCellType()){
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)){
Date theDate = cell.getDateCellValue();
SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd");
cellValue = dff.format(theDate);
}else {
cellValue = String.valueOf(cell.getNumericCellValue());
}
break;
case HSSFCell.CELL_TYPE_STRING: // 字符串
cellValue = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
cellValue = cell.getBooleanCellValue() + "";
break;
case HSSFCell.CELL_TYPE_FORMULA: // 公式
cellValue = cell.getCellFormula() + "";
break;
case HSSFCell.CELL_TYPE_BLANK: // 空值
break;
case HSSFCell.CELL_TYPE_ERROR: // 故障
cellValue = "非法字符";
break;
default:
cellValue = "未知类型";
break;
}
}
return cellValue;
}
/**
* 根据实体成员变量的类型得到成员变量的值
*/
private static Object getEntityMemberValue(Object realValue, Field[] fields, int f, String cellValue){
String type = fields[f].getType().getName();
if (StringUtils.isNotBlank(cellValue) && "mobile".equals(fields[f].getName())){
DecimalFormat df = new DecimalFormat("#");
cellValue = df.format(Double.parseDouble(cellValue));
}
switch (type){
case "char":
case "java.lang.Character":
case "java.lang.String":
realValue = cellValue;
break;
case "java.util.Date":
realValue = StringUtils.isBlank(cellValue) ? null : DateUtil.strToDate(cellValue, DateUtil.YYYY_MM_DD);
break;
case "int":
case "java.lang.Integer":
realValue = StringUtils.isBlank(cellValue) ? null : Integer.valueOf(cellValue);
break;
case "float":
case "double":
case "java.lang.Double":
case "java.lang.Float":
case "java.lang.Long":
case "java.lang.Short":
case "java.math.BigDecimal":
realValue = StringUtils.isBlank(cellValue)? null : new BigDecimal(cellValue).setScale(1,BigDecimal.ROUND_HALF_UP);
break;
default:
break;
}
return realValue;
}
/**
* 根据路径或文件名选择Excel版本
*/
public static Workbook chooseWorkbook(String filePathOrName, InputStream in)
throws IOException{
/** 根据版本选择创建Workbook的方式 */
Workbook wb = null;
boolean isExcel2003 = ExcelVersionUtil.isExcel2003(filePathOrName);
if (isExcel2003){
wb = new HSSFWorkbook(in);
}
else{
wb = new XSSFWorkbook(in);
}
return wb;
}
// =================== 版本判断==========================
private static class ExcelVersionUtil{
/**
* 是否是2003的excel,返回true是2003
*/
private static boolean isExcel2003(String filePath){
return filePath.matches("^.+\\.(?i)(xls)$");
}
}
public static class DateUtil{
// 日期格式化常量
static final String YYYY_MM_DDHHMMSS = "yyyy-MM-dd HH:mm:ss";
static final String YYYY_MM_DD = "yyyy-MM-dd";
/**
* 自定义取值,Date类型转为String类型
*/
public static String dateToStr(Date date, String pattern){
SimpleDateFormat format = null;
if (null == date)
return null;
format = new SimpleDateFormat(pattern, Locale.getDefault());
return format.format(date);
}
/**
* 将字符串转换成Date类型的时间
*/
public static Date strToDate(String s, String pattern){
if (s == null){
return null;
}
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
try{
date = sdf.parse(s);
}
catch (ParseException e){
e.printStackTrace();
}
return date;
}
}
}
2.IsNeed.java
package com.*.core.annotation;
import java.lang.annotation.*;
/**
* 是否需要从解析excel赋值
* 因为再实体类里面并不是所有的属性都要参与excel的导入,给需要参与导入的属性加上此注解
*
*/
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
public @interface IsNeeded {
/**
* 是否需要从解析excel赋值
* @return
* true:需要 false:不需要
*/
boolean isNeeded() default true;
String head() default "";
}
3.controller类
T t= new T();
1>.List<T> list= PoiExcelImportUtil.excelToList(wb, courseScore, false);//false表示导入类型
2>.List<T> list= PoiExcelImportUtil.excelToList(wb, T);
4.实体类
@IsNeeded(head = "手机号")
@ApiModelProperty(value = "手机号")
@TableField("phone")
private String phone;