有时候我们需要处理数据源数据,将其转成excel进行导出,那该如何做呢?
首先我们需要引入工具类,这里使用autopoi,也可以使用其他工具类,贴一下autopoi教程,有兴趣深入的可以去看看,但是一般咱们的操作比较简单,看下面就可以了。
<!-- AutoPoi Excel工具类-->
<dependency>
<groupId>org.jeecgframework</groupId>
<artifactId>autopoi-web</artifactId>
<version>1.0.3</version>
<exclusions>
<exclusion>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jeecgframework</groupId>
<artifactId>autopoi</artifactId>
<version>1.2.2</version>
<scope>compile</scope>
</dependency>
如果引用失败,查看jar包引用失败
要导出数据,需要分两步走:
1、我们首先得从数据源拿到数据,笔者这里从sql数据库拿数据(反正把数据导入到内存即可)。
2、将数据转化为excel
/**
* 导出活动参与者列表
* @param exportDTO 导出数据的查询条件,可有可无
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(ExportDTO exportDTO, HttpServletRequest req) {
// Step.1 组装查询条件
QueryWrapper<BaseParticipate> query = new QueryWrapper<>();
query.eq("activity_id",exportDTO.getActivityId());
if(exportDTO.getPatiStatus()!=null){
query.eq("pati_status",exportDTO.getPatiStatus());
}
if(exportDTO.getIsClassmate()!=null){
query.eq("is_classmate",exportDTO.getIsClassmate());
}
//从数据库取得数据,这之前的代码请以自身业务代码为准
List<BaseParticipate> list = iBaseParticipateService.list(query);
//Step.2 AutoPoi 导出Excel
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
//设定导出excel文件名
mv.addObject(NormalExcelConstants.FILE_NAME, "活动参与列表");
//设置数据格式,注意我们将在该类做数据转换的处理,比如是否要导出这个键的数据,对值进行映射、运算等等操作
//这个我们在下面教大家如何设置
**mv.addObject(NormalExcelConstants.CLASS, BaseParticipate.class);**
//设置excel文件的参数,标题、副标题、sheet名
mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("活动参与列表", "导出人:A" , "导出信息"));
//传入上面咱得到的数据
mv.addObject(NormalExcelConstants.DATA_LIST, list);
return mv;
}
当然,除了代码里显示的这些参数设置,还有其他的参数设置,具体可以参考上面贴出的文档。
做数据行——>>excle行的转化
//对指定格式class的属性的设置
//excel列名
@Excel(name = "审核状态",orderNum = "1",width = 20,needMerge = true)
private Integer patiStatus;
//自定义转化——convertget属性名
public String convertgetPatiStatus(){
switch (this.patiStatus){
case 0:return "未审核";
case 1:return "审核通过";
case 2:return "审核不通过";
default:return "未知";
}
}
最后附上前端调用js
let fileName="活动参与列表";
let obj=Object.assign({activityId:this.activityId},this.queryParam);
exportXls(obj).then((data)=>{
if (!data) {
this.$message.warning("文件下载失败")
return
}
if (typeof window.navigator.msSaveBlob !== 'undefined') {
console.log("typeof window.navigator.msSaveBlob !== undefined")
window.navigator.msSaveBlob(new Blob([data]), fileName+'.xls')
}else{
console.log("typeof window.navigator.msSaveBlob === undefined")
console.log("data",data)
let url = window.URL.createObjectURL(new Blob([data]))
let link = document.createElement('a')
link.style.display = 'none'
link.href = url
link.setAttribute('download', fileName+'.xls')
document.body.appendChild(link)
link.click();
document.body.removeChild(link); //下载完成移除元素
window.URL.revokeObjectURL(url); //释放掉blob对象
}
})
最重要的axios代码,设置responseType,防止乱码
//参与活动列表
export function exportXls(parameter) {
return axios({
url: '你的url',
params: parameter,
method: 'get',
//这个属性最重要,设置返回的格式,防止乱码
responseType: 'blob'
})
}