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);
        }
  • 相关阅读:
    八大排序(一)-------冒泡排序
    vs code 常用插件记录
    vc code 透明背景图片配置
    .Net FrameWork获取配置文件信息
    c#中关于Convert.ToDouble的一个注意事项
    JsonArray
    webpack打包(二)
    了解webpack(一)
    vue组件的封装
    DIV+CSS必须知道的事
  • 原文地址:https://www.cnblogs.com/zhujunfie/p/11216800.html
Copyright © 2011-2022 走看看