POI导入时经常碰到字段类型和导入的类型冲突

文章讲述了在使用Spring框架的poi库导入Excel时,由于字段类型与实体类不一致导致的问题。作者提供了两种解决方案:一是使用原来的实体类并处理数据类型转换,二是创建一个新的实体类,所有字段设为String类型来避免类型不匹配。
摘要由CSDN通过智能技术生成

我们在用poi导入时导入的Excel列的字段类型经常和实体类里的不一致

//导入类
public class ImportVo {
    @ExcelVOAttribute(name = "名称",column="A")
    private String mc;
    @ExcelVOAttribute(name = "数量",column="B")
    private Integer sl;
    @ExcelVOAttribute(name = "单价",column="C")
    private Double dj;
    @ExcelVOAttribute(name = "金额",column="D")
    private Double je;

    public String getMc() {
        return mc;
    }

    public void setMc(String mc) {
        this.mc = mc;
    }

    public Integer getSl() {
        return sl;
    }

    public void setSl(Integer sl) {
        this.sl = sl;
    }

    public Double getDj() {
        return dj;
    }

    public void setDj(Double dj) {
        this.dj = dj;
    }

    public Double getJe() {
        return je;
    }

    public void setJe(Double je) {
        this.je = je;
    }
    @Override
    public String toString() {
        return "ImportVo{" +
                "mc='" + mc + '\'' +
                ", sl=" + sl +
                ", dj=" + dj +
                ", je=" + je +
                '}';
    }
}
 public void importcs(HttpServletRequest request) throws Exception {
        MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
        Iterator<String> files = mRequest.getFileNames();
        //只取第一个EXCEL文件,只取第一个sheel
        if (files.hasNext()) {
            MultipartFile multipartFile = mRequest.getFile(files.next());
            MyExcelUtils<ImportVo> myExcelUtils = new MyExcelUtils(multipartFile, ImportVo.class);
            List<ImportVo> list = myExcelUtils.importExcel(3);
            list.forEach(System.out::println);
        }
    }

MultipartFile 工具类

public class MyExcelUtils<T>{

    HSSFWorkbook workbook=null;// 工作薄对象
    HSSFSheet sheet=null;// 工作表对象
    ServletOutputStream output=null;//输出流
    HSSFRow row=null;//行
    HSSFCell cell=null;//单元格
    CellStyle style =null;//单元格样式
    String path;//文件路径
    InputStream input;//输入流
    MultipartFile file;//上传的文件
	Class<T> clazz;

    public MyExcelUtils() {
		super();
	}
    /*导出时候用的到*/
	public MyExcelUtils(Class<T> clazz) {
		super();
		this.clazz = clazz;
	}
    /*导出入时候用的到*/
	public MyExcelUtils(MultipartFile file, Class<T> clazz) throws Exception {
		super();
		input = file.getInputStream();
		this.clazz = clazz;
	}

    /** *导入数据* *//***/
    public List<T> importExcel(Integer beginRowIndex){
        String sheetName="";
        beginRowIndex=beginRowIndex==null?1:beginRowIndex;
        return importExcel( sheetName, beginRowIndex);
    }

    public List<T> importExcel(String sheetName,Integer beginRowIndex) {
        int maxCol = 0;
        List<T> list = new ArrayList<T>();
        try {
            HSSFWorkbook workbook = new HSSFWorkbook(input);
            HSSFSheet sheet = workbook.getSheet(sheetName);
            if (!sheetName.trim().equals("")) {
                sheet = workbook.getSheet(sheetName);// 如果指定sheet名,则取指定sheet中的内容.
            }
            if (sheet == null) {
                sheet = workbook.getSheetAt(0); // 如果传入的sheet名不存在则默认指向第1个sheet.
            }
            int rows = sheet.getPhysicalNumberOfRows();
            if (rows > 0) {// 有数据时才处理
                // Field[] allFields = clazz.getDeclaredFields();// 得到类的所有field.
                List<Field> allFields = ExcelFragment.fltMappedFileds(ExcelFragment.getMappedFiled(clazz, null),2);
                Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();// 定义一个map用于存放列的序号和field.
                for (Field field : allFields) {
                    // 将有注解的field存放到map中.
                    if (field.isAnnotationPresent(ExcelVOAttribute.class)) {
                        ExcelVOAttribute attr = field .getAnnotation(ExcelVOAttribute.class);
                        int col = ExcelFragment.getExcelCol(attr.column());// 获得列号
                        maxCol = Math.max(col, maxCol);
                        field.setAccessible(true);// 设置类的私有字段属性可访问.
                        fieldsMap.put(col, field);
                    }
                }
                for (int i = beginRowIndex; i < rows; i++) {// 从第4行开始取数据,默认第3行是表头.
                    HSSFRow row = sheet.getRow(i);
                    if(row==null) {
                        continue;
                    }
                    int cellNum = maxCol+1;
                    T entity = null;
                    for (int j = 0; j < cellNum; j++) {
                        HSSFCell cell = row.getCell(j);
                        Object cellval=null;
                        if (cell == null){
                            continue;
                        }

                        Field field = fieldsMap.get(j);// 从map中得到对应列的field.
                        if (field==null) {
                            continue;
                        }
                        entity = (entity == null ? clazz.newInstance() : entity);// 如果不存在实例则新建.

                        Class<?> fieldType = field.getType();
                        if (String.class == fieldType) {
                            cell.setCellType(Cell.CELL_TYPE_STRING);
                            cellval= cell.getStringCellValue();
                            field.set(entity, String.valueOf(cellval==null?"":cellval));
                        } else if ((Integer.TYPE == fieldType)  || (Integer.class == fieldType)) {
                            cellval=cell.getNumericCellValue();
                            field.set(entity, Double.valueOf((cellval==null?0.0:cellval).toString()).intValue());
                        } else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {
                            cellval=cell.getNumericCellValue();
                            field.set(entity, Long.valueOf( cellval.toString()));
                        } else if ((Float.TYPE == fieldType)  || (Float.class == fieldType)) {
                            cellval=cell.getNumericCellValue();
                            field.set(entity, Float.valueOf(cellval.toString()));
                        } else if ((Short.TYPE == fieldType)   || (Short.class == fieldType)) {
                            cellval=cell.getNumericCellValue();
                            field.set(entity, Short.valueOf(cellval.toString()));
                        } else if ((Double.TYPE == fieldType)   || (Double.class == fieldType)) {
                            cellval=cell.getNumericCellValue();
                            field.set(entity, Double.valueOf((cellval==null?0.0:cellval).toString()));
                        } else if (Character.TYPE == fieldType) {
                            cell.setCellType(Cell.CELL_TYPE_STRING);
                            cellval= cell.getStringCellValue();
                            String c=(String) cellval;
                            if ((c != null) && (c.length() > 0)){
                                field.set(entity, Character .valueOf(c.charAt(0)));
                            }
                        }
                        // 取得类型,并根据对象类型设置值.

                    }
                    if (entity != null) {
                        list.add(entity);
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
            log.error("EXCEL 导入失败:IO异常"+e.getMessage());
        } catch (InstantiationException e) {
            e.printStackTrace();
            log.error("EXCEL 导入失败:InstantiationException异常"+e.getMessage());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            log.error("EXCEL 导入失败:IllegalAccessException异常"+e.getMessage());
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            log.error("EXCEL 导入失败:IllegalArgumentException异常"+e.getMessage());
        }  catch( Exception e){
            e.printStackTrace();
            log.error("EXCEL 导入失败:其他异常"+e.getMessage());
        }
        return list;
    }
}

那我们可以新建一个导入的实体类全部设置成String类型的

//新的导入类
public class ImportCs {
    @ExcelVOAttribute(name = "名称",column="A")
    private String mc;
    @ExcelVOAttribute(name = "数量",column="B")
    private String sl;
    @ExcelVOAttribute(name = "单价",column="C")
    private String dj;
    @ExcelVOAttribute(name = "金额",column="D")
    private String je;

    public String getMc() {
        return mc;
    }

    public void setMc(String mc) {
        this.mc = mc;
    }

    public String getSl() {
        return sl;
    }

    public void setSl(String sl) {
        this.sl = sl;
    }

    public String getDj() {
        return dj;
    }

    public void setDj(String dj) {
        this.dj = dj;
    }

    public String getJe() {
        return je;
    }

    public void setJe(String je) {
        this.je = je;
    }
}

再次导入就可以
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值