vue 文件流导出获取后端文件名称

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出在Vue中实现导出Excel文件后端操作是通过发送请求获取文件,并将文件转换为可下载的链接。具体实现步骤如下: 1. 在后端定义一个接口,用于导出Excel文件。在该接口中,设置响应类型为`application/vnd.ms-excel`,确保返回的是Excel文件格式。同时,将文件作为响应返回给前端。 2. 在前端Vue组件中,定义一个导出Excel的方法,例如`exportExcelFn()`。在该方法中,调用后端接口获取文件,并将文件转换为可下载的链接。 3. 在前端Vue组件中,使用`<el-button>`标签绑定导出Excel的方法,例如`<el-button @click="exportExcelFn">导出Excel表格</el-button>`。 4. 在导出Excel的方法中,使用`URL.createObjectURL()`方法将文件转换为可下载的链接,并设置下载文件名。 5. 创建一个`<a>`标签,将可下载的链接赋值给`href`属性,并设置`download`属性为要下载文件名。 6. 将`<a>`标签添加到页面的`<body>`元素中,并模拟点击该链接,实现文件下载。 综上所述,Vue导出Excel文件后端操作可以通过以上步骤实现。 #### 引用[.reference_title] - *1* [前端导出excel文件 vue导出文件后端导出excel文件](https://blog.csdn.net/robotkirin/article/details/122243655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Vue实现excel文件导出功能(后端直接返回文件)](https://blog.csdn.net/qq_41954585/article/details/124961373)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值