当前位置:首页 > 实用技巧 >

java导入excel的思路(java大量excel数据导入)

来源:原点资讯(www.yd166.com)时间:2023-05-11 06:48:51作者:YD166手机阅读>>

1. 构建项目

使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的poi包以及一些常用的工具类包,pom文件中添加如下一些依赖:

<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency><dependency><groupId>com.google.collections</groupId><artifactId>google-collections</artifactId><version>1.0</version></dependency>

2. 自定义Excel注解

使用注解的形式,自定义一些与操作Excel相关的基本信息,如生成Excel模板时,需要有哪些字段名、字段标题、字段之间的排序、字段中内容的位置、对齐方式等信息。然后通过在JavaBean中的需要的字段对应的getter方法上添加这些注解,就可以将其标记为Excel相关的字段。自定义注解内容主要如下(为了节省篇幅,一下代码中的注解已删除,详细代码可以看文章后面的链接)

@Target({ElementType.FIELD,Elementtype.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelField { String value() default ""; String title(); int type() default 0; int align() default 0; int sort() default 0; String dictType() default ""; Class<?> fieldType() default Class.class; int[] groups() default {}; }

3. 通过反射创建Excel模板

使用反射的方式获取类的信息、类中方法、属性,为了创建一个可供用户填写的Excel模板,我们需要在模板中定义系统需要收集的数据字段,即在JavaBean中,通过注解定义的相关字段。伪代码及关键代码如下:

public ExportExcel(String title, Class<?> cls, int type, int... groups){ // Get annotation field Field[] fs = cls.getDeclaredFields(); for (Field f : fs){ //获取字段上加的@Excel注解 ExcelField ef = f.getAnnotation(ExcelField.class); if (ef != null && (ef.type()==0 || ef.type()==type)){ //根据字段注解中配置的groups进行分组//.... }else{ //若无group属性,则直接将字段和对应的注解加入到一个全局的注解链表中,用于之后进行统一的排序 annotationList.add(new Object[]{ef, f}); } } } // Get annotation method Method[] ms = cls.getDeclaredMethods(); for (Method m : ms){ //获取方法上的注解 ExcelField ef = m.getAnnotation(ExcelField.class); if (ef != null && (ef.type()==0 || ef.type()==type)){ //操作同对字段的操作 }else{ annotationList.add(new Object[]{ef, m}); } } } // 对字段进行排序 Collections.sort(annotationList, new Comparator<Object[]>() { ‍ ‍//排序规则 }); // Initialize List<String> headerList = Lists.newArrayList(); for (Object[] os : annotationList){ //获取注解title属性值 String t = ((ExcelField)os[0]).title(); //将字段名称保存在一个list中,交给初始化方法使用 headerList.add(t); } //初始化操作,创建Excel,设置文件名称,表格标题,表头内容及单元格的格式等信息 initialize(title, headerList); }

4. 导入Excel文件

导入Excel文件,意味着需要将一个根据我们生成模板填好的Excel文件导入到系统中。在这个过程中,需要使用一个接口去接收文件,并对文件进行解析。在Excel文件中,每一行都对应着我们定义的一个实体对象,所以解析之后,我们得到的是一个存放着多个对象的List。

在解析文件的过程中,首先需要对文件格式校验,保证是一个有效的Excel文件,然后循环读取每一行的数据,并将其赋值给对象。

5. 导出Excel文件

导出Excel的原理同导出模板一样,只是需要将数据填充到Excel文件中。填充数据过程中,还是需要通过@Excel注解将JavaBean中的字段找出,并将值设置到单元格中

6. 测试

01

定义实体类

在实体类中为每个字段添加@Excel注解

public class User { private String userName; private String nickName; private Integer age; private Date birth; @NotNull(message = "User Name 不能为空") @ExcelField(title="User Name", align=2, sort=1) public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @ExcelField(title="Nick Name", align=2, sort=2) public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } @ExcelField(title="Age", align=2, sort=3) public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @JsonFormat(pattern = "mm/dd/YYYY") @NotNull(message="Birth Day不能为空") @ExcelField(title="Birth Day", align=2, sort=4) public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } }

02

定义接口方法

1. 下载输入数据的模板

@RequestMapping("import/template") public void importFileTemplate(HttpServletResponse response){ try { //定义文件名称 String fileName = "User_Data_import_template.xlsx"; List<User> list = Lists.newArrayList(); new ExportExcel("User Data", User.class, 1).setDataList(list).write(response, fileName).dispose(); } catch (IOException e) { e.printStackTrace(); } }

2. 导入Excel文件到系统

@RequestMapping(value = "import",method = RequestMethod.POST) public void importFile(MultipartFile multipartFile){ try { int successNum = 0; int failureNum = 0; StringBuilder failureMsg = new StringBuilder(); ImportExcel ei = new ImportExcel(multipartFile, 1, 0); List<User> list = ei.getDataList(User.class); for (User user : list){ try{ //to do: 保存/处理数据 //userservice.save(user); logger.info(user.toString()); successNum ; }catch(ConstraintViolationException ex){ failureNum ; }catch (Exception ex) { failureNum ; } } if (failureNum>0){ failureMsg.insert(0, ", Failures: " failureNum); } logger.info("Had Operation " successNum " Data;" " " "Failure " failureNum); } catch (Exception e) { logger.error("导入失败",e); } }

3. 导出Excel文件

@RequestMapping("export") public void export(HttpServletResponse response){ try { String fileName = "User Data" DateUtils.getDate("yyyyMMddHHmmss") ".xlsx"; List<User> users=new ArrayList<>(); User user1=new User(); user1.setUserName("小明"); user1.setNickName("猪小明"); user1.setAge(20); user1.setBirth(DateUtils.parseDate("1992-10-10")); users.add(user1); User user2=new User(); user2.setUserName("小红"); user2.setNickName("小小红"); user2.setAge(18); user2.setBirth(DateUtils.parseDate("1998-11-09")); users.add(user2); new ExportExcel("Test Over View Define", User.class,2).setDataList(users).write(response, fileName).dispose(); } catch (Exception e) { } }

03

演示

端口号可以自己通过在application.properties文件中,添加server.port=8000进行定义

通过浏览器访问接口http://localhost:8000/user/import/template,下载模板:

java导入excel的思路,java大量excel数据导入(1)

java导入excel的思路,java大量excel数据导入(2)

编辑Excel文件,并通过接口测试工具Postman访问接口localhost:8000/user/import

java导入excel的思路,java大量excel数据导入(3)

接口测试工具中,上传文件,并访问:

java导入excel的思路,java大量excel数据导入(4)

首页 123下一页

栏目热文

百万excel数据导入java(java导入excel详细教程)

百万excel数据导入java(java导入excel详细教程)

在项目开发中,开发人员在编写代码过程中或多或少都要涉及到直接将固定格式的数据文件内容导入到系统中,例如将一个存放员工信息...

2023-05-11 06:42:31查看全文 >>

java上传和导入excel(java读取上传的excel文件)

java上传和导入excel(java读取上传的excel文件)

一、需求说明通过接口上传一个姓名号码表,返回一个"姓名,号码"格式的的一个String数组。二、功能实现...

2023-05-11 07:03:20查看全文 >>

java将大量excel数据导入数据库(java操作excel直接导入数据库)

java将大量excel数据导入数据库(java操作excel直接导入数据库)

1、导入模板是用来给系统使用者在导入数据时使用的,有了导入模板就相当于有了一个导入的规范,确定需要导入哪些列来让使用者填...

2023-05-11 06:50:45查看全文 >>

java将excel导入数据库(java操作excel直接导入数据库)

java将excel导入数据库(java操作excel直接导入数据库)

由于篇幅有限,csdn的上传在60M内,jar包加起来就超过了,这里只保存了关键的源代码,想要详细的源代码可以私信我。...

2023-05-11 07:21:45查看全文 >>

java操作excel表导入数据库(java操作excel导入表)

java操作excel表导入数据库(java操作excel导入表)

如果项目经理给你一个Excel表格数据,让你把这些数据插入数据库,你会怎么操作?大部分想的就是通过Java代码拼接成S...

2023-05-11 06:47:07查看全文 >>

java完整excel导入mysql数据库(java读取excel文件并导入数据库)

java完整excel导入mysql数据库(java读取excel文件并导入数据库)

看过我之前分享的朋友,应该知道之前我用 ,需要导入大量的数据,也就研究了一下如何在后台批量导入大量的数据。因为源数据都是...

2023-05-11 07:10:10查看全文 >>

java导入导出excel的工具包(java excel导入导出工具)

java导入导出excel的工具包(java excel导入导出工具)

前言在开发应用系统的时候,导出文件是必不可放的功能。以前用过poi、easyexcel等工具的导入导出功能,但总感觉太麻...

2023-05-11 06:44:54查看全文 >>

java将数据导入excel(java将数据写入excel)

java将数据导入excel(java将数据写入excel)

程序员创业记跟大家分享一款excel组件,之所以分享这款,是因为它在处理excel时很方便,我将百万数据导出到excel...

2023-05-11 07:23:58查看全文 >>

java读取excel数据库(java获取数据库中的数据到excel中)

java读取excel数据库(java获取数据库中的数据到excel中)

前言:本篇博客读写Excel使用的是EasyExcel,EasyExcel是一个基于Java的简单、省内存的读写Exce...

2023-05-11 06:49:26查看全文 >>

java连接excel数据源(java操作excel的库)

java连接excel数据源(java操作excel的库)

前言在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel、c...

2023-05-11 06:49:03查看全文 >>

文档排行