表格导出使用xlsx-style-vite修改导出样式

最近项目需求让封装一个公共表格导出组件,项目是vue3+vite+ts搭建的,最初下载xlsx-style总是报错 this relative module was not found: ./cptable and ./node_modules/xlsx-style,查到有让改依赖解决报错问题的感觉不实用后续再次下载依赖还会出问题,困扰了一天没有解决问题,后续突然发现了xlsx-style-vite完美解决导出样式问题。

1.下载依赖:npm install xlsx-style-vite
2.在需要的页面引用 import * as XLSX_STYLE from 'xlsx-style-vite
下面是样式设置的代码:
//设置公共样式
const setPubExcel = (data) => {
    data["!cols"] = [];
    const excludes = ['!cols', '!fullref', '!merges', '!ref', '!rows'];
    for (let key in data) {
        if (data.hasOwnProperty(key)) {
            if (!excludes.includes(key)) {
                data[key].s = {
                    border: {
                        top: { style: 'thin', color: { rgb: '000000' } },
                        bottom: { style: 'thin', color: { rgb: '000000' } },
                        left: { style: 'thin', color: { rgb: '000000' } },
                        right: { style: 'thin', color: { rgb: '000000' } },
                    },
                    alignment: {
                        horizontal: 'center',//水平居中对齐
                       vertical: 'center',//垂直居中
                        wrapText: true,//是否换行
                    }
                     fill: {
                         fgColor: { rgb: '0070C0' },
                    },
                }
            }
        }
    }
};
// 合并行列样式
const mergeCell = (range, ws) => {
    let cols = ['A', 'B', 'C', 'D', 'E', 'F'];
    range.forEach(item => {
        let style = {
            s: {
                border: {
                    top: { style: 'thin', color: { rgb: '000000' } },
                    bottom: { style: 'thin', color: { rgb: '000000' } },
                    left: { style: 'thin', color: { rgb: '000000' } },
                    right: { style: 'thin', color: { rgb: '000000' } },
                },
                alignment: {
                    horizontal: 'center',//水平居中对齐
                    vertical: 'center',//垂直居中
                    wrapText: true,//自动换行
                },
            }
        };
        // 处理合并行
        for (let i = item.s.c; i <= item.e.c; i++) {
            ws[`${cols[i]}${Number(item.e.r) + 1}`] = ws[`${cols[i]}${Number(item.e.r) + 1}`] || style;

            // 处理合并列
            for (let k = item.s.r + 2; k <= item.e.r + 1; k++) {
                ws[cols[i] + k] = ws[cols[k] + item.e.r] || style
            }
        }
    })
    return ws
};
然后就是在导出方法中调用上述方法就可以实现对导出样式的修改                                                  
 let workbook = XLSX.utils.book_new();
    let table = document.querySelector('#' + tableId);
    let wb = XLSX.utils.table_to_sheet(table);
    XLSX.utils.book_append_sheet(workbook, wb, name);
    mergeCell(wb['!merges'], wb)
    setPubExcel(wb);
 完整代码如下:
<script lang="ts"  setup>
import * as XLSX from 'xlsx';
import * as XLSX_STYLE from 'xlsx-style-vite';
import FileSaver from 'file-saver';

//设置公共样式
const setPubExcel = (data) => {
    data["!cols"] = [];
    const excludes = ['!cols', '!fullref', '!merges', '!ref', '!rows'];
    for (let key in data) {
        if (data.hasOwnProperty(key)) {
            if (!excludes.includes(key)) {
                data[key].s = {
                    border: {
                        top: { style: 'thin', color: { rgb: '000000' } },
                        bottom: { style: 'thin', color: { rgb: '000000' } },
                        left: { style: 'thin', color: { rgb: '000000' } },
                        right: { style: 'thin', color: { rgb: '000000' } },
                    },
                    alignment: {
                        horizontal: 'center',//水平居中对齐
                       vertical: 'center',//垂直居中
                        wrapText: true,//是否换行
                    }
                     fill: {
                         fgColor: { rgb: '0070C0' },
                    },
                }
            }
        }
    }
};

// 合并行列样式
const mergeCell = (range, ws) => {
    let cols = ['A', 'B', 'C', 'D', 'E', 'F'];
    range.forEach(item => {
        let style = {
            s: {
                border: {
                    top: { style: 'thin', color: { rgb: '000000' } },
                    bottom: { style: 'thin', color: { rgb: '000000' } },
                    left: { style: 'thin', color: { rgb: '000000' } },
                    right: { style: 'thin', color: { rgb: '000000' } },
                },
                alignment: {
                    horizontal: 'center',//水平居中对齐
                    vertical: 'center',//垂直居中
                    wrapText: true,//自动换行
                },
            }
        };
        // 处理合并行
        for (let i = item.s.c; i <= item.e.c; i++) {
            ws[`${cols[i]}${Number(item.e.r) + 1}`] = ws[`${cols[i]}${Number(item.e.r) + 1}`] || style;

            // 处理合并列
            for (let k = item.s.r + 2; k <= item.e.r + 1; k++) {
                ws[cols[i] + k] = ws[cols[k] + item.e.r] || style
            }
        }
    })
    return ws
};

const s2ab = (s) => {
    const buf = new ArrayBuffer(s.length);
    const view = new Uint8Array(buf);
    for (let i = 0; i < s.length; i++) {
        view[i] = s.charCodeAt(i) & 0xff;
    }
    return buf;
};

//导出公共方法
const exportExcel = async (filename, tableId, name) => {
    //let xlsxParam = { raw: true };// 导出的内容只做解析,不进行格式转换
    let workbook = XLSX.utils.book_new();
    let table = document.querySelector('#' + tableId);
    let wb = XLSX.utils.table_to_sheet(table);
    XLSX.utils.book_append_sheet(workbook, wb, name);
    mergeCell (wb['!merges'], wb)
    setPubExcel(wb);

    let wbout = XLSX_STYLE.write(workbook, { bookType: 'xlsx', bookSST: false, type: 'binary', });
    try {
        FileSaver.saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream;charset=utf-8"' }), filename + '.xlsx')
    } catch (e) {
        if (typeof console !== 'undefined') {
            console.log(e, wbout)
        }
    }
    return wbout
};
</script>

完美解决问题 !!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xlsx-style-vite 是一个基于 Node.js 的库,用于在服务器端生成和修改 Excel 文件。要修改导出 Excel 表格的字体,需要先安装 xlsx-style-vite 和相关的字体库,然后使用相关的 API 进行操作。 以下是一个简单的示例,演示如何在 Excel 表格修改字体: ```javascript const XLSXStyle = require('xlsx-style-vite'); const workbook = XLSXStyle.readFile('example.xlsx'); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; // 修改字体 const cellRange = XLSXStyle.utils.decode_range(worksheet['!ref']); for (let r = cellRange.s.r; r <= cellRange.e.r; r++) { for (let c = cellRange.s.c; c <= cellRange.e.c; c++) { const cellAddress = XLSXStyle.utils.encode_cell({ r, c }); if (worksheet[cellAddress]) { worksheet[cellAddress].s = { font: { name: 'Calibri', sz: 14, bold: true, color: { rgb: 'FF0000FF' }, }, }; } } } XLSXStyle.writeFile(workbook, 'output.xlsx'); ``` 在上面的示例中,我们使用 XLSXStyle 库中的 `readFile()` 方法读取了一个名为 `example.xlsx` 的 Excel 文件。然后,我们获取了第一个工作表并遍历了其中的所有单元格,并使用 `worksheet[cellAddress].s` 对象修改了单元格的样式,包括字体名称、大小、粗细和颜色等。最后,我们使用 `writeFile()` 方法将修改后的 Excel 文件保存为 `output.xlsx` 文件。 需要注意的是,在修改字体之前,您需要确保已经安装了所需的字体库,并且在代码中正确地引用了这些字体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值