项目场景:
动态导出数据列表。导出数据形式为 excel 文件形式。
问题描述
提示:这里描述项目中遇到的问题:
根据筛选条件动态导出数据列表。导出数据形式为 excel 文件形式
使用 this.$axios.get(url, { responseType: “blob” })
get请求方式。
<el-button ref="btnStatusDown" type="success" size="mini" icon="el-icon-download" @click="exportAllList">导出</el-button>
//导出
@GetMapping("/all/export")
public void exportAllList(@RequestParam Map<String, Object> param, HttpServletResponse response){
SysUserEntity user = getUser();
if(user.getUserId() != Constant.SUPER_ADMIN){
if(user.getSuperUser()!=1){
param.put("createBy",user.getUserId());
}else{
param.put("companyId",user.getCompanyId());
}
}
if(!(param.get("repairDate").equals("undefined") || param.get("repairDate").equals("null"))) {
String[] repairDate = param.get("repairDate").toString().split(",");
param.put("repairDate",repairDate);
}else{
String[] repairDate = null;
param.put("repairDate",repairDate);
}
if(!(param.get("createDate").equals("undefined") || param.get("createDate").equals("null"))) {
String[] createDate = param.get("createDate").toString().split(",");
param.put("createDate",createDate);
}else{
String[] createDate = null;
param.put("createDate",createDate);
}
List<RepairEntity> list= new ArrayList<>();
list= repairService.queryList(param);
RepairExportEntity[] listEntity = new RepairExportEntity [list.size()];
int i=0;
for(RepairEntity entity:list){
listEntity[i] = new RepairExportEntity();
listEntity[i].setNum(entity.getNum());
listEntity[i].setDeviceSn(entity.getDeviceSn());
listEntity[i].setDeviceName(entity.getDeviceName());
listEntity[i].setCompanyName(entity.getCompanyName());
listEntity[i].setDeviceStatus(DeviceConstant.STATUS.get(entity.getStatus()));
//类型1
// listEntity[i].setServiceTypeName(RepairConstant.SERVICE_TYPE.get(entity.getServiceType()));
//类型2
listEntity[i].setFaultTypeName(RepairConstant.FAULT_TYPE.get(entity.getFaultType()));
//等级1
listEntity[i].setFaultRankName(RepairConstant.FAULT_RANK.get(entity.getFaultRank()));
listEntity[i].setStatusName(RepairConstant.STATUS.get(entity.getStatus()));
listEntity[i].setTypeName(RepairConstant.REPAIR_TYPE.get(entity.getType()));
listEntity[i].setRepairDate(entity.getRepairDate());
listEntity[i].setRepairAmount(entity.getRepairAmount());
.......
if(entity.getUserId() != null && entity.getUserId() > 0){
user = sysUserService.getById(entity.getUserId());
if(user != null ){
listEntity[i].setUserName(user.getName());
}
}
if(entity.getCreateBy() != null && entity.getCreateBy() > 0){
user = sysUserService.getById(entity.getCreateBy());
if(user != null ){
listEntity[i].setCreateByName(user.getName());
}
}
Long repair_id = Long.valueOf(entity.getId());
List<RepairSparePartEntity> list1 = repairSparePartService.list(new QueryWrapper<RepairSparePartEntity>().eq("repair_id", repair_id).orderByDesc("id"));
if (list1.size() > 0) {
List<String> name=new ArrayList();
List<String> unit=new ArrayList();
List<String> count=new ArrayList();
List<String> price=new ArrayList();
List<String> cost=new ArrayList();
List<String> amount=new ArrayList();
for(RepairSparePartEntity sparePart:list1){
name.add(sparePart.getName());
String name1 = StringUtils.join(name,",");
unit.add(sparePart.getUnit());
String unit1 = StringUtils.join(unit,",");
count.add(sparePart.getCount().toString());
String count1 = StringUtils.join(count,",");
DecimalFormat df=new DecimalFormat("0.00"); //设置格式 保留小数点后两位
String str=df.format(sparePart.getPrice());
price.add(str);
String price1 = StringUtils.join(price,",");
cost.add(sparePart.getCount().toString());
String cost1 = StringUtils.join(cost,",");
DecimalFormat df1=new DecimalFormat("0.00"); //设置格式 保留小数点后两位
String str1=df1.format(sparePart.getAmount());
amount.add(str1);
String amount1 = StringUtils.join(amount,",");
listEntity[i].setName(name1); // 名称
listEntity[i].setUnit(unit1); // 单位
listEntity[i].setCount(count1); // 数量
listEntity[i].setPrice(price1); // 单价
listEntity[i].setCost(cost1); // 费用
listEntity[i].setAmount(amount1); // 总价格
}
}
i++;
}
List list1 = Arrays.asList(listEntity);
ExcelWriter writer = ExcelUtil.getBigWriter();
//4.写入标题 表头设置 自定义标题名称
writer.addHeaderAlias("num", "单号");
writer.addHeaderAlias("deviceSn", "编号");
writer.addHeaderAlias("deviceName", "名称");
writer.addHeaderAlias("companyName", "名称1");
writer.addHeaderAlias("deptName", "名称2");
writer.addHeaderAlias("deviceStatus", "状态");
writer.addHeaderAlias("typeName", "类型");
writer.addHeaderAlias("userName", "名称");
writer.addHeaderAlias("repairDate", "日期");
writer.addHeaderAlias("managerName", "名称");
writer.addHeaderAlias("handleName", "aa");
writer.addHeaderAlias("serviceTypeName", "类型");
writer.addHeaderAlias("faultTypeName", "类型");
............
ServletOutputStream out = null;
try {
//写入数据
// writer.write(list.subList(0,list.size()), true);
writer.write(list1.subList(0,list1.size()), true);
response.setHeader("Content-type","application/octet-stream"); //将文件设置为流的形式进行传递,返回的是二进制形式
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+new String("维修工单信息表".getBytes("UTF-8"),"ISO-8859-1")+".xls");
out = response.getOutputStream();
writer.flush(out, true);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
}
exportAllList() {
var url = "/repair/all/export?";
if (this.dataForm) {
url +=
"companyId=" +
this.dataForm.companyId +
"&createDate=" +
this.dataForm.createDate +
"&serviceType=" +
this.dataForm.serviceType;
}
this.$axios
.get(url, { responseType: "blob" })
.then((response) => {
this.download(response);
})
.catch((error) => {
console.log(error);
});
},
xml查询:
<select id="queryList" resultType="..........">
SELECT * FROM ...............
<if test="num!=null and num!='' ">
and sc.num like '%${num}%'
</if>
<if test="deviceName!=null and deviceName!='' ">
and sc.device_name like '%${deviceName}%'
</if>
</select>
注意,查询语句中 变量前面没有 p. 哦, 在此加上会出现错误。
##总结:
此种方法感觉代码量有点冗杂,寻找其它简洁的方法实现此功能。