专业做物业网站的公司,怎样进行网络推广效果更好,临沂市住房和城乡建设局网站,word超链接网站怎样做文章目录easyPOI基本用法1.Excel文件的简单导入和导出1.1准备工作1.2导入1.3导出1.4图片的导出1.5图片的导入1.6excel模板导出文件1.7excel转html2.Word文件导出2.1使用word模板导出2.2使用word模板导出多页3.excel导入时验证3.1环境准备3.2实战演练3.3注意事项easyPOI基本用法…
文章目录easyPOI基本用法1.Excel文件的简单导入和导出1.1准备工作1.2导入1.3导出1.4图片的导出1.5图片的导入1.6excel模板导出文件1.7excel转html2.Word文件导出2.1使用word模板导出2.2使用word模板导出多页3.excel导入时验证3.1环境准备3.2实战演练3.3注意事项easyPOI基本用法
参考网址http://www.wupaas.com/
1.Excel文件的简单导入和导出
项目源码https://github.com/zhongyushi-git/springboot-easypoi.git。后台在easypoi-demo-admin目录下前端在easypoi-demo目录下。
说明源码中可能与下面的介绍的代码稍有差异请以源码为准。
1.1准备工作
1首先新建一个SpringBoot的项目搭建基本的环境访问数据详见源码。
2导入easypoi依赖
定义版本
easypoi.version4.1.0/easypoi.version坐标这里是以springmvc的坐标导入的适用大部分功能。如果需求不多可以直接导入springboot对应的坐标二者选一。选择依据就是如果报错就换另一种坐标即可。 !--easypoi--dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-base/artifactIdversion${easypoi.version}/version/dependencydependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-web/artifactIdversion${easypoi.version}/version/dependencydependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-annotation/artifactIdversion${easypoi.version}/version/dependencyspringboot的坐标
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-spring-boot-starter/artifactIdversion3.3.0/version
/dependency3创建Excel操作的工具类ExcelUtils
package com.example.easypoidemoadmin.utils;import cn.afterturn.easypoi.cache.manager.POICacheManager;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.ExcelXorHtmlUtil;
import cn.afterturn.easypoi.excel.entity.ExcelToHtmlParams;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.word.WordExportUtil;
import cn.afterturn.easypoi.word.parse.ParseWord07;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
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(ListMapString, Object list, String fileName, HttpServletResponse response) throws IOException {defaultExport(list, fileName, response);}/*** 默认的 excel 导出** param list 数据列表* param fileName 导出时的excel名称* param response*/private static void defaultExport(ListMapString, 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 .xlsx, 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 ListT importExcel(MultipartFile file, ClassT 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 ListT importExcel(String filePath, Integer titleRows, Integer headerRows, ClassT 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 上传的文件* param titleRows 表格内数据标题行* param headerRows 表头行* param pojoClass pojo类型* param T* return*/public static T ListT importExcel(MultipartFile file, Integer titleRows, Integer headerRows, ClassT pojoClass) throws IOException {if (file null) {return null;}try {return importExcel(file.getInputStream(), titleRows, headerRows, pojoClass);} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel 导入** param inputStream 文件输入流* param titleRows 表格内数据标题行* param headerRows 表头行* param pojoClass pojo类型* param T* return*/public static T ListT importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, ClassT pojoClass) throws IOException {if (inputStream null) {return null;}ImportParams params new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);params.setSaveUrl(/excel/);params.setNeedSave(true);try {return ExcelImportUtil.importExcel(inputStream, pojoClass, params);} catch (NoSuchElementException e) {throw new IOException(excel文件不能为空);} catch (Exception e) {throw new IOException(e.getMessage());}}
}4创建数据库db2020及表user执行脚本在根目录下。
5excel表格要导入的数据文件在项目根路径的template文件夹下
6使用vue-cli新建一个vue的项目并安装需要的插件。项目对axios进行了封装调用的时候直接在js中使用即可详见源码。
7最后一点要配置文件中加一行配置
#easypoi启用覆盖
springmain:allow-bean-definition-overriding: true1.2导入
excel文件的导入主要就是把文件上传之后把内容读取出来进行相应的操作。
1编写controller导入接口service及dao详见源码。 /*** 导入数据* param file* return* throws IOException*/RequestMapping(value /import, method RequestMethod.POST)public CommonResult importExcel(RequestParam(file) MultipartFile file) throws IOException {ListUser list ExcelUtils.importExcel(file, User.class);int i userService.insertByBatch(list);if (i ! 0) {return new CommonResult(200, 导入成功);} else {return new CommonResult(444, 导入失败);}}2新建User实体类给属性添加Excel注解
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;/*** dec 用户实体*/
Data
TableName(value User)
public class User {/*** 用户名*/TableId(value username)Excel(name 用户名,)private String username;/*** 姓名*/TableField(value name)Excel(name 姓名)private String name;/*** 年龄*/TableField(value age)Excel(name 年龄)private Integer age;/*** 性别,0表示男1表示女*/TableField(value sex)Excel(name 性别,replace {男_0, 女_1})private String sex;/*** 籍贯*/TableField(value address)Excel(name 籍贯)private String address;
}需要注意的是上述的导入的excel内容必须包含表头和标题否则读取不到内容。在性别这里分别使用数字代替文字存储方便。
3页面导入的组件 el-upload classupload-demo action :limit1 :http-requestimportExcel :show-file-listfalse :file-listfileListel-button sizesmall typeprimary iconel-icon-upload导入/el-button/el-upload4页面导入的方法 //导入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(导入失败)})} 导入的模板在后台代码的项目根目录下的template目录下。
5注意事项
Aexcel表格的表头必须和Excel的name属性一样否则读取不到数据。
B若导入的字段包含日期类型那么需要指定导入时的日期的格式并标明是必导入字段如下所示excel的内容的日期也需要是这种格式
Excel(name 日期,isImportField true, importFormat yyyy-MM-dd ,databaseFormat yyyy-MM-dd)C若导出的字段包含日期类型那么需要指定导出的格式
Excel(name 日期,exportFormat yyyy-MM-dd, databaseFormat yyyy-MM-dd)二者综合的代码如下下一小节的导出日期就不再说明。
Excel(name 日期,isImportField true,exportFormat yyyy-MM-dd, importFormat yyyy-MM-dd ,databaseFormat yyyy-MM-dd)1.3导出
导入就是根据查询的条件把查询结果先写到excel表格中然后下载这个excel即可。
1编写controller导出接口service及dao详见源码。
/*** 导出数据使用map接收** param map* param response* throws IOException*/PostMapping(/exportExcel)public void exportExcel(RequestBody MapString, Object map, HttpServletResponse response) throws IOException {IPageUser 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给实体类Excel注解添加其他属性
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;/*** 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 truehome.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.4图片的导出
有了上面的导出基础图片的导出就很简单了。
1新建一个实体类用于和上面的实体类区分
package com.example.easypoidemoadmin.entity;import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;/*** 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.namename;this.logologo;this.decdec;}
}2创建接口图片请自行下载。
/*** 图片的导出** param response* throws IOException*/PostMapping(/imgexport)public void imgExport(HttpServletResponse response,RequestBody MapString, Object map) throws IOException {ListCompany 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, 阿里巴巴马云的骄傲));String fileName map.get(fileName).toString();ExcelUtils.exportExcel(list, fileName, fileName, Company.class, fileName, response);}
3在页面添加导出的按钮点击按钮即可进行下载下载的文件如图 1.5图片的导入
1给Company对象加上无参构造否则会出现异常 public Company(){}
2导入接口 /*** 导入图片* param file* return* throws IOException*/PostMapping(/imgimport)public CommonResult imgImport(RequestParam(file) MultipartFile file) throws IOException {ListCompany list ExcelUtils.importExcel(file, Company.class);return new CommonResult(200,导入成功,list);}
3参考excel的导入添加一个导入的按钮和请求的方法详见源码
4点击excel图片上传把上一步导出的文件进行导入看到浏览器返回的数据如图 1.6excel模板导出文件
也可以使用固定的模板来导出excel。
1在工具类添加方法 /*** 根据模板生成excel后导出* param templatePath 模板路径* param map 数据集合* param fileName 文件名* param response* throws IOException*/public static void exportExcel(TemplateExportParams templatePath, MapString, Object map,String fileName, HttpServletResponse response) throws IOException {Workbook workbook ExcelExportUtil.exportExcel(templatePath, map);downLoadExcel(fileName, response, workbook);}
2编写模板excel。截图如下模板文件在项目根路径的template文件夹下 在两个大括号里写对应的数据名称。$fe用来遍历数据fe的写法 fe标志 : list数据 单个元素数据默认t不需要写 {{$fe: maplist t.id }}
3接口
/*** 使用模板excel导出** param response* throws Exception*/PostMapping(/excelTemplate)public void makeExcelTemplate(HttpServletResponse response, RequestBody MapString, Object param) throws Exception {TemplateExportParams templatePath new TemplateExportParams(E:/excel/用户信息文件模板.xls);MapString, Object map new HashMap();SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd);map.put(date, sdf.format(new Date()));map.put(user, admin);IPageUser ipages userService.getList(, 1, 10);map.put(userList, ipages.getRecords());ExcelUtils.exportExcel(templatePath, map, param.get(fileName).toString(), response);}
在接口中指定模板文件的路径然后给定数据map的key值要和模板的值保持一致。
4页面添加按钮和请求方法见源码。点击即可下载。
1.7excel转html
1在工具类添加方法 /*** excel转html预览* param filePath 文件路径* param response* throws Exception*/public static void excelToHtml(String filePath,HttpServletResponse response) throws Exception{ExcelToHtmlParams params new ExcelToHtmlParams(WorkbookFactory.create(POICacheManager.getFile(filePath)),true);response.getOutputStream().write(ExcelXorHtmlUtil.excelToHtml(params).getBytes());}
2编写接口
/*** EXCEL转html预览*/GetMapping(previewExcel)public void excelToHtml(HttpServletResponse response) throws Exception {ExcelUtils.excelToHtml(E:/excel/用户信息导入模板.xlsx,response);}
3页面添加按钮和请求方法见源码。点击即可在弹框中显示。
2.Word文件导出
2.1使用word模板导出
1导入easypoi-base的依赖 dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-base/artifactIdversion${easypoi.version}/version/dependency
2在工具类加两个方法
/*** word下载** param fileName 下载时的文件名称* param response* param doc*/private static void downLoadWord(String fileName, HttpServletResponse response, XWPFDocument doc) throws IOException {try {response.setCharacterEncoding(UTF-8);response.setHeader(content-Type, application/msword);response.setHeader(Content-Disposition, attachment;filename URLEncoder.encode(fileName .docx , UTF-8));doc.write(response.getOutputStream());} catch (Exception e) {throw new IOException(e.getMessage());}}/*** word模板导出* param map* param templatePath* param fileName* param response* throws Exception*/public static void WordTemplateExport(MapString, Object map,String templatePath,String fileName,HttpServletResponse response) throws Exception {XWPFDocument doc WordExportUtil.exportWord07(templatePath, map);downLoadWord(fileName,response,doc);}
3接口模板文件在项目根路径的template文件夹下图片自定义下载注意如果要设置图片必须把导入的jar的版本改为3.3.0否则会报错原因是新版本没有这个实体类 /*** 使用模板word导出数据* param param* param response*/PostMapping(/wordTemplate)public void makeWordTemplate(RequestBody MapString, Object param,HttpServletResponse response) {MapString, Object map new HashMap();map.put(name, 张三);map.put(nativePlace, 湖北武汉);map.put(age, 20);map.put(nation, 汉族);map.put(phone, 15685654524);map.put(experience, 湖北武汉工作三年java工程师);map.put(evaluate, 优秀善良老实);//设置图片,如果无图片不设置即可WordImageEntity image new WordImageEntity();image.setHeight(200);image.setWidth(150);image.setUrl(E:/excel/pic.jpg);image.setType(WordImageEntity.URL);map.put(picture, image);try {ExcelUtils.WordTemplateExport(map,E:/excel/个人简历模板.docx,param.get(fileName).toString(),response);} catch (Exception e) {e.printStackTrace();}}
4页面添加按钮和请求方法见源码。点击即可下载。上面案例导出时有图片如果不需要图片可不设置图片路径即可。
2.2使用word模板导出多页
单模板生成多页数据在合适的场景也是需要的比如一个订单详情信息模板,但是有很多订单,需要导入到一个word里面。
1在工具类添加方法 /*** word模板导出多页* param list* param templatePath* param fileName* param response* throws Exception*/public static void WordTemplateExportMorePage(ListMapString, Object list, String templatePath, String fileName, HttpServletResponse response) throws Exception {XWPFDocument doc new ParseWord07().parseWord(templatePath, list);downLoadWord(fileName, response, doc);}
2接口 /*** word模板导出多页* param param* param response*/PostMapping(/wordTemplateMorePage)public void makeWordTemplateMorePage(RequestBody MapString, Object param, HttpServletResponse response) {ListMapString, Object listnew ArrayList();for (int i 0; i 5; i) {MapString, Object person new HashMap();person.put(name, 张三i);person.put(nativePlace, 湖北武汉i);person.put(age, 20i);person.put(nation, 汉族);person.put(phone, 15685654524);person.put(experience, 湖北武汉工作三年java工程师);person.put(evaluate, 优秀善良老实);person.put(picture, );list.add(person);}try {ExcelUtils.WordTemplateExportMorePage(list, E:/excel/个人简历模板.docx, param.get(fileName).toString(), response);} catch (Exception e) {e.printStackTrace();}}
3页面添加按钮和请求方法见源码。点击即可下载。
3.excel导入时验证
有时候需要在导入时先验证数据的合法性再进行导出为了演示的完整性需要使用新的页面进行导入操作。步骤如下
3.1环境准备
1新建表student
CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL COMMENT 姓名,age int(11) DEFAULT NULL COMMENT 年龄,birth date DEFAULT NULL COMMENT 出生日期,PRIMARY KEY (id)
) ENGINEInnoDB AUTO_INCREMENT9 DEFAULT CHARSETutf8;
2在ExcelUtils工具类添加方法标红
package com.example.easypoidemoadmin.utils;import cn.afterturn.easypoi.cache.manager.POICacheManager;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.ExcelXorHtmlUtil;
import cn.afterturn.easypoi.excel.entity.ExcelToHtmlParams;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.word.WordExportUtil;
import cn.afterturn.easypoi.word.parse.ParseWord07;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
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(ListMapString, Object list, String fileName, HttpServletResponse response) throws IOException {defaultExport(list, fileName, response);}/*** 默认的 excel 导出** param list 数据列表* param fileName 导出时的excel名称* param response*/private static void defaultExport(ListMapString, 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 templatePath 模板路径* param map 数据集合* param fileName 文件名* param response* throws IOException*/public static void exportExcel(TemplateExportParams templatePath, MapString, Object map, String fileName, HttpServletResponse response) throws IOException {Workbook workbook ExcelExportUtil.exportExcel(templatePath, map);downLoadExcel(fileName, response, workbook);}/*** 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 .xlsx, UTF-8));workbook.write(response.getOutputStream());} catch (Exception e) {throw new IOException(e.getMessage());}}/*** word下载** param fileName 下载时的文件名称* param response* param doc*/private static void downLoadWord(String fileName, HttpServletResponse response, XWPFDocument doc) throws IOException {try {response.setCharacterEncoding(UTF-8);response.setHeader(content-Type, application/msword);response.setHeader(Content-Disposition, attachment;filename URLEncoder.encode(fileName .docx, UTF-8));doc.write(response.getOutputStream());} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel 导入** param file excel文件* param pojoClass pojo类型* param T* return*/public static T ListT importExcel(MultipartFile file, ClassT 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 ListT importExcel(String filePath, Integer titleRows, Integer headerRows, ClassT 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 上传的文件* param titleRows 表格内数据标题行* param headerRows 表头行* param pojoClass pojo类型* param T* return*/public static T ListT importExcel(MultipartFile file, Integer titleRows, Integer headerRows, ClassT pojoClass) throws IOException {if (file null) {return null;}try {return importExcel(file.getInputStream(), titleRows, headerRows, pojoClass);} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel 导入** param inputStream 文件输入流* param titleRows 表格内数据标题行* param headerRows 表头行* param pojoClass pojo类型* param T* return*/public static T ListT importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, ClassT pojoClass) throws IOException {if (inputStream null) {return null;}ImportParams params new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);params.setSaveUrl(/excel/);params.setNeedSave(true);try {return ExcelImportUtil.importExcel(inputStream, pojoClass, params);} catch (NoSuchElementException e) {throw new IOException(excel文件不能为空);} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel转html预览** param filePath 文件路径* param response* throws Exception*/public static void excelToHtml(String filePath, HttpServletResponse response) throws Exception {ExcelToHtmlParams params new ExcelToHtmlParams(WorkbookFactory.create(POICacheManager.getFile(filePath)), true);response.getOutputStream().write(ExcelXorHtmlUtil.excelToHtml(params).getBytes());}/*** word模板导出** param map* param templatePath* param fileName* param response* throws Exception*/public static void WordTemplateExport(MapString, Object map, String templatePath, String fileName, HttpServletResponse response) throws Exception {XWPFDocument doc WordExportUtil.exportWord07(templatePath, map);downLoadWord(fileName, response, doc);}/*** word模板导出多页** param list* param templatePath* param fileName* param response* throws Exception*/public static void WordTemplateExportMorePage(ListMapString, Object list, String templatePath, String fileName, HttpServletResponse response) throws Exception {XWPFDocument doc new ParseWord07().parseWord(templatePath, list);downLoadWord(fileName, response, doc);}/*** excel 导入有错误信息** param file 上传的文件* param pojoClass pojo类型* param T* return*/public static T ExcelImportResultT importExcelMore(MultipartFile file, ClassT pojoClass) throws IOException {if (file null) {return null;}try {return importExcelMore(file.getInputStream(), pojoClass);} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel 导入** param inputStream 文件输入流* param pojoClass pojo类型* param T* return*/private static T ExcelImportResultT importExcelMore(InputStream inputStream, ClassT pojoClass) throws IOException {if (inputStream null) {return null;}ImportParams params new ImportParams();params.setTitleRows(1);//表格内数据标题行params.setHeadRows(1);//表头行params.setSaveUrl(/excel/);params.setNeedSave(true);params.setNeedVerify(true);try {return ExcelImportUtil.importExcelMore(inputStream, pojoClass, params);} catch (NoSuchElementException e) {throw new IOException(excel文件不能为空);} catch (Exception e) {throw new IOException(e.getMessage());}}
}
3导入验证构造器的依赖 dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion5.4.0.Final/version/dependency
4创建easypoi的工具类
package com.example.easypoidemoadmin.utils;import cn.afterturn.easypoi.excel.annotation.Excel;
import org.apache.commons.lang3.StringUtils;import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;/*** easypoi工具类,* 使用new方式创建对象并使用** param T*/
public class EasyPoiToolT {/*** 需要被反射的对象使用泛型规范传入对象*/public T t;/*** 修改注解Excel的属性值* param attributeName* param columnName* param targetValue* throws Exception*/public void changeAttribute(String attributeName, String columnName, Object targetValue) throws Exception {if (t null) {throw new ClassNotFoundException(未找到目标类);}if (StringUtils.isEmpty(attributeName)) {throw new NullPointerException(传入的注解属性为空);}if (StringUtils.isEmpty(columnName)) {throw new NullPointerException(传入的属性列名为空);}//获取目标对象的属性值Field field t.getClass().getDeclaredField(columnName);//获取注解反射对象Excel excelAnion field.getAnnotation(Excel.class);//获取代理InvocationHandler invocationHandler Proxy.getInvocationHandler(excelAnion);Field excelField invocationHandler.getClass().getDeclaredField(memberValues);excelField.setAccessible(true);Map memberValues (Map) excelField.get(invocationHandler);memberValues.put(attributeName, targetValue);}
}
3.2实战演练
需求对导入的学生信息进行验证验证通过后才能导入。要求学生姓名不能为空出生日期必须是yyyy-MM-dd格式年龄必须合法。导入后把验证未通过的信息通过excel方式再下载到本地。
1新建学生对象添加注解验证并实现IExcelModel接口
package com.example.easypoidemoadmin.entity;import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.handler.inter.IExcelModel;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.Date;Data
TableName(value student)
public class Student implements IExcelModel {/*** id*/TableId(value id, type IdType.AUTO)private Integer id;/*** 姓名*/TableField(value name)Excel(name 姓名, width 20)NotNull(message 姓名不能为空)private String name;/*** 年龄*/TableField(value age)private Integer age;/*** 年龄验证*/TableField(exist false)Excel(name 年龄)NotNull(message 年龄不能为空)Pattern(regexp ^(?:[1-9][0-9]?|1[01][0-9]|120)$, message 年龄必须是整数且在1-120之间)private String ageStr;/*** 出生日期*/TableField(value birth)JsonFormat(timezone GMT8, pattern yyyy-MM-dd)private Date birth;/*** 出生日期验证*/TableField(exist false)Excel(name 出生日期, isImportField true, importFormat yyyy-MM-dd, databaseFormat yyyy-MM-dd, width 30)NotNull(message 出生日期不能为空)Pattern(regexp ^\\d{4}-\\d{1,2}-\\d{1,2}$, message 日期格式必须是yyyy-MM-dd格式如2020-01-01)private String birthStr;//错误信息TableField(exist false)Excel(name 错误信息, width 50, isColumnHidden true)private String errorMsg;}
实现此接口的原因是获取其验证的错误信息并将其映射到字段errorMsg上当对象不包含此字段时就看不到错误信息。
2新建接口StudentController
package com.example.easypoidemoadmin.controller;import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.easypoidemoadmin.entity.CommonResult;
import com.example.easypoidemoadmin.entity.Student;
import com.example.easypoidemoadmin.service.StudentService;
import com.example.easypoidemoadmin.utils.EasyPoiTool;
import com.example.easypoidemoadmin.utils.ExcelUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;RestController
RequestMapping(/api/student)
public class StudentController {Autowiredprivate StudentService studentService;/*** 查询用户信息列表** param name* param page* param limit* return*/GetMapping(/list)public CommonResult getList(String name, Integer page, Integer limit) {IPageStudent iPage studentService.getList(name, page, limit);return new CommonResult(200, 查询信息成功, iPage.getRecords(), iPage.getTotal());}/*** 导入学生信息** param file* param response* return*/PostMapping(/upload)public CommonResult upload(RequestParam(file) MultipartFile file, HttpServletResponse response) {try {ExcelImportResultStudent importResult ExcelUtils.importExcelMore(file, Student.class);//验证通过的数据ListStudent list importResult.getList();//验证未通过的数据ListStudent failList importResult.getFailList();studentService.insertBatch(list);if (failList ! null failList.size() 0) {//修改导出的日期格式EasyPoiToolStudent easyPoiUtil new EasyPoiTool();easyPoiUtil.t failList.get(0);//展示错误的列easyPoiUtil.changeAttribute(isColumnHidden, errorMsg, false);//设置导出的格式easyPoiUtil.changeAttribute(exportFormat, birthStr, );//导出excelString title 导入异常的数据;ExcelUtils.exportExcel(failList, title, title, Student.class, title, response);return null;}return new CommonResult(200, 信息导入成功);} catch (Exception e) {e.printStackTrace();return new CommonResult(444, 信息导入失败);}}PostMapping(/exportTemplate)public void exportTemplate(RequestBody MapString, Object map, HttpServletResponse response) throws IOException {ListStudent list new ArrayList();ExcelUtils.exportExcel(list, (String) map.get(title), (String) map.get(sheetName), Student.class, (String) map.get(fileName), response);}
}
对于后面的service和dao详见源码。
3导入的页面见源码这里主要说明导入的方法在导入后需要根据返回的数据判断是否有错误的信息如果有则下载错误信息若没有则显示成功。 importExcel(param) {const file param.fileif (file.name.lastIndexOf(.) 0) {this.$message.error(上传文件只能是xls、xlsx格式!)return}const testMsg file.name.substring(file.name.lastIndexOf(.) 1).toLowerCase()const extensionXLS testMsg xlsconst extensionXLSX testMsg xlsxif (!extensionXLS !extensionXLSX) {this.$message.error(上传文件只能是xls、xlsx格式!)return}const isLt2M file.size / 1024 / 1024 2if (!isLt2M) {this.$message.error(上传文件不能超过 2MB!)return}this.importLoading trueconst formData new FormData()formData.append(file, param.file)student.upload(formData).then(res {if (!res.code) {this.$message.error(部分数据导入失败数据已下载到本地请查看)fileDownload(res, 导入异常的数据.xlsx)this.fileList []this.getList()} else if (res.code 200) {this.$message.success(导入成功)this.fileList []this.getList()} else {this.$message.error(导入失败)}}).catch(err {console.log(err)this.$message.error(导入失败)}).finally((){this.importLoading false})},也就是说对于这个上传的请求当返回的内容是json字符串时就是成功的没有错误的数据若不是则返回的是arraybuff类型的数据需要直接下载。
3.3注意事项
1由于需要进行验证因此在工具类中必须要设置ImportParams的needVerify为true
2easypoi是使用springboot对应的版本对于spring的版本验证在这里可能不生效
3对于验证构造器hibernate的版本springboot2对应的版本必须是5及以上否则错误信息不会显示
4对应上传的方法响应类型必须是arraybuff否则下载的excel无法打开
5要显示错误的信息必须设置errorMsg上Excel注解的isColumnHidden为false
6在Excel中没有设置导出exportFormat的日期格式而是在需要导出的时候再通过反射的方式调用EasyPoiUtil的方法设置。若提前设置了在导入时输入的格式不正确在导出错误信息时则会抛出异常。
7其自带的正则验证要求字段的类型必须是字符串类型其他类型会发生异常。因此需要设置两个字段一个映射数据库的字段一个用于导出和导出。当然也可以使用两个类进行分布对应。
8当需要获取错误的行号时让实体类继承IExcelDataModel类并添加int类型的rowNum属性即可。
就是这么简单你学废了吗感觉有用的话给笔者点个赞吧 !