标签:操作 mes vat 就是 any ref tar 用户信息 ble
项目源码:后台:https://github.com/zhongyushi-git/easypoi-demo-admin.git
前端:https://github.com/zhongyushi-git/easypoi-demo.git
1)首先新建一个SpringBoot的项目,搭建基本的环境访问数据,详见源码。
2)导入easypoi依赖
<!--easypoi进行excel操作--> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>3.3.0</version> </dependency>
3)创建Excel操作的工具类ExcelUtils
package com.example.easypoidemoadmin.utils; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; /** * Excel导入导出工具类 */ public class ExcelUtils { /** * excel 导出 * * @param list 数据列表 * @param fileName 导出时的excel名称 * @param response */ public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException { defaultExport(list, fileName, response); } /** * 默认的 excel 导出 * * @param list 数据列表 * @param fileName 导出时的excel名称 * @param response */ private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException { //把数据添加到excel表格中 Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF); downLoadExcel(fileName, response, workbook); } /** * excel 导出 * * @param list 数据列表 * @param pojoClass pojo类型 * @param fileName 导出时的excel名称 * @param response * @param exportParams 导出参数(标题、sheet名称、是否创建表头,表格类型) */ private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException { //把数据添加到excel表格中 Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list); downLoadExcel(fileName, response, workbook); } /** * excel 导出 * * @param list 数据列表 * @param pojoClass pojo类型 * @param fileName 导出时的excel名称 * @param exportParams 导出参数(标题、sheet名称、是否创建表头,表格类型) * @param response */ public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException { defaultExport(list, pojoClass, fileName, response, exportParams); } /** * excel 导出 * * @param list 数据列表 * @param title 表格内数据标题 * @param sheetName sheet名称 * @param pojoClass pojo类型 * @param fileName 导出时的excel名称 * @param response */ public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException { defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF)); } /** * excel 导出 * * @param list 数据列表 * @param title 表格内数据标题 * @param sheetName sheet名称 * @param pojoClass pojo类型 * @param fileName 导出时的excel名称 * @param isCreateHeader 是否创建表头 * @param response */ public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException { ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF); exportParams.setCreateHeadRows(isCreateHeader); defaultExport(list, pojoClass, fileName, response, exportParams); } /** * excel下载 * * @param fileName 下载时的文件名称 * @param response * @param workbook excel数据 */ private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException { try { response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8")); workbook.write(response.getOutputStream()); } catch (Exception e) { throw new IOException(e.getMessage()); } } /** * excel 导入 * * @param file excel文件 * @param pojoClass pojo类型 * @param <T> * @return */ public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException { return importExcel(file, 1, 1, pojoClass); } /** * excel 导入 * * @param filePath excel文件路径 * @param titleRows 表格内数据标题行 * @param headerRows 表头行 * @param pojoClass pojo类型 * @param <T> * @return */ public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException { if (StringUtils.isBlank(filePath)) { return null; } ImportParams params = new ImportParams(); params.setTitleRows(titleRows); params.setHeadRows(headerRows); params.setNeedSave(true); params.setSaveUrl("/excel/"); try { return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params); } catch (NoSuchElementException e) { throw new IOException("模板不能为空"); } catch (Exception e) { throw new IOException(e.getMessage()); } } /** * excel 导入 * * @param file excel文件 * @param titleRows 表格内数据标题行 * @param headerRows 表头行 * @param pojoClass pojo类型 * @param <T> * @return */ public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException { return importExcel(file, titleRows, headerRows, false, pojoClass); } /** * excel 导入 * * @param file 上传的文件 * @param titleRows 表格内数据标题行 * @param headerRows 表头行 * @param needVerfiy 是否检验excel内容 * @param pojoClass pojo类型 * @param <T> * @return */ public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException { if (file == null) { return null; } try { return importExcel(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass); } catch (Exception e) { throw new IOException(e.getMessage()); } } /** * excel 导入 * * @param inputStream 文件输入流 * @param titleRows 表格内数据标题行 * @param headerRows 表头行 * @param needVerfiy 是否检验excel内容 * @param pojoClass pojo类型 * @param <T> * @return */ public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException { if (inputStream == null) { return null; } ImportParams params = new ImportParams(); params.setTitleRows(titleRows); params.setHeadRows(headerRows); params.setSaveUrl("/excel/"); params.setNeedSave(true); params.setNeedVerfiy(needVerfiy); try { return ExcelImportUtil.importExcel(inputStream, pojoClass, params); } catch (NoSuchElementException e) { throw new IOException("excel文件不能为空"); } catch (Exception e) { throw new IOException(e.getMessage()); } } /** * Excel 类型枚举 */ enum ExcelTypeEnum { XLS("xls"), XLSX("xlsx"); private String value; ExcelTypeEnum(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } }
4)创建数据库db2020及表user,执行脚本请下载。链接:https://pan.baidu.com/s/1u2BkcMjTzHiMEB2XPYC0-w ,提取码:86gz
5)excel表格要导入的数据请下载。链接:https://pan.baidu.com/s/1bK6ted72lPlq7anjOy7-Mw ,提取码:w2g4
6)使用vue-cli新建一个vue的项目,并安装需要的插件。项目对axios进行了封装,调用的时候,直接在js中使用即可,详见源码。
7)最后一点,要配置文件中加一行配置
#easypoi启用覆盖 spring main: allow-bean-definition-overriding: true
excel文件的导入,主要就是把文件上传之后把内容读取出来进行相应的操作。
1)编写controller导入接口,service及dao详见源码。需要注意的是,上述的导入的excel内容必须包含表头和标题,否则读取不到内容。
/** * 导入数据 * @param file * @return * @throws IOException */ @RequestMapping(value = "/import", method = RequestMethod.POST) public CommonResult importExcel(@RequestParam("file") MultipartFile file) throws IOException { List<User> list = ExcelUtils.importExcel(file, User.class); int i = userService.insertByBatch(list); if (i != 0) { return new CommonResult(200, "导入成功"); } else { return new CommonResult(444, "导入失败"); } }
2)页面导入的组件
<el-upload class="upload-demo" action="" :limit="1" :http-request="importExcel" :show-file-list="false" :file-list="fileList"> <el-button size="small" type="primary" icon="el-icon-upload">导入</el-button> </el-upload>
3)页面导入的方法
//导入 importExcel(param) { const formData = new FormData() formData.append(‘file‘, param.file) home.upload(formData).then(res => { if (res.code == 200) { this.fileList = [] this.$message.success("导入成功") this.getList() } else { this.$message.error("导入失败") } }).catch(err =>{ console.log(err) this.$message.error("导入失败") }) }
导入就是根据查询的条件把查询结果先写到excel表格中,然后下载这个excel即可。
1)编写controller导出接口,service及dao详见源码。
/** * 导出数据,使用map接收 * * @param map * @param response * @throws IOException */ @PostMapping("/exportExcel") public void exportExcel(@RequestBody Map<String, Object> map, HttpServletResponse response) throws IOException { IPage<User> iPage = userService.getList((String) map.get("name"), (Integer) map.get("page"), (Integer) map.get("limit")); ExcelUtils.exportExcel(iPage.getRecords(), (String) map.get("title"), (String) map.get("sheetName"), User.class, (String) map.get("fileName"), response); }
2)给实体类加注解
package com.example.easypoidemoadmin.entity; import cn.afterturn.easypoi.excel.annotation.Excel; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @author zhongyushi * @date 2020/6/24 0024 * @dec 用户实体 */ @Data @TableName(value = "User") public class User { /** * 用户名 */ @TableId(value = "username") @Excel(name = "用户名", orderNum = "0", width = 30) private String username; /** * 姓名 */ @TableField(value = "name") @Excel(name = "姓名", orderNum = "1", width = 30) private String name; /** * 年龄 */ @TableField(value = "age") @Excel(name = "年龄", orderNum = "2", width = 30) private Integer age; /** * 性别,0表示男,1表示女 */ @TableField(value = "sex") @Excel(name = "性别", orderNum = "3", width = 30,replace = {"男_0", "女_1"}) private String sex; /** * 籍贯 */ @TableField(value = "address") @Excel(name = "籍贯", orderNum = "4", width = 30) private String address; }
3)页面导出的方法
//导出 exportExcel() { this.downloadLoading = true home.exportExcel({ title: ‘用户基本信息‘, sheetName: ‘用户信息‘, fileName: ‘用户信息表‘, name: this.pageData.name, page: this.pageData.page, limit: this.pageData.limit, }).then(res => { //使用js下载文件 fileDownload(res, ‘用户信息表.xlsx‘) }).finally(() => { this.downloadLoading = false; }); },
这里使用到了js-file-download插件,它是用来帮助下载文件的。当下载文件时,很多时候都是在地址栏输入url后浏览器自动帮忙下载,但是要统一请求方式,就把返回的二进制文件交给js-file-download进行处理后再下载。需要注意的是,这个导出的请求,我封装了一个单独的方法,需要指定响应的方式,否则无法下载后的文件是空的,方法截图如下:
有了上面的导出基础,图片的导出就很简单了。
1)新建一个实体类,用于和上面的实体类区分
package com.example.easypoidemoadmin.entity; import cn.afterturn.easypoi.excel.annotation.Excel; import lombok.Data; /** * @author zhongyushi * @date 2020/6/26 0026 * @dec 描述 */ @Data public class Company { @Excel(name = "公司名称",width =20) private String name; /** * type为 2 表示字段类型为图片 * imageType为 1 表示从file读取 */ @Excel(name = "公司logo",width =20,type = 2,imageType = 1) private String logo; @Excel(name = "公司介绍",width =100) private String dec; public Company(String name,String logo,String dec){ this.name=name; this.logo=logo; this.dec=dec; } }
2)创建接口
/** * 图片的导出 * @param response * @throws IOException */ @GetMapping("/imgexport") public void imgExport(HttpServletResponse response) throws IOException { List<Company> list=new ArrayList<>(); //图片的路径自定义,但必须要正确 list.add(new Company("百度","E:/img/1.jpg","百度一下你就知道")); list.add(new Company("腾讯","E:/img/3.jpg","腾讯qq,交流的世界")); list.add(new Company("阿里巴巴","E:/img/2.jpg","阿里巴巴,马云的骄傲")); ExcelUtils.exportExcel(list,"公司介绍","公司介绍",Company.class,"公司介绍",response); }
3)简单起见,直接使用浏览器地址栏进行测试。在浏览器输入http://localhost:8001/easypoidemo-admin/api/user/imgexport即可进行下载,下载的文件如图
1)给Company对象加上无参构造,否则会出现异常
public Company(){}
2)导入接口
/** * 导入图片 * @param file * @return * @throws IOException */ @PostMapping("/imgimport") public CommonResult imgImport(@RequestParam("file") MultipartFile file) throws IOException { List<Company> list = ExcelUtils.importExcel(file, Company.class); return new CommonResult(200,"导入成功",list); }
3)参考excel的导入,添加一个导入的按钮和请求的方法,详见源码
4)点击excel图片上传,把上一步导出的文件进行导入,看到浏览器返回的数据如图
标签:操作 mes vat 就是 any ref tar 用户信息 ble
原文地址:https://www.cnblogs.com/zys2019/p/13194068.html