zoukankan      html  css  js  c++  java
  • SpringBoot+vue.js如何通过post方式实现导出excel

    以前我们常用get方式导出excel,比较简单,但是对于请求参数有长度限制,要么控制参数长度,要么通过缓存的方式获取参数,还是有点麻烦。

    今天讲的是通过post方式导出excel

    先看前端代码

    responseType: "blob"这个很关键
    async exportData() { 
          axios({
            method: "post",
            url: "/excel",
            data:this.query.data,
            responseType: "blob"
          })
            .then(res => {
             // console.log(decodeURI(res.headers['filename']));
              const link = document.createElement("a");
              let blob = new Blob([res.data], { type: "application/vnd.ms-excel" });
              link.style.display = "none";
              link.href = URL.createObjectURL(blob);
              link.setAttribute("download", decodeURI(res.headers['filename']));
              document.body.appendChild(link);
              link.click();
              document.body.removeChild(link);
            })
            .catch(error => {
              this.$Notice.error({
                title: "错误",
                desc: "系统数据错误"
              });
              console.log(error);
            });
        },

    后台springboot通过poi导出excel

    Maven引入依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>RELEASE</version>
    </dependency>
    Controller层接受参数并处理数据,按理说不应该在这里处理数据,为了直观先这样了
    @PostMapping(value = "excel")
        @ResponseBody
        public void excel() throws Exception {
    HttpServletRequest request = (HttpServletRequest) servletRequestAttributes.getRequest();
            HttpServletResponse response = servletRequestAttributes.getResponse();
            StringBuffer jb = new StringBuffer();
            String line = null;
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null)
                jb.append(line);
            params = JSON.parseObject(jb.toString(), PersonRequest.class);
    //.....省略表头和数据处理
    SimpleDateFormat fdate = new SimpleDateFormat("yyyyMMddHHmmss");
            String fileName = title + fdate.format(new Date()) + ".xlsx";
            ExcelUtil.exportExcel(response, fileName, data);
    }
    ExcelUtil工具类
    /**
         * 导出excel
         * @param response response
         * @param fileName 文件名
         * @param data 数据
         * @throws Exception
         */
        public static void exportExcel(HttpServletResponse response, String fileName, ExcelData data) throws Exception {
            // 告诉浏览器用什么软件可以打开此文件
            response.setHeader("content-Type", "application/vnd.ms-excel");
            // 下载文件的默认名称
            response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "utf-8"));
            response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8"));
            response.setHeader("Access-Control-Expose-Headers", "FileName");
            exportExcel(data, response.getOutputStream());
        }
    
        public static void exportExcel(ExcelData data, OutputStream out) throws Exception {
    
            XSSFWorkbook wb = new XSSFWorkbook();
            try {
                String sheetName = data.getName();
                if (null == sheetName) {
                    sheetName = "Sheet1";
                }
                XSSFSheet sheet = wb.createSheet(sheetName);
                writeExcel(wb, sheet, data);
    
                wb.write(out);
            } catch(Exception e){
                e.printStackTrace();
            }finally{
                //此处需要关闭 wb 变量
                out.close();
            }
        }
    
        private static void writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {
    
            int rowIndex = 0;
    
            rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles());
            writeRowsToExcel(wb, sheet, data.getRows(), rowIndex);
            autoSizeColumns(sheet, data.getTitles().size() + 1);
    
        }
    
        private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List<String> titles) {
            int rowIndex = 0;
            int colIndex = 0;
    
            Font titleFont = wb.createFont();
            titleFont.setFontName("simsun");
            //titleFont.setBoldweight(Short.MAX_VALUE);
            // titleFont.setFontHeightInPoints((short) 14);
            titleFont.setColor(IndexedColors.BLACK.index);
    
            XSSFCellStyle titleStyle = wb.createCellStyle();
            titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
            titleStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
            titleStyle.setFillForegroundColor(new XSSFColor(new Color(182, 184, 192)));
            titleStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
            titleStyle.setFont(titleFont);
            setBorder(titleStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0)));
    
            Row titleRow = sheet.createRow(rowIndex);
            // titleRow.setHeightInPoints(25);
            colIndex = 0;
    
            for (String field : titles) {
                Cell cell = titleRow.createCell(colIndex);
                cell.setCellValue(field);
                cell.setCellStyle(titleStyle);
                colIndex++;
            }
    
            rowIndex++;
            return rowIndex;
        }
    
        private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex) {
            int colIndex = 0;
    
            Font dataFont = wb.createFont();
            dataFont.setFontName("simsun");
            // dataFont.setFontHeightInPoints((short) 14);
            dataFont.setColor(IndexedColors.BLACK.index);
    
            XSSFCellStyle dataStyle = wb.createCellStyle();
            dataStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
            dataStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
            dataStyle.setFont(dataFont);
            setBorder(dataStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0)));
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
            for (List<Object> rowData : rows) {
                Row dataRow = sheet.createRow(rowIndex);
                // dataRow.setHeightInPoints(25);
                colIndex = 0;
    
                for (Object cellData : rowData) {
                    Cell cell = dataRow.createCell(colIndex);
                    if (cellData != null) {
                        if(cellData instanceof Date)
                        {
                            cell.setCellValue(sdf.format(cellData));
                        }
                        else
                        {
                            cell.setCellValue(cellData.toString());
                        }
                    } else {
                        cell.setCellValue("");
                    }
                    cell.setCellStyle(dataStyle);
                    colIndex++;
                }
                rowIndex++;
            }
            return rowIndex;
        }
    
        private static void autoSizeColumns(Sheet sheet, int columnNumber) {
    
            for (int i = 0; i < columnNumber; i++) {
                int orgWidth = sheet.getColumnWidth(i);
                sheet.autoSizeColumn(i, true);
                int newWidth = (int) (sheet.getColumnWidth(i) + 100);
                if (newWidth > orgWidth) {
                    sheet.setColumnWidth(i, newWidth);
                } else {
                    sheet.setColumnWidth(i, orgWidth);
                }
            }
        }
    
        private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) {
            style.setBorderTop(border);
            style.setBorderLeft(border);
            style.setBorderRight(border);
            style.setBorderBottom(border);
            style.setBorderColor(BorderSide.TOP, color);
            style.setBorderColor(BorderSide.LEFT, color);
            style.setBorderColor(BorderSide.RIGHT, color);
            style.setBorderColor(BorderSide.BOTTOM, color);
        }
  • 相关阅读:
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车按键启动和蜂鸣器报警
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    asp中设置session过期时间方法总结
    asp中设置session过期时间方法总结
    ASP.NET关于Session_End触发与否的问题
  • 原文地址:https://www.cnblogs.com/zhujunfie/p/11216800.html
Copyright © 2011-2022 走看看