Vue +springboot 导出excel

两种实现方式:1.后台返回json,前台通过xlsx解析,然后生成excel文件;2.后台返回文件流;

第一种方式:贴出前台代码,后台的就不需要了吧,就是很简单的json数据;

 //导出
      exportTable() {
        var jsono = [{
          "应用名字" : "appname",
          "关键字" : "keyword",
          
         
        }]
        var keyMap = []; 
        var valueMap = [];
        var list1 = []
        for (var k in jsono[0]) {
            keyMap.push(k)
            valueMap.push(jsono[0][k])
        }
        for (var i=0;i

第二种:同样,先贴出前台代码:

// 导出方法

exportTable(){
    this.$http({
        url: this.$http.adornUrl('/*/getExportData'),//获取文件流的接口路径
        method: 'post',
        data: {//请求参数
            "id":"12"
            },    
    responseType: 'blob' // 表明返回服务器返回的数据类型 很重要!!
    }).then((res) => {
        //将文件流转成blob形式
        const blob = new Blob([res.data],{type: 'application/vnd.ms-excel'});
        let filename ='1.xls';
        //创建一个超链接,将文件流赋进去,然后实现这个超链接的单击事件
        const elink = document.createElement('a');
        elink.download = filename;
        elink.style.display = 'none';
        elink.href = URL.createObjectURL(blob);
        document.body.appendChild(elink);
        elink.click();
        URL.revokeObjectURL(elink.href); // 释放URL 对象
        document.body.removeChild(elink);
    }).catch(error => {
        this.$message.error('导出失败');
        // console.log(error)

    })

},

后台代码我不想贴了,因为用的jxl的技术,很老,我就只贴出遇到的问题跟解决方式吧:
(1)第一个问题:前台不识别文件流

        responseType: 'blob' // 表明返回服务器返回的数据类型 很重要!!

    这个一定要加在请求头里面,否则识别不了文件流

(2)第二个问题:跨域

因为是前后端分离,IP跟端口肯定不一样,浏览器不接受这种跨域返回的文件流,所以需要在response的header里面加一条属性:

response.setHeader("Access-Control-Allow-Origin", "http://***:8001");//解决跨域

网上有很多说放个*就行,像这样:

response.setHeader("Access-Control-Allow-Origin", "*");//解决跨域

但是我这试了不行,所以就把前台的具体IP跟端口写进去了,反正是管用。

 

//费了很大功夫,把后台返回文件流的代码更新成poi方式了,然后我发现,后台jxl方式,需要解决跨域,而改成poi就不需要跨域了,很神奇,也没空去了解更多;先把后台代码记录一下:

public static void export(List> list, LinkedHashMap fieldMap,String filName,
                       HttpServletResponse response) throws IOException {
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet(filName+"1");//新建sheet
        HSSFCellStyle contextstyle =wb.createCellStyle();
        HSSFRow row = null;
        int rowIndex = 0 ;
        row = sheet.createRow(0);
        row.setHeight((short) (22.50 * 20));//设置行高
        // 定义存放英文字段名和中文字段名的数组
        String[] enFields = new String[fieldMap.size()];
        String[] cnFields = new String[fieldMap.size()];
        // 填充数组
        int count = 0;
        for (Map.Entry entry : fieldMap.entrySet()) {
            enFields[count] = entry.getKey();

            cnFields[count] = entry.getValue();
            count++;
        }
        //设置表头
        for(int i=0; i65535 ){
                sheet = wb.createSheet(filName+"2");
                row = sheet.createRow(0);
                row.setHeight((short) (22.50 * 20));//设置行高
                //设置表头
                for(int k=0; k

 

你可能感兴趣的:(随记)