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

news2025/4/9 21:12:25

我们在用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;
    }
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WARNING:tensorflow:Your input ran out of data; interrupting training. 解决方法

问题详情&#xff1a; WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least steps_per_epoch * epochs batches (in this case, 13800 batches). You may need to use the repeat() funct…

CentOS 7 安装 Tomcat

CentOS 7 安装 Tomcat&#xff08;注意版本号要与自己的版本一致&#xff09; 在/usr/local/下新建文件夹tomcat&#xff1a; cd /usr/local/mkdir tomcatcd tomcat上传tomcat8.5到linux的/usr/local/tomcat下 进入tomcat文件夹下&#xff1a; cd /usr/local/tomcatyum安装…

tensor数学运算

运算函数加add减sub乘mul除div矩阵相乘matmul次方pow平方根及其倒数sqrt 和 rsqrt向下/向上取整floor / ceil分离出整数/小数trunc / frac近似解四舍五入round裁剪clamp 1、矩阵元素的加减乘除 注意是矩阵间对应位置元素进行加减乘除 add 和 a torch.rand(3,4) b torch.…

ardupilot开发 ---传感器驱动,外设驱动篇

ardupilot支持不同厂商的传感器&#xff0c;如雷达&#xff0c;声呐&#xff0c;激光&#xff0c;相机等&#xff1b; 支持的通信协议 I2C, SPI, UART (aka Serial) CANBUS 驱动程序的前后台分离 ardupilot中传感器驱动的重要结构是前后分离&#xff1b; Library库调用前端…

Solidity 小白教程:24. 在合约中创建新合约

Solidity 小白教程&#xff1a;24. 在合约中创建新合约 在以太坊链上&#xff0c;用户&#xff08;外部账户&#xff0c;EOA&#xff09;可以创建智能合约&#xff0c;智能合约同样也可以创建新的智能合约。去中心化交易所uniswap就是利用工厂合约&#xff08;Factory&#xf…

天软特色因子看板 (2023.09 第09期)

该因子看板跟踪天软特色因子A02002 (近一月尾盘成交占比(%))&#xff0c;该因子为近一个月尾盘成交量占比均值因子&#xff0c;用以刻画股票在收盘时&#xff0c;主力资金的流动影响。近一月尾盘成交占比(%)越小&#xff0c;表示多方或空方无力量。近一月尾盘成交占比(%)越大&a…

Day_16 结构体

目录 1.结构体 1.1结构体类型的声明 1.结构体的基础知识 2.结构的声明 3.特殊的声明 1.2结构的自引用 1.3结构体变量的定义和初始化 1.4结构体内存对齐 1.怎么对齐的 2.为什么要对齐 3.修改默认对齐数 1.5结构体传参 1.传值调用 2.传地址调用 3.结论 1.6结构…

SOLIDWORKS二次开发

SOLIDWORKS是一套三维设计软件, 采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式&#xff0c;可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改, 而不需要编程。SOLIDWORKS软件本身的方程式可以实现简…

订阅《复现SCI文章系列教程》

写在前面 《小杜生信笔记》准备开启新的订阅专栏**《复现期刊文章系列教程》&#xff0c;本专栏小杜会寻找一些自己感兴趣的文章进行复现&#xff08;不说百分之百的复现&#xff0c;但是也会百分之八十进行复现&#xff09;。本期刊的教程代码会全部进行公开&#xff08;通过订…

uniapp项目实践总结(二十三)网页和小程序应用打包教程

导语&#xff1a;当你的应用程序开发完成后&#xff0c;在发布到互联网之前&#xff0c;需要进行打包操作&#xff0c;包括网页端、小程序端的打包。 目录 准备工作网页打包小程序打包 准备工作 在打包之前&#xff0c;请保证你的 uniapp 应用程序编译到网页、小程序是可以正…

40亿美元!ChatGPT竞争对手Anthropic,再获巨额融资

9月25日下午&#xff0c;生成式AI平台Anthropic在官网宣布&#xff0c;获得亚马逊&#xff08;Amazon&#xff09;40亿美元&#xff08;约292亿元&#xff09;投资&#xff0c;成为全球生成式AI赛道最高融资之一。 本轮过后&#xff0c;Anthropic的总融资额度达到56亿美元&…

数据结构--堆排序

目录 堆的定义 建立初始化堆的步骤 建立大根堆的代码 大根堆排序的代码 算法效率分析 稳定性 堆的定义 回忆 基于选择排序的特性&#xff1a;选取关键字最小&#xff08;或者最大&#xff09;的元素放入到序列里面&#xff0c;知道了大堆和小堆概念&#xff0c;所以将…

解决电脑桌面软件图标变白的问题

文章目录 前言一、软件图标变白的原因二、解决方法1、显示隐藏项目2、清除图标缓存 前言 桌面软件太多了&#xff0c;导致有些杂乱&#xff0c;换了个显示器后&#xff0c;想着将桌面的软件分类&#xff0c;将其放到不同的目录下&#xff0c;结果有些软件放入文件夹后图标变成…

【【萌新的FPGA学习之触摸屏控制LED实验】】

萌新的FPGA学习之触摸屏控制LED实验 触摸屏控制LED实验 触摸按键主要可分为四大类&#xff1a;电阻式、电容式、红外感应式以及表面声波式。根据其属性的不同&#xff0c;每 种触摸按键都有其合适的使用领域。 电阻式触摸按键由多块导电薄膜按照按键的位置印制而成&#xff0c…

链表(单链表、双链表)

前言&#xff1a;链表是算法中比较难理解的部分&#xff0c;本博客记录单链表、双链表学习&#xff0c;理解节点和指针的使用&#xff0c;主要内容包括&#xff1a;使用python创建链表、实现链表常见的操作。 目录 单链表 双链表 单链表 引入链表的背景&#xff1a; 先来看…

Goby 漏洞发布|泛微 E-office flow_xml.php 文件 SORT_ID 参数 SQL 注入漏洞

漏洞名称&#xff1a;泛微 E-office flow_xml.php 文件 SORT_ID 参数 SQL 注入漏洞 English Name&#xff1a; Weaver E-office flow_xml.php file SORT_ID parameter SQL injection vulnerability CVSS core:7.8 影响资产数&#xff1a; 21632 漏洞描述&#xff1a; 泛微…

idea创建同级项目-纠结是SB

idea创建同级项目-纠结是SB 创建方法&#xff1a;

线性约束最小方差准则(LCMV)波束形成算法仿真

常规波束形成仅能使得主波束对准目标方向&#xff0c;从而在噪声环境下检测到目标&#xff0c;但无法对复杂多变的干扰做出响应&#xff0c;所以不能称之为真正意义上的自适应滤波。自适应阵列处理指的是采用自适应算法对空间阵列接收的混合信号进行处理&#xff0c;又可称为自…

【Element-UI】实现动态树、数据表格及分页效果

一、导言 1、引言 在现代软件开发中&#xff0c;动态树、数据表格以及分页效果成为了许多应用的核心需求。随着业务规模和复杂性的增加&#xff0c;我们往往需要展示大量的层级结构数据&#xff0c;并且实现交互性强且高效的操作。 动态树提供了一种组织结构清晰、可伸缩的展示…

提取PDF数据:Documents for PDF ( GcPdf )

在当今数据驱动的世界中&#xff0c;从 PDF 文档中无缝提取结构化表格数据已成为开发人员的一项关键任务。借助GrapeCity Documents for PDF ( GcPdf )&#xff0c;您可以使用 C# 以编程方式轻松解锁这些 PDF 中隐藏的信息宝藏。 考虑一下 PDF&#xff08;最常用的文档格式之一…