iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >springboot使用AOP+反射实现Excel数据的读取
  • 792
分享到

springboot使用AOP+反射实现Excel数据的读取

2024-04-02 19:04:59 792人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

如果我们遇到把excel表格中的数据导入到数据库,首先我们要做的是:将excel中的数据先读取出来。因此,今天就给大家分享一个读取Excel表格数据的代码示例: 为了演示方便,首先我

如果我们遇到把excel表格中的数据导入到数据库,首先我们要做的是:将excel中的数据先读取出来。
因此,今天就给大家分享一个读取Excel表格数据的代码示例:

为了演示方便,首先我们创建一个Spring Boot项目;具体创建过程这里不再详细介绍;

示例代码主要使用了Apache下的poi的jar包及api;因此,我们需要在pom.xml文件中导入以下依赖:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.13</version>
        </dependency>

主要代码:

ExcelUtils.java

import com.example.springbatch.xxkfz.annotation.ExcelField;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;



@Slf4j
public class ExcelUtils {

    private HSSFWorkbook workbook;

    public ExcelUtils(String fileDir) {
        File file = new File(fileDir);
        try {
            workbook = new HSSFWorkbook(new FileInputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    
    public List readFromExcelData(String sheetName, Object object) {
        List result = new ArrayList();

        // 获取该对象的class对象
        Class class_ = object.getClass();

        // 获得该类的所有属性
        Field[] fields = class_.getDeclaredFields();

        // 读取excel数据  获得指定的excel表
        HSSFSheet sheet = workbook.getSheet(sheetName);

        // 获取表格的总行数
        int rowCount = sheet.getLastRowNum() + 1; // 需要加一
        if (rowCount < 1) {
            return result;
        }

        // 获取表头的列数
        int columnCount = sheet.getRow(0).getLastCellNum();

        // 读取表头信息,确定需要用的方法名---set方法
        // 用于存储方法名
        String[] methodNames = new String[columnCount]; // 表头列数即为需要的set方法个数

        // 用于存储属性类型
        String[] fieldTypes = new String[columnCount];

        // 获得表头行对象
        HSSFRow titleRow = sheet.getRow(0);

        // 遍历表头列
        for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {

            // 取出某一列的列名
            String colName = titleRow.getCell(columnIndex).toString();

            //
            String fieldName = fields[columnIndex].getName();
            String UpperFieldName = Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1, fieldName.length());
            methodNames[columnIndex] = "set" + UpperFieldName;

            // 遍历属性数组
            for (int i = 0; i < fields.length; i++) {

                // 获取属性上的注解name值
                String name = fields[i].getAnnotation(ExcelField.class).name();

                // 属性与表头相等
                if (Objects.nonNull(name) && colName.equals(name)) {
                    //  将属性类型放到数组中
                    fieldTypes[columnIndex] = fields[i].getType().getName();
                }
            }
        }

        // 逐行读取数据 从1开始 忽略表头
        for (int rowIndex = 1; rowIndex < rowCount; rowIndex++) {
            // 获得行对象
            HSSFRow row = sheet.getRow(rowIndex);
            if (row != null) {
                Object obj = null;
                // 实例化该泛型类的对象一个对象
                try {
                    obj = class_.newInstance();
                } catch (Exception e1) {
                    e1.printStackTrace();
                }

                // 获得本行中各单元格中的数据
                for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
                    String data = row.getCell(columnIndex).toString();
                    // 获取要调用方法的方法名
                    String methodName = methodNames[columnIndex];

                    obj = this.valueConvert(fieldTypes[columnIndex], methodName, class_, obj, data);
                }
                result.add(obj);
            }
        }
        return result;
    }

    
    private Object valueConvert(String fieldType, String methodName, Class class_, Object obj, String data) {
        Method method = null;
        if (Objects.isNull(fieldType) || Objects.isNull(methodName) || Objects.isNull(class_) || Objects.isNull(obj)) {
            return obj;
        }
        try {
            switch (fieldType) {
                case "java.lang.String":
                    method = class_.getDeclaredMethod(methodName, String.class);
                    method.invoke(obj, data); // 执行该方法
                    break;
                case "java.lang.Integer":
                    method = class_.getDeclaredMethod(methodName, Integer.class);
                    Integer value = Integer.valueOf(data);
                    method.invoke(obj, value); // 执行该方法
                    break;
                case "java.lang.Boolean":
                    method = class_.getDeclaredMethod(methodName, Boolean.class);
                    Boolean booleanValue = Boolean.getBoolean(data);
                    method.invoke(obj, booleanValue); // 执行该方法
                    break;
                case "java.lang.Double":
                    method = class_.getDeclaredMethod(methodName, Double.class);
                    double doubleValue = Double.parseDouble(data);
                    method.invoke(obj, doubleValue); // 执行该方法
                    break;
                case "java.math.BigDecimal":
                    method = class_.getDeclaredMethod(methodName, BigDecimal.class);
                    BigDecimal bigDecimal = new BigDecimal(data);
                    method.invoke(obj, bigDecimal); // 执行该方法
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }
}

ExcelField.java

import java.lang.annotation.*;


@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented
public @interface ExcelField {
    String name() default "";
}

实体类 ExcelFileField.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ExcelFileField {

    @ExcelField(name = "id")
    private String id;

    @ExcelField(name = "code")
    private String code;

    @ExcelField(name = "type")
    private String type;

    @ExcelField(name = "version")
    private String version;
}

函数测试

 @Test
    void readExcel() {
        ExcelUtils utils = new ExcelUtils("E:/test.xls");
        ExcelFileField interfaceField = new ExcelFileField();
        List list = utils.readFromExcelData("sheet1", interfaceField);
        for (int i = 0; i < list.size(); i++) {
            ExcelFileField item = (ExcelFileField) list.get(i);
            System.out.println(item.toString());
        }
    }

Excel表格数据

测试结果:

ExcelFileField(id=X0001, code=X0001, type=X0001, version=X0001)
ExcelFileField(id=X0002, code=X0002, type=X0002, version=X0002)

Process finished with exit code 0

 到此这篇关于SpringBoot使用aop+反射实现Excel数据的读取的文章就介绍到这了,更多相关springboot实现Excel读取内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: springboot使用AOP+反射实现Excel数据的读取

本文链接: https://www.lsjlt.com/news/163902.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot使用AOP+反射实现Excel数据的读取
    如果我们遇到把excel表格中的数据导入到数据库,首先我们要做的是:将excel中的数据先读取出来。因此,今天就给大家分享一个读取Excel表格数据的代码示例: 为了演示方便,首先我...
    99+
    2024-04-02
  • springboot如何使用AOP+反射实现Excel数据的读取
    这篇文章将为大家详细讲解有关springboot如何使用AOP+反射实现Excel数据的读取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如果我们遇到把excel表格中的数据导入到数据库,首...
    99+
    2023-06-29
  • SpringBoot实现使用反射模拟IOC和getBean
    IOC就是spring的核心思想之一:控制反转。这里不再赘述,看我的文章即可了解: spring基础思想IOC 其次就是java的反射,反射机制是spring的重要实现核心,今天我看...
    99+
    2023-05-14
    SpringBoot反射模拟IOC SpringBoot反射模拟getBean
  • java利用注解实现简单的excel数据读取
    实现工具类利用注解实现简单的excel数据读取,利用注解对类的属性和excel中的表头映射,使用Apache的poi就不用在业务代码中涉及row,rows这些属性了。定义注解:@Retention(RetentionPolicy.RUNTI...
    99+
    2023-05-31
    java 注解 excel
  • Java中使用反射机制如何实现一个Aop代理
    今天就跟大家聊聊有关Java中使用反射机制如何实现一个Aop代理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。利用反射生成JDK的动态代理,也就是AOP中的AOP代理,代替目标对象,...
    99+
    2023-05-31
    java aop 反射
  • 使用AOP+反射实现自定义Mybatis多表关联查询
    目录一、需求二、核心代码MapToDoMapIDualMapperDualMapperDoMapAspect三、使用方法SysUserSysRoleSysPermissionSysU...
    99+
    2024-04-02
  • Python读取Excel数据实现批量生成PPT
    目录背景需求准备PPT数据PPT模板实战导入相关模块读取电影数据读取PPT模板插入数据背景 大家好,我是J哥。 我们常常面临着大量的重复性工作,通过人工方式处理往往耗时耗力易出错。而...
    99+
    2024-04-02
  • Python怎么实现Excel数据读取和写入
    这篇“Python怎么实现Excel数据读取和写入”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么实现Exce...
    99+
    2023-06-30
  • Python自动化办公之读取Excel数据的实现
    目录前言Excel 读取 - xlrd常用函数介绍获取 excel 对象获取工作簿读取工作簿内容前言 之前的章节我们学习了 python 关于 word 文件相关操作的知识点,从今天...
    99+
    2024-04-02
  • SpringBoot如何实现使用反射模拟IOC和getBean
    这篇文章主要介绍“SpringBoot如何实现使用反射模拟IOC和getBean”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何实现使用反射模拟IOC和getBean”文章能帮...
    99+
    2023-07-05
  • Python读取Excel数据实现批量生成合同
    目录一、背景二、准备三、实战1.安装相关库2.读取合同数据3.批量合同生成大家好,我是J哥。 在我们的工作中,面临着大量的重复性工作,通过人工方式处理往往耗时耗力易出错。而Pytho...
    99+
    2024-04-02
  • SpringBoot+easypoi实现数据的Excel导出
    本文实例为大家分享了SpringBoot+easypoi实现数据的Excel导出的具体代码,供大家参考,具体内容如下 maven <dependency> ...
    99+
    2024-04-02
  • 使用python的pandas读取excel文件中的数据详情
    目录一、读取Excel文件二、DataFrame对象的结构三、用values方式获取数据1.基本方法2.获取指定数据的写法3.示例四、用loc和iloc方式获取数据1.基本写法2.示...
    99+
    2024-04-02
  • 详解Python如何实现Excel数据读取和写入
    目录1. 功能分析2.系统开发环境3.安装依赖库4. 主函数设计5.模块设计1. 功能分析 1.加载文件夹内所有的Excel数据; 2.生产贡献度分析图表(以柱状图显示表格数据); ...
    99+
    2024-04-02
  • 怎么使用AOP+反射实现自定义Mybatis多表关联查询
    这篇“怎么使用AOP+反射实现自定义Mybatis多表关联查询”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用AOP+...
    99+
    2023-06-30
  • 怎么用Python读取Excel数据实现批量生成合同
    这篇文章主要介绍“怎么用Python读取Excel数据实现批量生成合同”,在日常操作中,相信很多人在怎么用Python读取Excel数据实现批量生成合同问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Py...
    99+
    2023-06-30
  • 用Python的pandas读取excel文件中的数据
    一、前言 hello呀!各位铁子们大家好呀,今天呢来和大家聊一聊用Python的pandas读取excel文件中的数据。 二、读取Excel文件 使用pandas的read_excel()方法,可通过文件路径直接读取。注意到,在一个exce...
    99+
    2023-09-01
    python excel 软件测试 自动化测试 测试工程师
  • C#利用反射实现多数据库访问
    在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。 项目整...
    99+
    2024-04-02
  • 如何使用PyTorch实现自由的数据读取
    目录前言PyTorch数据读入函数介绍ImageFolderDatasetDataLoader问题来源自定义数据读入的举例实现总结前言 很多前人曾说过,深度学习好比炼丹,框架就是丹炉...
    99+
    2024-04-02
  • nodejs中如何使用node-xlsx模块读取excel数据
    这篇文章给大家分享的是有关nodejs中如何使用node-xlsx模块读取excel数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.安装node-xlsxnode-xlsx模块 用于读取xlsx文件中的内容...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作