使用exceljs导出luckysheet表格(合并,边框,行高,列宽,冻结,行列隐藏,筛选,图片)

8,449次阅读
没有评论

共计 3527 个字符,预计需要花费 9 分钟才能阅读完成。

使用 exceljs。文档:https://github.com/exceljs/exceljs/blob/HEAD/README_zh.md

参考:使用 exceljs 导出 luckysheet 表格_excel 转 luckysheet_lishy97 的博客 -CSDN 博客

存在一些问题,欢迎交流

function exportExcelFront(luckysheet, name, excelType) {
    // 1. 创建工作簿,可以为工作簿添加属性
    const workbook = new ExcelJS.Workbook()
    // 2. 创建表格,第二个参数可以配置创建什么样的工作表
    luckysheet.forEach(function (table) {
        // debugger
        if (table.data.length === 0) return true
        const worksheet = workbook.addWorksheet(table.name)
        const merge = (table.config && table.config.merge) || {}        // 合并单元格
        const borderInfo = (table.config && table.config.borderInfo) || {}      // 边框
        const columnWidth = (table.config && table.config.columnlen) || {}    // 列宽
        const rowHeight = (table.config && table.config.rowlen) || {}      // 行高
        const frozen = table.frozen || {}       // 冻结
        const rowhidden = (table.config && table.config.rowhidden) || {}    // 行隐藏
        const colhidden = (table.config && table.config.colhidden) || {}    // 列隐藏
        const filterSelect = table.filter_select || {}    // 筛选
        const images = table.images || {}   // 图片
        // console.log(table)
        const hide = table.hide;    // 工作表 sheet 1 隐藏
        if (hide === 1) {
            // 隐藏工作表
            worksheet.state = 'hidden';
        }
        setStyleAndValue(table.data, worksheet)
        setMerge(merge, worksheet)
        setBorder(borderInfo, worksheet)
        setImages(images, worksheet, workbook)
        setColumnWidth(columnWidth, worksheet)
        // 行高设置 50 导出后在 ms-excel 中打开显示 25,在 wps-excel 中打开显示 50 这个 bug 不会修复
        setRowHeight(rowHeight, worksheet, excelType)
        setFrozen(frozen, worksheet)
        setRowHidden(rowhidden, worksheet)
        setColHidden(colhidden, worksheet)
        setFilter(filterSelect, worksheet)
        return true
    })

    // 4. 写入 buffer
    const buffer = workbook.xlsx.writeBuffer().then(data => {const blob = new Blob([data], {type: 'application/vnd.ms-excel;charset=utf-8'})
        console.log("导出成功!")
        saveAs(blob, `${name}.xlsx`)
    })
    return buffer
}

/**
 * 列宽
 * @param columnWidth
 * @param worksheet
 */
var setColumnWidth = function (columnWidth, worksheet) {for (let key in columnWidth) {worksheet.getColumn(parseInt(key) + 1).width = columnWidth[key] / 7.5
    }
}

/**
 * 行高
 * @param rowHeight
 * @param worksheet
 * @param excelType
 */
var setRowHeight = function (rowHeight, worksheet, excelType) {
    // 导出的文件用 wps 打开和用 excel 打开显示的行高大一倍
    if (excelType == "wps") {for (let key in rowHeight) {worksheet.getRow(parseInt(key) + 1).height = rowHeight[key] * 0.75
        }
    }
    if (excelType == "office" || excelType == undefined) {for (let key in rowHeight) {worksheet.getRow(parseInt(key) + 1).height = rowHeight[key] * 1.5
        }
    }
}

/**
 * 合并单元格
 * @param luckyMerge
 * @param worksheet
 */
var setMerge = function (luckyMerge = {}, worksheet) {const mergearr = Object.values(luckyMerge)
    mergearr.forEach(function (elem) {// elem 格式:{r: 0, c: 0, rs: 1, cs: 2}
        // 按开始行,开始列,结束行,结束列合并(相当于 K10:M12)worksheet.mergeCells(
            elem.r + 1,
            elem.c + 1,
            elem.r + elem.rs,
            elem.c + elem.cs
        )
    })
}

/**
 * 设置边框
 * @param luckyBorderInfo
 * @param worksheet
 */
var setBorder = function (luckyBorderInfo, worksheet) {if (!Array.isArray(luckyBorderInfo)) return

    // 合并边框信息
    var mergeCellBorder = function (border1, border2) {if (undefined === border1 || Object.keys(border1).length === 0) return border2;
        return Object.assign({}, border1, border2)
    }

    // console.log('luckyBorderInfo', luckyBorderInfo)
    luckyBorderInfo.forEach(function (elem) {
        // 现在只兼容到 borderType 为 range 的情况
        // console.log('ele', elem)
        if (elem.rangeType === 'range') {let border = borderConvert(elem.borderType, elem.style, elem.color)
            let rang = elem.range[0]
            let row = rang.row
            let column = rang.column

            let rowBegin = row[0]
            let rowEnd = row[1]
            let colBegin = column[0]
            let colEnd = column[1]
            // 处理外边框的情况 没有直接对应的外边框 需要转换成上下左右
            if (border.all) {// 全部边框
                let b = border.all
                for (let i = row[0] + 1; i = 0) {s = String.fromCharCode((n % len) + ordA) + s

        n = Math.floor(n / len) - 1
    }
    return s
}

//rgb(255,255,255) 转 16 进制 #ffffff
function colorRGBtoHex(color) {color = color.replace("rgb", "").replace("(","").replace(")", "")
    var rgb = color.split(',');
    var r = parseInt(rgb[0]);
    var g = parseInt(rgb[1]);
    var b = parseInt(rgb[2]);
    return "#" + ((1 

原文地址: 使用 exceljs 导出 luckysheet 表格 (合并,边框,行高,列宽,冻结,行列隐藏,筛选,图片)

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-30发表,共计3527字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)