使用SpringMVC+Layui操作excel的导入导出
导入导出所需的maven依赖
<!-- EasyPOI核心依赖 基于Apache POI 所以需要下面那两个Apache POI依赖 -->
<!-- 作用:Excel 导入导出和数据校验-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.1.0</version> <!-- 请替换为实际使用的最新版本号 -->
</dependency>
<!-- 如果EasyPOI没有自带Apache POI依赖,或者您需要特定版本的Apache POI,可以添加以下依赖 -->
<!-- Apache POI依赖 -->
<!-- 作用:读写excel文件,操作excel表格-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!--通常与 Apache POI 一起使用来处理 Excel 文件中的 XML 结构-->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.1.1</version>
</dependency>
<!--输出输入流 操作excel时需要用到-->
<!--作用:处理 Excel 文件的读写操作,如复制文件、读取文件内容到内存中、将内存中的数据写入文件等-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version> <!-- 使用最新的稳定版本 -->
</dependency>
一,导出excel表格
1.1,controller控制层
把获取的数据解析为User类实例,之后进行数据校验,校验不通过返回给前端,校验通过则把User实例添加到List集合中 之后操作数据库进行插入操作
@PostMapping(value = "/uuApplyUserInfo")
public ApiResult importMonitor( MultipartFile file) throws Exception {
// 判断文件不能为空
if (file == null) {
return new ApiResult(400,"文件不能为空",null);
}
// 导入excel文件的参数配置类
ImportParams params = new ImportParams();
params.setNeedVerify(true);//是否开启校验
params.setHeadRows(1); //头行忽略的行数
final ExcelImportService excelImportService = new ExcelImportService();
// excelImportResult包含了导入操作的结果 将获取的数据解析为User类实例 params为导入excel文件的参数配置
// 执行Excel文件的导入操作
ExcelImportResult excelImportResult = excelImportService.importExcelByIs(file.getInputStream(), User.class, params, false);
//校验成功数据
List<User> list = excelImportResult.getList();
// 通过暴力反射获取校验失败的数据
final Field failCollection = ExcelImportService.class.getDeclaredField("failCollection");
failCollection.setAccessible(true);
//校验失败数据
List<User> failList = (List) failCollection.get(excelImportService);
if (list.size() == 0 && failList.size() == 0) {
return new ApiResult(500,"导入失败,上传文件数据不能为空",null);
}
if (failList.size() > 0){
return new ApiResult(500,"导入失败,上传文件数据与模板不一致",null);
}
//如果没有错误,可以存入数据库
if (list.size() >= 0 && CollectionUtils.isEmpty(list)== false) {
//批量插入sql语句
userManageService.insertList(list);
}else{
return new ApiResult(500,"导入失败,上传文件数据不能为空",null);
}
return new ApiResult(200,"导入成功",null);
}
1.2,实体类
使用@Excel注解让实体类的字段跟excel的字段名保持一致进行映射
@Excel(name = “用户名”)
package com.lwt.maven.entity;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
@Excel(name = "用户名")
private String uname;
@Excel(name = "卡号")
@NotEmpty(message = "卡号不能为空")
private String card_number;
@Excel(name = "手机号码")
@Length(max = 11,message = "手机号不能超过11位")
private String phone;
@Excel(name = "余额")
@Max(value = 99999999,message = "金额不能超过999999999")
private BigDecimal balance;
private String acutorimg;
private String regitstime;
private Integer page;
private Integer limit;
private String endTime;
private String startTime;
}
1.3,前端页面
使用Layui的组件进行文件上传
<button type="button" class="layui-btn" id="test1">
<i class="layui-icon"></i>上传EXCEL
</button>
//执行实例
var uploadInst = upload.render({
elem: '#test1',//绑定元素
accept: 'file',
url: 'http://localhost:8080/bank_maven_war_exploded/usermanage/uuApplyUserInfo', //上传接口
// 选择文件后回调
choose: function (obj) {
console.log(obj);
}
, done: function (res) {
//上传完毕回调
layer.msg(res.message)
}
, error: function (res) {
//请求异常回调
layer.msg(res.message)
}
});
1.4,sql语句
将excel表格的数据获取到list之后循环打印获取值(separator:每次循环结束后拼接上去)
<insert id="insertList">
insert into user(`uname`,`card_number`,`phone`,`balance`) values
<foreach collection="list" item="user" separator=",">
(#{user.uname},#{user.card_number},#{user.phone},#{user.balance})
</foreach>
</insert>
二,Excel文件导出
1.1,controller控制层
创建了一个工作簿并生成了一个excel表格(Users),然后添加表头和表数据并设置列宽,之后把工作簿通过输出流输出给response.getOutputStream()(前端),需注意的是要设置响应头的响应类型为excel文件和响应的模式为下载excel表格
@GetMapping("/exportList")
public void exportList(HttpServletResponse response,User u) throws IOException {
response.setCharacterEncoding("UTF-8");
// 设置响应的类型为excel文件
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 设置浏览器的响应模式:为文件下载
response.setHeader("Content-Disposition", "attachment; filename=users.xlsx");
// 创建一个新的工作簿
Workbook workbook = new XSSFWorkbook();
// 创建一个新的工作表(Users)
Sheet sheet = workbook.createSheet("Users");
// 创建表头行 (在工作表sheet中添加第一行)
Row headerRow = sheet.createRow(0);
// 表头行数据
String[] columns = {"编号","用户名", "手机号码", "卡号","余额","头像地址","注册时间"};
for (int i = 0; i < columns.length; i++) {
// 在第一行中创建单元格并赋值数据
Cell cell = headerRow.createCell(i);
// 在单元格赋值
cell.setCellValue(columns[i]);
}
// 获取数据库用户表数据
List<User> users = userManageService.queryList(u);
// 填充数据行
int rowNum = 1;
for (User user : users) {
// 有一个对象就创建一行并添加数据
Row row = sheet.createRow(rowNum++);
// 在此行的第一个单元格中添加数据 以此类推...
row.createCell(0).setCellValue(user.getId());
row.createCell(1).setCellValue(user.getUname());
row.createCell(2).setCellValue(user.getPhone());
row.createCell(3).setCellValue(user.getCard_number());
row.createCell(4).setCellValue((String.valueOf(user.getBalance())));
row.createCell(5).setCellValue(user.getAcutorimg());
row.createCell(6).setCellValue(user.getRegitstime());
}
// 设置列宽
for (int i = 0; i < columns.length; i++) {
sheet.autoSizeColumn(i);
}
// 将excel表格流(输入流)写入到响应体中
workbook.write(response.getOutputStream());
// 关闭工作簿
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
1.2,sql语句
根据查询的结果而导入excel文件
<select id="queryAll" resultType="com.lwt.maven.entity.User">
select * from user where 1=1
<include refid="query"></include>
</select>
<sql id="query">
<if test="uname != null and uname != ''">
AND uname like CONCAT('%', #{uname}, '%')
</if>
<if test="card_number != null and card_number != ''">
AND card_number like CONCAT('%', #{card_number}, '%')
</if>
<if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
AND regitstime BETWEEN #{startTime} AND #{endTime}
</if>
<if test="phone != null and phone != ''">
AND phone like CONCAT('%', #{phone}, '%')
</if>
</sql>
1.3,前端页面
<button type="button" class="layui-btn" id="exprotList">导出excel</button>
$("#exprotList").on("click",function(){
window.location.href="http://localhost:8080/bank_maven_war_exploded/usermanage/exportList?uname="+$("#input_name_one").val()+"&startTime="+startTime+"&endTime="+endTime+"&phone="+$("#input_name_two").val()+"&card_number="+$("#input_name_three").val()
})