版权声明:本文为博主原创文章,未经博主允许不得转载。否则,吔屎伺候。 https://blog.csdn.net/guowujun321/article/details/82970266
暂且记录一下吧
假如有一个excel需要导入,那无非类似:
日期 | 中文名 | 年龄 | 性别 |
2018-10-08 | 阿毛 | 23 | 男 |
20181008 | sjsj | sdfa | 人妖 |
对该excel的解析:
1、先是表头,是否和规定的一致。
2、获取除表头外的每一行 ,每一行中,各列的数据判断,出现错误的返回内容。
3、每一行是一个对象,所有行组成集合。
office不同版本的excel后缀有xls,xlsx,所以在使用poi解析时,需要注意。
public Map<String, Object> analyzeFile(File file) {
Map<String,Object> map = new HashMap<String,Object>();
List<Integer> errorRow = new ArrayList<Integer>();
try {
FileInputStream is = new FileInputStream(file);
Workbook hssfWorkbook = null;
try {
hssfWorkbook = new HSSFWorkbook(is);
} catch (Exception ex) {
is = new FileInputStream(file);
hssfWorkbook = new XSSFWorkbook(is);
}
Sheet hssfSheet = hssfWorkbook.getSheetAt(0); //excel可能有多个sheet,一般取第一个
if (hssfSheet!=null) {
Row row = hssfSheet.getRow(1); //得到该sheet里的第一行,即表头行
boolean title = getTitle(row, map, ReportsTitle.ProductionBudgetSub); //判断表头是否符合
if (!title) {
return map; //表头有误,就返回错误信息
}
List<XX> list = new ArrayList<XX>();
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) { //rowNum是行数,一般下标从1开始,因为数据从第二行开始。
try {
Row hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null){
continue;
}
Map<String,Object> resultMap = getProductBuget(hssfRow); //数据行无误,获取并判断
} catch (Exception e) {
errorRow.add(rowNum);
map.put("errorRow", errorRow);
map.put("result", "error");
e.printStackTrace();
}
}
return map;
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Map<String, Object> getProductBuget(Row hssfRow) {
Map<String,Object> map = new HashMap<String,Object>();
XX budget = new XX();
try {
//取出每列名
String fieldNamesCNStr = PropertiesUtil.getValueByKey(ReportTitlePath, ReportsTitle.ProductionBudgetAll.name());
//每列的字段名称(建议跑个main方法,从对象的反射中获取,比较方便)
String fieldNameStr = "date,chineseName,age,sex";
//名称==字段名,一一对应
String[] fieldNamesCN = fieldNamesCNStr.split(",");
String[] fieldNames = fieldNameStr.split(",");
//需要正则校验的字段
Map<String,DataType> needCheck = new HashMap<String,DataType>();
needCheck.put("date",DataType.Date);
//利用反射机制,取出excel中对应的字段的值
map = ObjectFieldUtil.setFieldValueByImport(fieldNames,fieldNamesCN,needCheck,budget,hssfRow);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
public static Map<String,Object> setFieldValueByImport(String[] fieldNames, String[] fieldNamesCN,Map<String,DataType> needCheck, Object object, Row hssfRow) {
Map<String,Object> map = new HashMap<String,Object>();
try {
boolean isNc = false;
if (needCheck != null && !needCheck.isEmpty()) { //是否需要校验字段
isNc = true;
}
for(int i = 0,length = fieldNames.length; i < length;i++) {
String name = fieldNames[i]; //取得字段
Field field = object.getClass().getDeclaredField(name);
String upperName = name.substring(0, 1).toUpperCase() + name.substring(1);
String type = field.getGenericType().toString();
String fieldValue = "";
if (hssfRow.getCell(i) != null) {
fieldValue = switchRowType(hssfRow.getCell(i));
}
if(isNc && needCheck.containsKey(name)) {
if (fieldValue.equals("")) { //数据为空
map.put("result", "error");
map.put("errorText", fieldNamesCN[i]);
map.put("errorCode", ERROR_Null);
return map;
}
DataType dataType = needCheck.get(name);
if (!ExcelDataVerify.isCheckRight(dataType, fieldValue)) { //格式不正确
map.put("result", "error");
map.put("errorText", fieldNamesCN[i]);
map.put("errorCode", dataType.getName());
return map;
}
}
setField(type, upperName, object, i, fieldValue);
}
map.put("result", "success");
map.put("object", object);
} catch (Exception e) {
e.printStackTrace();
map.put("result", "error");
map.put("errorCode", ERROR_Exep);
}
return map;
}
public static String switchRowType(Cell cell) {
String ret = "";
if (cell == null) return ret;
CellType type = cell.getCellTypeEnum();
switch (type) {
case BLANK:
ret = "";
break;
case BOOLEAN:
ret = String.valueOf(cell.getBooleanCellValue());
break;
case ERROR:
ret = null;
break;
case FORMULA:
Workbook wb = cell.getSheet().getWorkbook();
CreationHelper crateHelper = wb.getCreationHelper();
FormulaEvaluator evaluator = crateHelper.createFormulaEvaluator();
ret = switchRowType(evaluator.evaluateInCell(cell));
break;
case NUMERIC:
if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
Date theDate = cell.getDateCellValue();
ret = sdf_Date.format(theDate);
} else {
ret = NumberToTextConverter.toText(cell.getNumericCellValue());
}
break;
case STRING:
ret = cell.getRichStringCellValue()==null?"":cell.getRichStringCellValue().getString();
break;
default:
ret = "";
}
return ret;
}
public enum DataType {
Chinese("应输入中文","[\\u4E00-\\u9FA5]+"),
Symbol("包含特殊字符","[ _`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\\n|\\r|\\t"),
Number("应为非负整数","^//d+$"),
NumNotZero("应为非零整数","^//d*[1-9]//d*$"),
Email("格式有误","^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"),
Date("格式有误","^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))")
;
private String name;
private String regEx;
// 构造方法
private DataType(String name, String regEx) {
this.name = name;
this.regEx = regEx;
}
//覆盖方法
@Override
public String toString() {
return this.regEx+"_"+this.name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRegEx() {
return regEx;
}
public void setRegEx(String regEx) {
this.regEx = regEx;
}
}
public static void setField(String type,String upperName,Object object,int i,String fieldValue) {
try {
Method method = null;
//String fieldValue = switchRowType(hssfRow.getCell(i));
if (type.equals("int")) {
method = object.getClass().getMethod("set" + upperName,int.class);
method.invoke(object, Integer.parseInt(fieldValue));
}
if (type.equals("class java.lang.String")) {
method = object.getClass().getMethod("set" + upperName,String.class);
fieldValue = fieldValue == null ?"":fieldValue;
method.invoke(object, fieldValue);
}
if (type.equals("class java.util.Date")) {
method = object.getClass().getMethod("set" + upperName,Date.class);
if (!StringUtils.isBlank(fieldValue)) {
Date date = new Date();
if(fieldValue.contains("-")) {
date = sdf_Date.parse(fieldValue);
} else if(fieldValue.contains("/")){
date = sdf_Date_fs.parse(fieldValue);
}
method.invoke(object, date);
}
}
if (type.equals("class java.lang.Integer")) {
method = object.getClass().getMethod("set" + upperName,Integer.class);
method.invoke(object, Integer.parseInt(fieldValue));
}
if (type.equals("class java.lang.Long")) {
method = object.getClass().getMethod("set" + upperName,Long.class);
method.invoke(object, Long.parseLong(fieldValue));
}
if (type.equals("class java.math.BigDecimal")) {
method = object.getClass().getMethod("set" + upperName,BigDecimal.class);
method.invoke(object, new BigDecimal(fieldValue));
}
} catch (Exception e) {
e.printStackTrace();
}
}
excel表格的解析,就半公共化了。