共计 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 表格 (合并,边框,行高,列宽,冻结,行列隐藏,筛选,图片)
正文完