改进的地方:1.controllre关于可以通过file直接获取数入流,不用再通过磁盘转一下
2.把需要进行必填项验证的字段(其实就是字段的string为非必填)放到一个set集合中,通过反射的形式自动判断,如果有错误放入list集合中,同样思路可以用于判断是否为数字
3.导入的话需要维护一个list集合,用于存放于导入表格对应的列,按顺序放入,后期可以维护一个linkhashmap 通过中文与字段的对应关系,先通过中文的表头找出字段对应的列,创建一个map,这样导入的话列可以打乱,后台可以维护我要从导入表中取得linkhashmap ,这样思路和导出就对应上了修改就方便了。
@ApiOperation(value = "xxx")
@PostMapping(value = "xxx")
public ResultVO<String> xxx(MultipartFile file) throws Exception {
InputStream inputStream = file.getInputStream(); // 可以直接获取输入流
ArrayList arrayList = new ArrayList();
// arrayList.add("id");
arrayList.add("telephone");
arrayList.add("email");
arrayList.add("phone");
arrayList.add("fax");
arrayList.add("address");
arrayList.add("description");
List<xx> listByExcel = ExportLinkHash.getListByExcel(inputStream, arrayList);
Date currentTime = new Date();
ArrayList<String> err = new ArrayList<>();
List<String> legalPersonIdList = (List<String>) resultVO.getData();
for(SupplyContract supp:listByExcel){
Set<String> validateProperty = new HashSet<String>();
validateProperty.add("isEnableName");
validateProperty.add("startTimeName");
validateProperty.add("endTimeName");
validateProperty.add("contacts");
validateProperty.add("telephone");
List list = BeanUtil.checkBeanFieldIsNull( supp, validateProperty);
if(list.size()>0) {
if(supp.getSupplyContractCode()!=null){
err.add(""+supp.getSupplyContractCode()+list.toString()+"存在必填项为空");
}
}
}
if(err.size()>0) {
return resultVOBuilder.failure(err.toString());
}
inputStream.close();
return null;
}
现在的类时根据导入写死的 后期改为泛型
public static List<xx> getListByExcel(InputStream in, ArrayList arrayList) throws Exception {
List<xx> supplyContracts = new ArrayList<>();
//创建Excel工作薄
Workbook work = getWorkbook(in);
Sheet sheet = null;
Row row = null;
Cell cell = null;
//遍历Excel中所有的sheet
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if (sheet == null) {
continue;
}
//遍历当前sheet中的所有行
for (int j =1; j <= sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if (row == null ) {
continue;
}
xx.supp = new xx();
//*该方法用于传入某实例对象以及对象方法名、修改值,通过放射调用该对象的某个set方法设置修改值*/
// public static Object setProperty(Object beanObj, String property, Object value)v
for(i=0;i<arrayList.size();i++){
if(row.getCell(i)!=null&&String.valueOf(getCellValue(row.getCell(i)))!=null){
System.out.println(String.valueOf(getCellValue(row.getCell(i))));
setProperty(supp, String.valueOf(arrayList.get(i)), String.valueOf(getCellValue(row.getCell(i))));
}
}
//遍历所有的列(把每一行的内容存放到对象中)
supplyContracts.add(supp);
}
System.out.println(supplyContracts.get(0).toString());
}
return supplyContracts;
}
还有一个工具类实现get方法和set方法的反射
public static Workbook getWorkbook(InputStream inStr) throws Exception {
Workbook wb = null;
wb = WorkbookFactory.create(inStr);
return wb;
}
/*该方法用于传入某实例对象以及对象方法名,通过反射调用该对象的某个get方法*/
public static Object getProperty(Object beanObj, String property) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
//此处应该判断beanObj,property不为null
PropertyDescriptor pd = new PropertyDescriptor(property, beanObj.getClass());
Method getMethod = pd.getReadMethod();
if(getMethod == null){
}
return getMethod.invoke(beanObj);
}
/*该方法用于传入某实例对象以及对象方法名、修改值,通过放射调用该对象的某个set方法设置修改值*/
public static Object setProperty(Object beanObj, String property, Object value) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
//此处应该判断beanObj,property不为null
PropertyDescriptor pd = new PropertyDescriptor(property, beanObj.getClass());
Method setMethod = pd.getWriteMethod();
if(setMethod == null){
}
return setMethod.invoke(beanObj, value);
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下是为改进前的代码相比以上代码有更好的维护性
为改进前的代码
//把每个单元格的值付给对象的对应属性
if (row.getCell(0)!=null){
supp.setId(String.valueOf(getCellValue(row.getCell(0))));
}
if (row.getCell(1)!=null){
supp.setSupplyContractCode(String.valueOf(getCellValue(row.getCell(1))));
}
if (row.getCell(2)!=null){
supp.setIsEnableName(String.valueOf(getCellValue(row.getCell(2))));
}
if (row.getCell(3)!=null){
supp.setSupplierCode(String.valueOf(getCellValue(row.getCell(3))));
}
if (row.getCell(4)!=null){
supp.setIsEnableName(String.valueOf(getCellValue(row.getCell(4))));
}
if (row.getCell(5)!=null){
supp.setStartTimeName(String.valueOf(getCellValue(row.getCell(5))));
}
if (row.getCell(6)!=null){
supp.setEndTimeName(String.valueOf(getCellValue(row.getCell(6))));
}
if (row.getCell(7)!=null){
supp.setBankName(String.valueOf(getCellValue(row.getCell(7))));
}
if (row.getCell(8)!=null){
supp.setBankAccount(String.valueOf(getCellValue(row.getCell(8))));
}
if (row.getCell(9)!=null){
supp.setPaymentTime(String.valueOf(getCellValue(row.getCell(9))));
}
if (row.getCell(10)!=null){
supp.setPaymentMethod(String.valueOf(getCellValue(row.getCell(10))));
}
if (row.getCell(11)!=null){
supp.setServiceMode(String.valueOf(getCellValue(row.getCell(11))));
}