准备工作
1.pom文件中导入依赖,一个是easyExcel必备,一个是JSON数据转化用到的数据包。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
2.编写controller,供ajax调用。
说一下思路:
1.首先我这个不需要前端传参数,所以就只定义了一个HttpServletResponse(服务器的响应),作用就是把我后台处理后的数据以流的形式返回给客户端,进行处理和下载。
@SneakyThrows
@PostMapping(value = "/export")
public void pageListExport(HttpServletResponse response){
try {
List<Yolo> list = yoloService.list();
List<YoloExcel> voList = list.stream().map(YoloExcel::new).collect(Collectors.toList());
// 写入Excel
EasyExcel.write(response.getOutputStream(), YoloExcel.class).sheet("sheet").doWrite(voList);
}catch (Exception e) {
e.printStackTrace();
}
}
2.至于显示哪些内容:Excel呈现哪些东西,通过定义一个实体类"映射"来实现。也就是YoloExcel这个类。
package com.zsp.quartz.entity.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zsp.quartz.entity.User;
import com.zsp.quartz.entity.Yolo;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* (Yolo)表实体类
*
* @author makejava
* @since 2022-12-29 14:36:50
*/
@Data
public class YoloExcel extends Model<User> implements Serializable {
private static final long serialVersionUID = 1L;
public YoloExcel(Yolo yolo){
BeanUtils.copyProperties(yolo, this);
}
@ExcelIgnore
private Long id;
/**
* 图片地址
*/
@ExcelProperty(value = "图片路径",index = 1)
private String imageurl;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间",index = 2)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createtime;
/**
* 缺陷类别1扭曲2腐蚀3断丝
*/
@ExcelProperty(value = "创建种类",index = 3)
private Integer status;
/**
* 所属矿井 1,2,3
*/
@ExcelProperty(value = "所属矿井",index = 4)
private Integer source;
}
@ExcelIgnore 代表转换时不携带有这个注解标注的属性
@ExcelProperty(value = "图片路径",index = 1) 代表转换时携带有这个注解标注的属性。其中value代表生成后的列名,index代表权重(也就是从左往右的顺序),我这上面的意思是除了id其他属性按照权重顺序都进行显示,中间用到了工具类转换。BeanUtils.copyProperties()。 3.顺便贴一下Yolo类
package com.zsp.quartz.entity;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
/**
* (Yolo)表实体类
*
* @author makejava
* @since 2022-12-29 14:36:50
*/
@Data
public class Yolo extends Model<User> implements Serializable {
private Long id;
/**
* 图片地址
*/
private String imageurl;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createtime;
/**
* 缺陷类别1扭曲2腐蚀3断丝
*/
private Integer status;
/**
* 所属矿井 1,2,3
*/
private Integer source;
}
以上就是后端处理逻辑。
前端展示直接贴代码了。
html代码:
<button onclick="download()">下载Excel</button>
JavaScript代码,2处需要修改的地方。
<script>
function download() {
var url = '你需要修改的地方';
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.responseType = "blob";
xhr.onload = function () {
// 请求完成
if (this.status === 200) {
// 返回200
var blob = this.response;
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function (e) {
var a = document.createElement('a');
a.download = '你的Excel名字.xlsx';
a.href = e.target.result;
$("body").append(a);
a.click();
$(a).remove();
}
}
};
// 发送ajax请求
xhr.send()
}
</script>
最终结果:
如果是按照前端传来的条件查询的话,也很容易,就是把我查所有那个替换为入参的条件,然后查询---映射---写入流。道理是一样的
溜了~ 觉得有用点个赞叭