欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java使用poi,做一个通用的导入导出,核对数据格式的要求,对数据格式长度和对日期的要求验证

程序员文章站 2022-06-03 16:09:08
...

书接上文!!!
https://blog.csdn.net/drsbbbl/article/details/102742847
对上次更加优化,添加了对应的数据的校验和对日期的校验。
和导出数据的小数点位数。
新的 单元格注解类



package com.fulan.server.common.anno;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.fulan.server.common.excelenmu.ColumnType;
import com.fulan.server.common.excelenmu.ColumnValiDataIsNull;

@Target(value = { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelColumn {
	/**
	 * 导出的 列的名字
	 * 
	 * @return
	 */
	String columnName() default "test";

	/**
	 * 对应的 列的下标
	 * 
	 * @return
	 */
	int columnIndex();

	/**
	 * 日期的类型
	 * 
	 * @return
	 */
	ColumnType columnType() default ColumnType.notDateType;

	/**
	 * 是否验证数据 是不是可以为空
	 */
	ColumnValiDataIsNull valiData() default ColumnValiDataIsNull.CanEmpty;

	/**
	 * 导出数据验证长度
	 */
	int dataLength() default 0;

	/**
	 * 导出数据 小数点位数
	 * 
	 * @return
	 */
	String decimalPoint() default "";
}


对应的日期验证方法:



public static boolean checkDate(String str, String pattern) {
		SimpleDateFormat sd = new SimpleDateFormat(pattern);
		try {
		//注意此处必须设定 不然 不正确的日期 Java也会兼容
		// 比如 2018-13-01  
		//他会 替换为 2019-01-01
			sd.setLenient(false);// 此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
			sd.parse(str);
		} catch (Exception e) {
			return false;
		}
		return true;
	}

对应的代码处理中,添加两个map 做对应的处理存储类型存储对应的注解值

/**
			 * 数据校验
			 */
			Map<Integer, ColumnValiDataIsNull> dataValiedMap = Maps.newHashMap();

			/**
			 * 导出数据验证长度
			 */
			Map<Integer, Integer> dataLength = Maps.newHashMap();
			/**
			 * 导出数据保留 小数点位数
			 * 
			 * @return
			 */
			Map<Integer, String> decimalPoint = Maps.newHashMap();

使用map来存储对应的结果:

Map<String, Object> mapResutl = Maps.newHashMap();
		List<E> result = Lists.newArrayList();
		mapResutl.put("result", result);
		mapResutl.put("dataValiedMap", Lists.newArrayList());
		mapResutl.put("dataLength", Lists.newArrayList());
		mapResutl.put("dateMap", Lists.newArrayList());
		mapResutl.put("flag", 0);
		mapResutl.put("success", 0);

处理数据的过程中,有很大的变化: 添加了对应的不同的结果的处理过程
对数据校验做了判断!!!

ColumnType columnType = dateMap.get(index);
		boolean dateflag = true;
		if (columnType != null) {
			if (columnType.getKey() == 2) {
				dateflag = false;
			}
		}
		boolean flag = false;
		if (dataValiedMap.get(index).getKey() == 1) {
			// 需要验证
			flag = true;
		}
		boolean dataLengthflag = true;
		if (dataLength.get(index) == 0) {
			// 需要验证
			dataLengthflag = false;
		}
		boolean decimalflag = true;
		if ("".equals(decimalPoint.get(index))) {
			decimalflag = false;
		}
		DecimalFormat df = new DecimalFormat("#");
		if (flag) {
			if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) {
				List<String> List = (java.util.List<String>) resultMap.get("dataValiedMap");
				List.add("第" + (rowIndex + 1) + "行中的,第" + (index + 1) + "列,数据为空");
				return null;
			}

		}
		if (cell == null) {
			return "标记";
		}
		if (cell.getCellTypeEnum() == CellType.STRING) {
			if (cell.getStringCellValue().length() == 0) {
				List<String> List = (java.util.List<String>) resultMap.get("dataValiedMap");
				List.add("第" + (rowIndex + 1) + "行中的,第" + (index + 1) + "列,数据为空");
				return null;
			}
			if (dataLengthflag) {
				String stringCellValue = cell.getStringCellValue();
				if (dataLength.get(index) == stringCellValue.length()) {
					return stringCellValue;
				}
				List List = (java.util.List) resultMap.get("dataLength");
				List.add("第" + (rowIndex + 1) + "行" + "中的,第" + (index + 1) + "列,数据长度应该为" + dataLength.get(index));
				return null;
			}
			if (dateflag) {
				// 需要验证日期
				String dateData = cell.getStringCellValue();
				if (!StrUtil.checkDate(dateData, columnType.getValue())) {
					List<String> List = (java.util.List<String>) resultMap.get("dateMap");
					List.add("第" + (rowIndex + 1) + "行中的,第" + (index + 1) + "列,日期的格式应该为!!!" + columnType.getValue());
					return null;
				}
			}
			return cell.getStringCellValue();
		} else if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
			return String.valueOf(cell.getBooleanCellValue());
		} else if (cell.getCellTypeEnum() == CellType.NUMERIC) {
			if (HSSFDateUtil.isCellDateFormatted(cell)) { // 判断是日期类型
				Date dt = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());// 获取成DATE类型
				SimpleDateFormat sim = new SimpleDateFormat(columnType.getValue());

				return sim.format(dt);
			} else { // 转化电话号码和身份证号码为字符串
				if (decimalflag) {
					double test = cell.getNumericCellValue();
					String sb = "#.";
					for (int i = 0; i < Integer.parseInt(decimalPoint.get(index)); i++) {
						sb += "0";
					}
					DecimalFormat tem = new DecimalFormat(sb);
					return Double.parseDouble(tem.format(test));
				}
				return String.valueOf(df.format(cell.getNumericCellValue()));
			}
		}
		return null;
	if (cellValue == null) {
					mapResutl.put("flag", (Integer.parseInt(mapResutl.get("flag").toString()) + 1));
					flag = true;
					break;
				}
				if ("标记".equals(cellValue)) {
					setObjectToAtrrbute(newInstance, declaredField);
					continue;
				}

	private static void setObjectToAtrrbute(Object obj, Field field) throws Exception {
		String fieldType = field.getType().getSimpleName();
		if ("String".equals(fieldType)) {
			field.set(obj, "");
			if ("dateGuarantee".equals(field.getName())) {
				Method declaredMethod = obj.getClass().getDeclaredMethod("getInitialDate", null);
				declaredMethod.setAccessible(true);
				Object invoke = declaredMethod.invoke(obj, null);
				SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
				// 初等日期
				Date parse = sim.parse(invoke.toString());
				Calendar cal = Calendar.getInstance();
				cal.setTime(parse);
				cal.add(Calendar.DAY_OF_YEAR, 1);
				Date time = cal.getTime();
				field.set(obj, sim.format(time));
			}
		} else if ("Date".equals(fieldType)) {
			Method declaredMethod = obj.getClass().getDeclaredMethod("getInitialDate", null);
			declaredMethod.setAccessible(true);
			Object invoke = declaredMethod.invoke(obj, null);
			SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
			// 初等日期
			Date parse = sim.parse(invoke.toString());
			Calendar cal = Calendar.getInstance();
			cal.setTime(parse);
			cal.add(Calendar.DAY_OF_YEAR, 1);
			Date time = cal.getTime();
			System.out.println(time);
			field.set(obj, sim.format(time));
		} else if ("Integer".equals(fieldType) || "int".equals(fieldType)) {
			field.set(obj, 0);
		} else if ("Long".equalsIgnoreCase(fieldType)) {
			field.set(obj, 0);
		} else if ("Double".equalsIgnoreCase(fieldType)) {
			field.set(obj, 0);
		}

	}

同理对应的代码我也放到对应的git上 请大佬指点!!!