首页 > 其他分享 >Vue+Element导出Excel表格示例

Vue+Element导出Excel表格示例

时间:2023-08-15 11:55:49浏览次数:41  
标签:Vue 示例 Excel cell range ws var query data

<template>
  <div @click="exportFn">导出</div>
</template>

<script>
      export default {
         data() {
            return {
               query: {
                   pageIndex: 1, // 当前页
                   pageSize: 10, // 页大小
                   total: 0
               },   
          exportFileName: "警情列表", // 导出文件名              bookType: "xlsx",            tHeader: ["警情编号","单位"],           tValue: ["incidentNumber","deptName"],  
           }
        },
        methods: {
             exportFn() {
                 // 原先的页面条数
       let pageSize = this.query.pageSize
       // 导出所有数据的条数
       let total = this.query.total
       if(total <= 0) return this.$message.warning("无导出内容!")
       //判断是否有多页
       if (total > pageSize) {
         //设置导出所有数据的参数, 因为该方法只能导出当前页面的数据,当前页有多少条就只能导出多少条数据
         this.query.pageIndex = 1;
         this.query.pageSize = 3000;
         const loading = this.$loading({ lock: true, text: '正在导出数据...', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' })
         this.$request({ url: this.tableDataApiUrl, method: 'post', data: this.query }).then((res1) => {
           this.tableData = res1.data.records
           this.downingExcel();  // 执行导出方法
           // 恢复原先数据
           this.query.pageIndex = 1;
           this.query.pageSize = 10;
           this.$request({ url: this.tableDataApiUrl, method: 'post', data: this.query }).then((res2) => {
             this.tableData = res2.data.records;
             loading.close();
           }).catch((error) => {
             loading.close();
             console.log('列表请求异常', error)
           })
         }).catch((error) => {
           console.log('列表请求异常', error)
         })
       } else {
         this.downingExcel();
       }
    }
  },
   //执行下载excle文件
     downingExcel() {
       import("../../scripts/Export2Excel.js").then((excel) => {
         const data = formatJson(this.tValue, this.tableData);
         excel.export_json_to_excel({
           header: this.tHeader,
           data,
           filename: this.exportFileName,
           autoWidth: true, // 自适应宽度
           bookType: this.bookType,
         });
       });
       function formatJson(filterVal, jsonData) {
         return jsonData.map(v => filterVal.map(j => {
           return v[j]
         }))
       }
     },
     }
 </script> 


 

Export2Excel.js

/* eslint-disable */
require('file-saver');
import XLSX from 'xlsx'

function generateArray(table) {
    var out = [];
    var rows = table.querySelectorAll('tr');
    var ranges = [];
    for (var R = 0; R < rows.length; ++R) {
        var outRow = [];
        var row = rows[R];
        var columns = row.querySelectorAll('td');
        for (var C = 0; C < columns.length; ++C) {
            var cell = columns[C];
            var colspan = cell.getAttribute('colspan');
            var rowspan = cell.getAttribute('rowspan');
            var cellValue = cell.innerText;
            if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;

            //Skip ranges
            ranges.forEach(function (range) {
                if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
                    for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
                }
            });

            //Handle Row Span
            if (rowspan || colspan) {
                rowspan = rowspan || 1;
                colspan = colspan || 1;
                ranges.push({
                    s: {
                        r: R,
                        c: outRow.length
                    },
                    e: {
                        r: R + rowspan - 1,
                        c: outRow.length + colspan - 1
                    }
                });
            };

            //Handle Value
            outRow.push(cellValue !== "" ? cellValue : null);

            //Handle Colspan
            if (colspan)
                for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
        }
        out.push(outRow);
    }
    return [out, ranges];
};

function datenum(v, date1904) {
    if (date1904) v += 1462;
    var epoch = Date.parse(v);
    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}

function sheet_from_array_of_arrays(data, opts) {
    var ws = {};
    var range = {
        s: {
            c: 10000000,
            r: 10000000
        },
        e: {
            c: 0,
            r: 0
        }
    };
    for (var R = 0; R != data.length; ++R) {
        for (var C = 0; C != data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            var cell = {
                v: data[R][C]
            };
            if (cell.v == null) continue;
            var cell_ref = XLSX.utils.encode_cell({
                c: C,
                r: R
            });

            if (typeof cell.v === 'number') cell.t = 'n';
            else if (typeof cell.v === 'boolean') cell.t = 'b';
            else if (cell.v instanceof Date) {
                cell.t = 'n';
                cell.z = XLSX.SSF._table[14];
                cell.v = datenum(cell.v);
            } else cell.t = 's';

            ws[cell_ref] = cell;
        }
    }
    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
    return ws;
}

function Workbook() {
    if (!(this instanceof Workbook)) return new Workbook();
    this.SheetNames = [];
    this.Sheets = {};
}

function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
}

export function export_table_to_excel(id) {
    var theTable = document.getElementById(id);
    var oo = generateArray(theTable);
    var ranges = oo[1];

    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";

    var wb = new Workbook(),
        ws = sheet_from_array_of_arrays(data);

    /* add ranges to worksheet */
    // ws['!cols'] = ['apple', 'banan'];
    ws['!merges'] = ranges;

    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {
        bookType: 'xlsx',
        bookSST: false,
        type: 'binary'
    });

    saveAs(new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    }), "test.xlsx")
}

export function export_json_to_excel({
    header,
    data,
    filename,
    autoWidth = true,
    bookType = 'xlsx'
} = {}) {
    /* original data */
    filename = filename || 'excel-list'
    data = [...data]
    data.unshift(header);
    var ws_name = "SheetJS";
    var wb = new Workbook(),
        ws = sheet_from_array_of_arrays(data);

    if (autoWidth) {
        /*设置worksheet每列的最大宽度*/
        const colWidth = data.map(row => row.map(val => {
            /*先判断是否为null/undefined*/
            if (val == null) {
                return {
                    'wch': 10
                };
            }
            /*再判断是否为中文*/
            else if (val.toString().charCodeAt(0) > 255) {
                return {
                    'wch': val.toString().length * 2
                };
            } else {
                return {
                    'wch': val.toString().length
                };
            }
        }))
        /*以第一行为初始值*/
        let result = colWidth[0];
        for (let i = 1; i < colWidth.length; i++) {
            for (let j = 0; j < colWidth[i].length; j++) {
                if (result[j]['wch'] < colWidth[i][j]['wch']) {
                    result[j]['wch'] = colWidth[i][j]['wch'];
                }
            }
        }
        ws['!cols'] = result;
    }

    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {
        bookType: bookType,
        bookSST: false,
        type: 'binary'
    });
    saveAs(new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    }), `${filename}.${bookType}`);
}

 

标签:Vue,示例,Excel,cell,range,ws,var,query,data
From: https://www.cnblogs.com/btsn/p/17630896.html

相关文章

  • 使用Pandas进行数据清理的入门示例
    数据清理是数据分析过程中的关键步骤,它涉及识别缺失值、重复行、异常值和不正确的数据类型。获得干净可靠的数据对于准确的分析和建模非常重要。本文将介绍以下6个经常使用的数据清理操作:检查缺失值、检查重复行、处理离群值、检查所有列的数据类型、删除不必要的列、数据不一......
  • Vue3 setup的业务逻辑分离功能拆分
    在Vue3开发中,我们可能遇到一个页面或者组件业务逻辑很复杂,代码量达到千行,不利于阅读和维护,因此需要将业务逻辑进行分离首页主界面index.vue//index.vue<script>import{reactive,toRefs}from'vue'importuseOperatefrom'./useOperate.js'importuseConfi......
  • vue + element-ui 的from表单嵌套数组的验证问题
    在vue+element-ui/plus的项目中,有的时候会出现表单自定义增加数组字段,并要对新增加的字段添加相关验证。举个例子//结构data(){return{form:{name:'',Param:[{id:0,label:'',Itemtype:0,},......
  • UnityExcel数据查看以及文件导入
    需要插件EPPlus.dll、Excel.dll///<summary>///读取Excel表并返回一个DataRowCollection对象///</summary>///<paramname="_path">Excel表路径</param>///<paramname="_sheetIndex">读取的Sheet索引。Excel表中是有多个......
  • ABAP EXCEL批导和查看自建表样板
    结果:  内文:  源代码:ZHMRFI017:*&---------------------------------------------------------------------**&ReportZHMRFI017*&*&---------------------------------------------------------------------**&*&*&-------------......
  • vue--day64--Vue-resource
    安装npminstallvue-resource//main.js使用importVueResourcefrom"vue-resource"Vue.use(VueResource)安装好Vue-resource之后,在Vue组件中,我们就可以通过this.$http或者使用全局变量Vue.http发起异步请求......
  • 关于Vue的就地更新策略的解析
    在Vue中使用v-for渲染列表时,默认使用就地更新策略。该策略默认是基于索引的,规定在列表绑定的数据元素顺序变化时,不会重新创建整个列表,而只是更新对应DOM元素上的数据。以下代码实现了一个TODO列表的勾选、添加和删除功能:<!DOCTYPEhtml><html><head><title>In-PlaceUpd......
  • Vue computed 计算属性语法
    1.不传参import{ref,computed}from"vue";letcarnoColor=computed(()=>{returnformatterCarnoColor(model.value.carnoColor)}) 2.传参<divv-for="iteminlist"><divv-if='isShow(item)'>是否显示</div......
  • React和Vue的区别,大家怎么看?
    Vue更适合小项目,React更适合大公司大项目;Vue的学习成本较低,很容易上手,但项目质量不能保证......真的是这样吗?借助本篇文章,我们来从一些方面的比较来客观的去看这个问题。 论文档的丰富性从两个方面来看这个问题:社区的支持力度及文档的完善性。 对于任何编程语......
  • vue3 使用 vue-i18n 配置多语言环境
    1.插件地址:VueI18n官方文档GitHub地址2.安装:在Vue之后引入vue-i18n,它会自动安装:<scriptsrc="https://unpkg.com/vue/dist/vue.js"></script><scriptsrc="https://unpkg.com/vue-i18n/dist/vue-i18n.js"></script>NPM:npminstallv......