vue xlsx表单导出样式设置

参考:https://www.cnblogs.com/liuxianan/p/js-excel.html

注意:博客代码是没有整理直接从原代码中复制的,看不懂的查看视频,或者直接下载dome代码查看。

视频:https://live.csdn.net/v/146981

demo代码:https://download.csdn.net/download/weixin_35773751/14927955


1. xlsx 开发手册

https://github.com/SheetJS/sheetjs#installation

2. xlsx 中文手册

https://segmentfault.com/a/1190000018077543

3. xlsx-style 手册

https://www.npmjs.com/package/xlsx-style

3. Blob、ArrayBuffer和Buffer

https://zhuanlan.zhihu.com/p/97768916

前面是要掌握的知识点,不要求全懂但是得知道到底要干什么。

4. 业务代码

前言:我是在项目中的全局方法库文件开发的,所以这里是直接在全局方法库文件中开发。

首先,引入xlsxxlsx-style

import * as XLSX from 'xlsx' // XLSX 表单导出
import { write } from "xlsx-style"; // lsx-style 表单样式

备注:这里我只要xlsx-style中的write就够了。

安装结束报错./cptable in ./node_modules/_xlsx-style@0.8.13@xlsx-style/dist/cpexcel.js

解决办法:
在\node_modules\xlsx-style\dist\cpexcel.js 807行 的 var cpt = require(’./cpt’ + ‘able’); 改成 var cpt = cptable;

如图:
在这里插入图片描述

然后,制作导出方法:

export function fileExport3(selectData, dataListCall, fileName){
    
    if(selectData && selectData.length > 0){
        selectData = nullClear(selectData) // 清除数据中的null

        selectData = JSON.parse(JSON.stringify(selectData))

        dataListCall = JSON.parse(JSON.stringify(dataListCall)) // 深拷贝数据

        let data = formatExcelData(selectData, dataListCall) // 格式化选中数据,将字典数据解析成汉字

        let sheet = XLSX.utils.aoa_to_sheet(data); // 官方工具类,将一个二维数组转成sheet数据

        let flName = JSON.parse(JSON.stringify(fileNameFun(fileName))) // 格式化文件名称为,日期 + 时间 + 当前菜单 + 文件类型

        // sheet['!merges'] = [ // 合并
        //     {
        //         s: {r: 0, c: 0}, 
        //         e: {r: 0, c: 2}
        //     }
        // ];

        // sheet['!cols'] = [ // 宽度
        //     { wpx: 500 },
        // ]

        sheet = excelStyle(sheet) // 定义表格样式

        if (!timer) { // 节流
            timer = setTimeout(() => {
                Elements.Message.success(Zh.exportSuccess)
                openDownloadDialog(sheet2blob(sheet), flName); // 导出文件
                timer = null
            }, 500)
        }
    }else{
        Elements.Message.warning(Zh.exportData)
    }
}

这里要注意:xlsx 是支持合并的(例如注销的合并部分),但不支持样式。网上资料说有个pro版本是可以的,但是要付费,所以我们就用开源的xlsx-style来实现样式。

然后,我还需要一个下载方法:

/**
 * 下载对话框
 * @param url 下载地址,也可以是一个blob对象,必选
 * @param saveName 文件名,可选
*/
function openDownloadDialog(url, saveName) {
    if (typeof url == 'object' && url instanceof Blob) {
        url = URL.createObjectURL(url); // 创建blob地址
    }
    var aLink = document.createElement('a');
    aLink.href = url;
    aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:// 模式下不会生效
    var event;
    if (window.MouseEvent) event = new MouseEvent('click');
    else {
        event = document.createEvent('MouseEvents');
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    }
    aLink.dispatchEvent(event);
}

而我在下载的时候还需要加一个sheet数据转excel文件流的方法:

/**
 * sheet数据转excel文件的数据,然后利用URL.createObjectURL下载
 * sheet  sheet数据
 * sheetName  文件名称
*/
function sheet2blob(sheet, sheetName) {
    sheetName = sheetName || '导出文件'; // 文件名不存在,默认为‘导出文件’

    var workbook = {
        SheetNames: [sheetName],
        Sheets: {}
    };
    console.log(workbook,'workbook')

    workbook.Sheets[sheetName] = sheet;

    var wopts = { // excel配置
        bookType: 'xlsx', // 要生成的文件类型
        bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        type: 'binary'
    };

    // var wbout = XLSX.write(workbook, wopts); // 将表格数据转成文档流
    var wbout = write(workbook, wopts); // 将表格数据转成文档流
    // console.log(wbout,'wbout++')

    var blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" }); // 转成Blob数据
    
    function s2ab(s) { // 字符串转ArrayBuffer
        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;
    }

    return blob;
}

到这里那就所以逻辑就都写完了,我们只需要在要使用的地方调用就ok了。

效果图:
在这里插入图片描述
在这里插入图片描述

完美。(* ̄︶ ̄)

为了解决vxe-table导出数据不全的问题,可以尝试以下方法: 1.检查数据是否超过了默认的最大行数和最大列数。vxe-table默认的最大行数是200,最大列数是100,如果数据超过了这个范围,就需要手动设置最大行数和最大列数。 2.检查是否设置了表格的width和min-width属性。如果没有设置这些属性,表格可能会因为宽度不够而无法完全显示数据。 3.检查是否设置了列的width属性。如果没有设置这些属性,列的宽度可能会根据内容自适应,导致列宽不够,数据无法完全显示。 4.检查是否设置了列的showOverflowTooltip属性。如果没有设置这些属性,当列宽不够时,数据会被隐藏,无法完全显示。 5.检查是否设置了列的fixed属性。如果没有设置这些属性,当表格有横向滚动条时,列可能会因为滚动而被隐藏,无法完全显示。 6.检查是否设置了列的exportMethod属性。如果没有设置这些属性,导出数据时可能会因为默认的导出方法无法处理某些数据类型而导致数据不全。 以下是一个设置vxe-table导出数据的例子: ```javascript <template> <vxe-table ref="xTable" :data="tableData" :columns="columns" :export-config="{ filename: 'table-data', sheetName: 'Sheet1', original: true }" > <vxe-button slot="toolbar" @click="exportData">导出数据</vxe-button> </vxe-table> </template> <script> import { exportFile } from 'xlsx' export default { data() { return { tableData: [ { name: 'John', age: 22, gender: 'Male' }, { name: 'Jane', age: 25, gender: 'Female' }, { name: 'Bob', age: 30, gender: 'Male' } ], columns: [ { field: 'name', title: 'Name', width: 150 }, { field: 'age', title: 'Age', width: 150 }, { field: 'gender', title: 'Gender', width: 150 } ] } }, methods: { exportData() { const tableData = this.$refs.xTable.getTableData() const sheetData = XEUtils.getArray([{ data: tableData, sheetName: 'Sheet1' }], 'data') const excelData = exportFile(sheetData, 'table-data', 'xlsx') saveAs(new Blob([excelData], { type: 'application/octet-stream' }), 'table-data.xlsx') } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风细雨_林木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值