在使用easypoi过程中,如果excel的单元格被编辑之后,会导致在解析的时候,读出空数据。容易产生空白数据入库。
public JsonResult importExcel(@RequestParam("file") MultipartFile file) {
try {
ImportParams params = new ImportParams();
// 表头设置为1行
params.setHeadRows(1);
//重点是这一行用于
params.setVerifyHandler(verifyHandler);
List<ClassVo> list = ExcelImportUtil.importExcel(file.getInputStream(), ClassVo.class, params);
if (list != null && list.size() > 0) {
boolean b = targetService.saveBatchByInport(ClwarningConvert.INSTANCE.targetToSource(list), list.size());
return b ? success() : fail();
}
} catch (Exception e) {
e.printStackTrace();
return fail("导入数据格式不正确");
}
return success();
}
主要是第五行代码:
params.setVerifyHandler(verifyHandler);
属性值是通过spring注入进来的;
@Autowired
private ClassExcelVerifyHandler verifyHandler;
verifyHandler属性值就是过滤器,具体代码如下:
@Component
public class ClassExcelVerifyHandler implements IExcelVerifyHandler<ClassDTO>{
@SneakyThrows
@Override
public ExcelVerifyHandlerResult verifyHandler(ClassDTO obj) {
ExcelVerifyHandlerResult result=new ExcelVerifyHandlerResult(true);
if (ObjectUtil.isNotNull(obj)){
//判断对象属性是否全部为空
boolean b = ObjectIsNullUitl.checkFieldAllNull(obj);
result.setSuccess(!b);
}
return result;
}
}
//也可以把范型改成Object
导出代码就很简单了;
public void exportExcel(HttpServletResponse response) throws IOException {
List<ClassVo> list = targetService.select();
response.setHeader("content-Type", "application/vnd.ms-excel");
// 下载文件的默认名称
String filename = "Excel模板" + ".xlsx";
response.setHeader("Content-Disposition", "attachment;filename=" +
URLEncoder.encode(filename, "UTF-8"));
response.setCharacterEncoding("UTF-8");
ExportParams exportParams = new ExportParams();
exportParams.setSheetName("模板");
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, ClassVo.class,
ClwarningConvert.INSTANCE.sourceToTarget(list));
workbook.write(response.getOutputStream());
}
import java.lang.reflect.Field;
import java.util.Map;
import java.lang.reflect.Modifier;
import java.util.Collection;
public class ObjectIsNullUitl {
public static boolean checkFieldAllNull(Object object) throws IllegalAccessException {
for (Field f : object.getClass().getDeclaredFields()) {
f.setAccessible(true);
if (Modifier.isFinal(f.getModifiers()) && Modifier.isStatic(f.getModifiers())) {
continue;
}
if (!isEmpty(f.get(object))) {
return false;
}
f.setAccessible(false);
}
//父类public属性
for (Field f : object.getClass().getFields()) {
f.setAccessible(true);
if (Modifier.isFinal(f.getModifiers()) && Modifier.isStatic(f.getModifiers())) {
continue;
}
if (!isEmpty(f.get(object))) {
return false;
}
f.setAccessible(false);
}
return true;
}
public static boolean isAllFieldNull(Object obj) throws Exception{
// 得到类对象
Class stuCla = (Class) obj.getClass();
//得到属性集合
Field[] fs = stuCla.getDeclaredFields();
boolean flag = true;
//遍历属性
for (Field f : fs) {
// 设置属性是可以访问的(私有的也可以)
f.setAccessible(true);
// 得到此属性的值
Object val = f.get(obj);
//只要有1个属性不为空,那么就不是所有的属性值都为空
if(val!=null) {
flag = false;
break;
}
}
return flag;
}
private static boolean isEmpty(Object object) {
if (object == null) {
return true;
}
if (object instanceof String && (object.toString().equals(""))) {
return true;
}
if (object instanceof Collection && ((Collection) object).isEmpty()) {
return true;
}
if (object instanceof Map && ((Map) object).isEmpty()) {
return true;
}
if (object instanceof Object[] && ((Object[]) object).length == 0) {
return true;
}
return false;
}
}
到这里就ok了以后有需要再继续补充;