系列导航

springBoot项目打jar包

1、springboot工程新建(单模块)

2、springboot创建多模块工程

3、springboot连接数据库

4、SpringBoot连接数据库引入druid

5、SpringBoot连接数据库引入mybatis

6、SpringBoot-mybatis分页实现pagehelper

7、SpringBoot-mybatis-plus引入

8、SpringBoot 事务

9、SpringBoot-mybatis-druid多源数据多源数据

10、SpringBoot-mybatis-plus-druid多源数据

11、SpringBoot-mybatis-plus-druid多源数据事务

12、SpringBoot-mybatis-plus-ehcache

13、SpringBoot-配置文件里密码加密

14、SpringBoot-easyexcel导出excle

完结

本文主要描述,springboot如何下载excle,上传解析excle,以及把上传excle中错误的数据在返回给用户一个并告知数据哪里错误这样一个功能。

1、pom.xml文件

 <dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.5</version>
</dependency>

2、配置文件

# 应用名称
spring.application.name=demo
# 应用服务 WEB 访问端口
server.port=8080

3、工程结构

4、源码

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} }
package com.example.demo.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.example.demo.domain.Student;
import com.example.demo.service.ExeclService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List; @Controller
@RequestMapping("/excle")
public class ExcelController { @Autowired
private ExeclService execlService; //将数据写入到excle文档里并且下载
@GetMapping("/down")
@ResponseBody
public void test(HttpServletResponse response) throws IOException {
List<Student> list = new ArrayList<>();
list.add(new Student("001","张三"));
list.add(new Student("002","李四"));
list.add(new Student("003","王五"));
//返回输出流。格式Excel
response.setContentType("application/vnd.ms-excel");
//设置表名称
String name = "学生信息表";
try {
//设置编码格式
name = URLEncoder.encode(name, StandardCharsets.UTF_8.toString());
// 设置输出名字 attachment附件
response.setHeader("Content-Disposition", "attachment;filename=" + name + ".xlsx"); //将输出流封装到excelWriter
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build(); //定义工作表对象
WriteSheet sheet = EasyExcel.writerSheet(0,"sheet").head(Student.class).build();
//sheet.setTableStyle();
//往excel写入
excelWriter.write(list,sheet);
//关闭输出流
excelWriter.finish(); } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} } //上传excle并解析
@PostMapping("/upload")
@ResponseBody
public void upload(@RequestParam("file") MultipartFile multipartFile, HttpServletResponse response) throws IOException {
execlService.upFile(multipartFile);
} //上传excle并解析,而且将有错误的数据返回给用户
@PostMapping("/uploadAndReturnError")
@ResponseBody
public void uploadAndReturnError(@RequestParam("file") MultipartFile multipartFile, HttpServletResponse response) throws IOException {
String result = execlService.upFileAndReturn(multipartFile,response);
System.out.println(result);
}
}
package com.example.demo.domain;

public class Employee {

    private String noId;

    private String empName;

    private Integer empAge;

    private String text;

    public String getNoId() {
return noId;
} public void setNoId(String noId) {
this.noId = noId;
} public String getEmpName() {
return empName;
} public void setEmpName(String empName) {
this.empName = empName;
} public Integer getEmpAge() {
return empAge;
} public void setEmpAge(Integer empAge) {
this.empAge = empAge;
} public String getText() {
return text;
} public void setText(String text) {
this.text = text;
} @Override
public String toString() {
return "Employee{" +
"noId='" + noId + '\'' +
", empName='" + empName + '\'' +
", empAge=" + empAge +
", text='" + text + '\'' +
'}';
}
}
package com.example.demo.domain;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight; @ContentRowHeight(15) // 文本行高度
@HeadRowHeight(20) // 标题高度
@ColumnWidth(25) // 默认列宽度
public class EmployeeOther {
@ExcelProperty("员工id")
private String noId; @ExcelProperty("员工姓名")
private String empName; @ExcelProperty("员工年龄")
private Integer empAge; @ExcelProperty("错误提示")
private String text; public String getNoId() {
return noId;
} public void setNoId(String noId) {
this.noId = noId;
} public String getEmpName() {
return empName;
} public void setEmpName(String empName) {
this.empName = empName;
} public Integer getEmpAge() {
return empAge;
} public void setEmpAge(Integer empAge) {
this.empAge = empAge;
} public String getText() {
return text;
} public void setText(String text) {
this.text = text;
} @Override
public String toString() {
return "EmployeeOther{" +
"noId='" + noId + '\'' +
", empName='" + empName + '\'' +
", empAge=" + empAge +
", text='" + text + '\'' +
'}';
}
}
package com.example.demo.domain;

import com.alibaba.excel.annotation.ExcelProperty;

public class Student {

    @ExcelProperty("学号")//指定字段名字
//@ExcelIgnore//忽略该字段
private String id; @ExcelProperty(value="姓名",index = 0)
private String name; public Student( String id,String name ) {
this.id = id;
this.name = name;
} public Student() {
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} @Override
public String toString() {
return "Studen{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
'}';
}
}
package com.example.demo.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener; import java.util.ArrayList;
import java.util.List; public class ReadListener extends AnalysisEventListener { private static List<Object> list = new ArrayList<>();
// 每读一行,会调用该invoke方法一次
@Override
public void invoke(Object data, AnalysisContext analysisContext) {
list.add(data);
System.out.println("解析到一条数据:" + data); } // 全部读完之后,会调用该方法
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("全部解析完成");
} /**
* 返回读取到的数据集合
*
*/
public static List<Object> getList() {
return list;
} }
package com.example.demo.service;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.example.demo.domain.Employee;
import com.example.demo.domain.EmployeeOther;
import com.example.demo.listener.ReadListener;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List; @Component
public class ExeclService { //解析上传的excle数据
public void upFile(MultipartFile multipartFile) throws IOException { //headRowNumber(1)意思是第一行是表头
ExcelReaderBuilder workBook = EasyExcel.read(multipartFile.getInputStream(), Employee.class, new ReadListener()).headRowNumber(1);
// 封装工作表
ExcelReaderSheetBuilder sheet1 = workBook.sheet();
// 读取
sheet1.doRead(); List<Object> list = ReadListener.getList();
int size = list.size(); for (int i = 0; i < list.size(); i++) {
Employee employee = (Employee) list.get(i); String noId = employee.getNoId();
String empName = employee.getEmpName();
Integer empAge = employee.getEmpAge();
String text = employee.getText(); System.out.println("noId:" + noId);
System.out.println("empName:" + empName);
System.out.println("empAge:" + empAge);
System.out.println("text:" + text); }
} //解析上传的excle数据,并将错误数据返回给用户
public String upFileAndReturn(MultipartFile multipartFile, HttpServletResponse response) throws IOException {
//导入正确的数据
int correctNum = 0;
//导入错误的数据
int wrongNum = 0; //headRowNumber(1)意思是第一行是表头
ExcelReaderBuilder workBook = EasyExcel.read(multipartFile.getInputStream(), EmployeeOther.class, new ReadListener()).headRowNumber(1);
// 封装工作表
ExcelReaderSheetBuilder sheet1 = workBook.sheet();
// 读取
sheet1.doRead(); //获取读取的数据
List<Object> list = ReadListener.getList(); int size = list.size();
//错误数据里列表
List<EmployeeOther> wrongList = new ArrayList<>();
for (int i = 0; i < size; i++) {
EmployeeOther employeeOther = (EmployeeOther) list.get(i); String noId = employeeOther.getNoId();
String empName = employeeOther.getEmpName();
Integer empAge = employeeOther.getEmpAge();
String text = employeeOther.getText(); //设置noId 等于1或者2 是错误数据
if ("1".equals(noId)||"2".equals(noId) ){
employeeOther.setText("该数据错误");
wrongList.add(employeeOther);
wrongNum++;
}else {
System.out.println("noId:" + noId);
System.out.println("empName:" + empName);
System.out.println("empAge:" + empAge);
System.out.println("text:" + text);
correctNum++;
}
}
//清理list里的数据,不清理下一次之前导入的数据依然存在
list.clear();
//将错误信息导出
if(wrongList.size()!=0) {
String name = "errorDataList"; //生成错误数据的返回文件
response.setContentType("application/vnd.ms-excel;charset=UTF-8");// 设置文本内省
response.setCharacterEncoding("utf-8");// 设置字符编码
name = URLEncoder.encode(name, StandardCharsets.UTF_8.toString());
response.setHeader("Content-disposition", "attachment;filename="+name+".xlsx"); // 设置响应头
EasyExcel.write(response.getOutputStream(), EmployeeOther.class).sheet(name).doWrite(wrongList); //用io流来写入数据
response.getOutputStream().flush(); }
System.out.println("导入成功数据" + correctNum + "条,错误数据" + wrongNum + "条,错误数据请下载修改后重新上传!");
return "导入成功数据" + correctNum + "条,错误数据" + wrongNum + "条,错误数据请下载修改后重新上传!";
}
}

5、测试文件下载

(1)设置导出字段的表头

(2)忽略某字段设置

(3)指定导出的顺序

6、测试文件上传解析

导入的excle内容如下

7、测试文件上传解析并返回错误数据

导入的excle内容如下

14、SpringBoot-easyexcel导出excle的更多相关文章

  1. SpringBoot图文教程14—SpringBoot集成EasyExcel「上」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  2. 使用VUE+SpringBoot+EasyExcel 整合导入导出数据

    使用VUE+SpringBoot+EasyExcel 整合导入导出数据 创建一个普通的maven项目即可 项目目录结构 1 前端 存放在resources/static 下 index.html &l ...

  3. 使导出excle文档实现ALT+Enter的效果()

    JAVA中输入什么转义字符,使导出excle文档实现ALT+Enter的效果?或者有没有其他方法可以实现. 20 JAVA中输入什么转义字符,使导出excle文档实现ALT+Enter的效果?或者有没 ...

  4. easyExcel导出excel的简单使用

    easyExcel导出excel的简单使用 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定 ...

  5. vue下载模板、导出excle

    1.下载模板是 下载模版比较简单,就是跳一个新的页面 2.导出excle 就是get请求,把自己要导出的参数一一拼接起来 }

  6. React+后端实现导出Excle表格的功能

    最近在做一个基于React+antd前端框架的Excel导出功能,我主要在后端做了处理,根据以下步骤,可以很容易就实现导出Excel表格数据的功能. 在做这类导出文件的功能,其实,在后端进行处理,会更 ...

  7. 手把手教你springboot中导出数据到excel中

    手把手教你springboot中导出数据到excel中 问题来源: 前一段时间公司的项目有个导出数据的需求,要求能够实现全部导出也可以多选批量导出(虽然不是我负责的,我自己研究了研究),我们的项目是x ...

  8. EasyExcel导出小结:动态标题、标题格式、相同值合并

    1. 实列相关依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel& ...

  9. SpringBoot基于easyexcel导出和写入Excel

      easyexcel是阿里巴巴旗下开源项目,主要用于Excel文件的导入和导出处理,今天我们利用SpringBoot和easyexcel实战演示如何导出和写入Excel文件. 一.加入我们需要的ea ...

  10. springboot使用EasyExcel,导出数据到Excel表格,并且将Excel表中数据导入

    一.导出至Excel 1.导入依赖 导出方法需要使用到fastJson的依赖,这里也直接导入 点击查看代码 <!--阿里的easyexcel--> <dependency> & ...

随机推荐

  1. 掌握这些,轻松管理BusyBox:inittab文件的配置和作用解析

    BusyBox 是一个轻量级的开源工具箱,其中包含了许多标准的 Unix 工具,例如 sh.ls.cp.sed.awk.grep 等,同时它也支持大多数关键的系统功能,例如自启动.进程管理.启动脚本等 ...

  2. C++ Qt开发:LineEdit单行输入组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍LineEdi ...

  3. 在arm架构的银河麒麟系统部署Redis

    以下是在arm架构的银河麒麟系统上部署Redis的详细步骤: 1. 创建文件夹 首先,在合适的位置创建必要的文件夹.在本例中,我们将创建/opt/redis和/usr/src/redis两个文件夹. ...

  4. MD5加密算法工具类创建

    直接上代码 /** * 通用方法工具类 */ public class CrowdUtil { /** * 对明文字符串进行MD5加密 * @param source * @return */ pub ...

  5. 在C#中,如何以编程的方式设置 Excel 单元格样式

    前言 在C#开发中,处理Excel文件是一项常见的任务.在处理Excel文件时,经常需要对单元格进行样式设置,以满足特定的需求和美化要求,通过使用Java中的相关库和API,我们可以轻松地操作Exce ...

  6. CTFHub 栈溢出 ret2text exp代码

    exp代码: from pwn import * host='challenge-1868f48f1e630fd3.sandbox.ctfhub.com' port=27988 p=connect(h ...

  7. quill富文本编辑器quill粘贴图片上传服务器

    强大的富文本编辑器:quill github:32k start++,:https://github.com/quilljs/quill quill粘贴图片上传服务器 <link href=&q ...

  8. 一款便捷操作移动端设备的PC工具

    说明 该项目基于[Tinyui]框架开发.为电脑端(Windows/MacOS/Linux)操作移动设备提供便捷操作的工具. 项目代码已开源:☞ Github ☜ ☞ Gitee ☜ 功能 运行 由于 ...

  9. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG

    斯坦福 UE4 C++ ActionRoguelike游戏实例教程 07.在C++中使用UMG 斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章的目标是 ...

  10. 一些Mybatis的知识点&易错点总结

    1.映射文件配置容易出错 在映射文件中,我们习惯性在sql语句后面添加';'. 结果是报了一堆错误: org.apache.ibatis.exceptions.PersistenceException ...