美文网首页
导出(下载)

导出(下载)

作者: zlf_j | 来源:发表于2020-11-21 21:54 被阅读0次

后台返回文件流

word

        // 导出 Word
        let blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8' });
        let objectUrl = URL.createObjectURL(blob);
        window.location.href = objectUrl;

excel

               // 导出Excel
                var blob = new Blob([res.data]); //创建一个blob对象
                var a = document.createElement('a'); //创建一个<a></a>标签
                a.href = URL.createObjectURL(blob); // response is a blob
                a.download = "保单.xlsx"; //文件名称
                a.style.display = 'none';
                document.body.appendChild(a);
                a.click();
                a.remove();

bug:下载后的文件,打不开
解决办法:
请求时,加 responseType: blob

传参

  • window.location.href —— 动态输出跳转
        let arr = []
        this.multipleSelection.forEach((item, index) => {
            arr.push(item.userId)
        })
        let b = arr.join(',')
       window.location.href=axios.defaults.baseURL+"/sys/exportTownUserAccountingFraudInfo?ids="+b // 接口传参
  • axios.defaults.baseURL —— axios默认请求的地址前缀

main.js 中设置
axios.defaults.baseURL = 'http://域名:端口'

前端通过列表数据,直接下载

方法一、vue-json-excel(企业微信中打开项目报错)

1、安装:npm install vue-json-excel -S
2、main.js
import JsonExcel from 'vue-json-excel'
Vue.component('downloadExcel', JsonExcel)
3、组件内
            <download-excel
               :fields="json_fields" // 定义导出的数据结构
                :fetch="exportCreate" // 异步请求数据
                name="导出.xls"> // 导出文件名
                <i class="el-icon-download"></i>导出 // 导出文字
            </download-excel>
  • data
json_fields: {
                '序号': 'index',
                '姓名': {
                    label: 'name',
                    callback: (value) => {
                        return value.face_photo + value.name; // 拼接字段
                    }
                },
                '数字': {
                    label: 'case_number',
                    callback: (value) => {
                        return '&nbsp;' + value.case_number; // '&nbsp;' 防止数字过长,展示不全
                    }
                },
                '日期': {
                    label: 'register_time',
                    callback: (value) => {
                        return value.register_time?value.register_time.slice(0, 10):''; // 截取字符串
                    }
                },
                '数组': {
                    label: 'treatment_planning',
                    callback: (value) => {
                        return value.treatment_planning && value.treatment_planning.length > 0?value.treatment_planning.join(','):''; // 数组用逗号隔开
                    }
                },
                '数组拼接重组': {
                    label: 'intraoral_photo',
                    callback: (value) => {
                        let str = value.intraoral_photo && value.intraoral_photo.length > 0?value.intraoral_photo.join(' '):'';
                        let str2 = value.side_intraoral_photo && value.side_intraoral_photo.length > 0?value.side_intraoral_photo.join(' '):'';
                        let str3 = value.maxillofacial_photo && value.maxillofacial_photo.length > 0?value.maxillofacial_photo.join(' '):'';
                        return str + ' ' + str2 + ' ' + str3 // 多个数组拼接
                    }
                },
                '数组': {
                    label: 'plan',
                    callback: (value) => {
                        return value.plan && value.plan.length > 0?value.plan.join(' '):'';
                    }
                }
            },
            exportList: [] // 导出的数据
  • methods
// 导出 每页导出3000条,最多导出50000条数据 
        async exportCreate () { // 异步请求
            let that = this
            let total = that.customerSeeList.total // 列表总数
            if (total == 0) {
                that.$message.warning('暂无数据可导出')
                return
            }
            if (total > 50000) {
                that.$message.warning('导出数据过多,导出失败!')
                return
            }
            let pages = (total + 3000 - 1) / 3000 // 共有多少页
            that.exportList = [] // 导出的数据
            for (var i = 1; i< pages; i++) {  
                const response = await that.$store.dispatch('treat/exportCustomerSee', { // 每3000条请求一次,列表接口
                    pm_id: that.search.pm_id, // 其他参数,列表下拉筛选
                    currentPage: i, // 第几页
                    pageSize: 3000 // 每页限额3000
                })
                if (response.status == 0) {                             
                    that.exportList = that.exportList.concat(response.data.list) // 列表数据拼接     
                    that.exportList.forEach((item, index) => {
                        item.index = index + 1 // 加字段,序号
                    })
                }
            }    
            return that.exportList
        },

https://www.cnblogs.com/shaozhu520/p/12653855.html
https://zhuanlan.zhihu.com/p/77791428

问题:数字长度太长转为科学计数法
解决办法:数字前拼接 &nbsp;

json_fields: {
             '数字过长': {
                    label: 'number',
                    callback: (value) => {
                        return '&nbsp;' + value.number;
                    }
                }
}

https://www.ngui.cc/51cto/show-69687.html

方法二、基于Blob.js和 Export2Excel.js做前端导出(企业微信可用)

https://www.cnblogs.com/wuqilang/p/13344902.html

相关文章

网友评论

      本文标题:导出(下载)

      本文链接:https://www.haomeiwen.com/subject/ndfyiktx.html