1.前端代码部分:
导出按钮代码:
<el-button size="small" type="primary" @click="exportBtn" :loading="loading"> 导出 </el-button>
导出按钮对应的js:
exportBtn() {
if (this.reportList.length == 0) {
this.$message.warning("该条件没有数据,无法导出!");
return false;
}
if (JSON.stringify(this.query) === "{}") {
if (this.selectedData && this.selectedData.length > 0) {
this.paramsVal.ids = this.selectedData.map((o) => {
return o.id;
});
this.getExport(this.paramsVal, true);
} else {
this.$confirm("是否导出全部?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.getExport(this.paramsVal, true);
});
}
} else {
let params = this.query;
var beginTime, endTime;
if (params.awardStartTime && params.awardStartTime.length > 0) {
beginTime = params.awardStartTime[0];
endTime = params.awardStartTime[1];
}
this.paramsVal = {
reportNum: params.reportNum,
moneyName: params.moneyName,
beginTime: beginTime,
endTime: endTime,
handleProgress: params.handleProgress,
resultDeptCode: params.resultDeptCode,
};
if (this.selectedData && this.selectedData.length > 0) {
let ids = this.selectedData.map((o) => {
return o.id;
});
this.paramsVal.ids = ids;
this.getExport(this.paramsVal, true);
} else {
this.$confirm("是否导出全部?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.getExport(this.paramsVal, true);
});
}
}
},
导出按钮中起到导出EXCEL表格的getExport对应方法:
getExport(params, boolean) {
this.loading = boolean;
let that = this;
awardStatementExport(params).then((res) => {
let reader = new FileReader();
reader.readAsText(res.data);
reader.onload = function (result) {
try {
let resData = JSON.parse(result.target.result);
if (
resData.code == "400" &&
resData.msg == "数据量过大!!!!"
) {
that.$message({
type: "error",
message: "导出失败,单次最大导出量为1000条",
});
that.loading = false;
}
} catch (err) {
that.$refs.crud.$refs.table.clearSelection();
that.paramsVal.ids = null;
that.loading = false;
let resHeaders = res.headers["content-disposition"];
if (resHeaders == null || resHeaders === "") {
that.$message.error("导出失败");
return;
}
let fileName = decodeURI(
res.headers["content-disposition"].split("=")[1]
);
let blob = new Blob([res.data], {
type: "application/vnd.ms-excel",
});
let objectUrl = URL.createObjectURL(blob); // 创建URL
const link = document.createElement("a");
link.href = objectUrl;
link.setAttribute("download", fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
};
});
},
getExport方法中awardStatementExport 方法的东西:
export const awardStatementExport = (data) => {
return request({
url: webSite + "/xxx/xxxx/awardStatementExport",
method: "post",
responseType: "blob",
data,
});
};
2.后端代码部分
Controller控制层:
public R xxxxxxExport(HttpServletResponse response, @RequestBody Map<String, Object> params) {
Dto dto = Dtos.newDto();
dto.putAll(params);
log.info("xxxxxxExport--入参:{}",dto);
//查找要导出的奖励报表条数
int total = xxxxxxService.getXxxxTotal(dto);
if(total<1000){
//要导出的奖励报表数据
List<LinkedHashMap<String,Object>> xxxxList = xxxxService.showxxxxList(dto);
log.info("xxxxHandleList:{}",xxxxList);
//表头
List<String> titleList = Arrays.asList("xx编号" ,"xx件号","xx部门", "xx", "xxx", "xxxx)", "xxxxx", "xxxxxx", "xxxxxxx", "xxxxxxxx");
ExcelExportUtils.createExcel(xxxxList,titleList,response,"xxxxx报表");
}
return R.fail("数据量过大!!!!");
}
ExcelExportUtils导出数据辅助类:
import jxl.Workbook;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.write.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: xushu
* @Date: 2023-06-12 10:44
* @Description:
*/
public class ExcelExportUtils {
/**
* excel 导出文件流方法
* @param excelDataList
* @param titleList
* @return
*/
public static void createExcel(List<LinkedHashMap<String, Object>> excelDataList, List<String> titleList, HttpServletResponse response, String tableName) {
try {
// 1、创建一个流文件
ByteArrayOutputStream excel = new ByteArrayOutputStream();
//创建一个excel
WritableWorkbook workbook = Workbook.createWorkbook(excel);
// 2、创建一个Excel的工作表sheet
WritableSheet sheet = workbook.createSheet("指标群异常数据", 0);
// 3、样式设置
WritableFont bold = new WritableFont(WritableFont.createFont("微软雅黑"), 12, WritableFont.BOLD);
WritableFont noBold = new WritableFont(WritableFont.createFont("微软雅黑"), 12, WritableFont.NO_BOLD);
WritableCellFormat titleFormate = new WritableCellFormat(bold);
// 设置单元格中的内容水平方向居中、垂直方向居中设置边框
titleFormate.setAlignment(jxl.format.Alignment.CENTRE);
titleFormate.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
titleFormate.setBorder(Border.ALL, BorderLineStyle.THIN);
// 设置正文内容样式,单元格样式控制对象
WritableCellFormat textFormat = new WritableCellFormat(noBold);
// 单元格中的内容水平方向居中、垂直方向居中、设置边框
textFormat.setAlignment(jxl.format.Alignment.CENTRE);
textFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
textFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
// 3.4、窗口冻结第一行
sheet.getSettings().setVerticalFreeze(1);
//sheet.getSettings().setHorizontalFreeze(2);//冻结 2列两行
// 3.5、设置行高--第一行标题行
sheet.setRowView(0, 500);
// 3.6、设置列宽
sheet.setColumnView(0, 15);
sheet.setColumnView(1, 25);
sheet.setColumnView(2, 30);
sheet.setColumnView(3, 15);
sheet.setColumnView(4, 15);
sheet.setColumnView(5, 20);
// 4、构造表头
// setSheetHeader(sheet, titleFormate);
for (int i = 0; i < titleList.size(); i++) {
Label label_00 = new Label(i,0, titleList.get(i), titleFormate);
sheet.addCell(label_00);
}
// 5、填充数据
//setSheetData(sheet, textFormat, 1, excelDataList);
//数据填充行号
int startRow = 1;
for (int i = 0; i < excelDataList.size(); i++, startRow++) {
Map excelData = excelDataList.get(i);
/*Label label_02 = new Label(0, startRow, (String) excelData.get("INDEX_CODE"), textFormat);
sheet.addCell(label_02);
Label label_12 = new Label(1, startRow, (String) excelData.get("INDEX_NAME"), textFormat);
sheet.addCell(label_12);
Label label_22 = new Label(2, startRow, (String) excelData.get("IND_CONDITION"), textFormat);
sheet.addCell(label_22);
Label label_32 = new Label(3, startRow, (String) excelData.get("STATISTICAL_FREQUENCY"), textFormat);
sheet.addCell(label_32);
Label label_42 = new Label(4, startRow, (String) excelData.get("exceptionDate"), textFormat);
sheet.addCell(label_42);
Label label_52 = new Label(5, startRow, (String) excelData.get("msg"), textFormat);
sheet.addCell(label_52);*/
int z = 0;
for(Object k : excelData.keySet()){
System.out.println("第"+z+"个"+String.valueOf(k)+":"+excelData.get(String.valueOf(k)));
Label label = new Label(
z,
startRow,
String.valueOf(excelData.get(String.valueOf(k)))=="null"?"":String.valueOf(excelData.get(String.valueOf(k))),
textFormat);
sheet.addCell(label);
z++;
}
}
workbook.write();
workbook.close();
byte[] content = excel.toByteArray();
InputStream is = new ByteArrayInputStream(content);
// 设置response参数,可以打开下载页面
response.reset();
String filename = tableName + ".xls";
response.setContentType("application/ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(java.net.URLEncoder.encode(filename, "UTF-8"))));
ServletOutputStream out = response.getOutputStream();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(out);
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (final IOException e) {
throw e;
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("创建EXCEL失败");
}
}
}
Controller层 、service层都是对mapper层的直接调用 ,mapper层 对应 的mapper.xml
<select id="xxxxxList" parameterType="java.util.Map" resultType="java.util.LinkedHashMap">
select id, name , money, age, birth from xu_test
</select>