pikaz-excel-js 是项目中已经使用的 Excel
导入导出库。简单的配置一下表头、表格数据就可以完成表格的导出操作了,使用起来非常简单。文档也非常的简单明了,并且有提供简单的参考示例模板:
但是文档中关于单元格样式(cellStyle
)的说明就有点 “太简单” 了 👇
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
cellStyle |
单元格样式,每个单元格对象配置具体参数查看下方单元格样式 | object |
– | – |
cell |
单元格名称,支持 excel 单元格名称与数字行列格式,如 'A3' 或 '3-1' |
string |
– | – |
其他属性与表格全局样式设置方式一致
如果没有阅读示例代码,直接跳到文档中的这部分查看配置项就会有点不知道如何书写。
所以其实示例代码中已经有说明了关于单元格样式的配置:
excelExport({
// 表格数据
sheet: [
{
// 表名
sheetName: "水果的产量",
// 表格标题
title: "水果的产量",
// 表头
tHeader: ["季度", "月份", "名称", "A果园产量(万吨)", "B果园产量(万吨)", "总产量合计(万吨)"],
// 数据键名
keys: ["a", "b", "c", "d", "e", "f"],
// 合并项
merges: [ "1-3:1-5", "1-6:1-8", "1-9:1-11", "1-12:1-14", "1-15:3-15"],
// 表格数据
table: [
{ a: "第一季度", b: "一月", c: "番石榴", d: "2", e: "3", f: "5" },
{ a: "", b: "二月", c: "桑葚", d: "3", e: "3", f: "6" },
{ a: "", b: "三月", c: "樱桃", d: "2", e: "2", f: "4" },
],
// 表格全局样式
globalStyle: { font: { sz: 16 } },
// 单元格样式
cellStyle: [
{ cell: "1-1", fill: { fgColor: { rgb: "B0C4DE" } } },
{ cell: "1-3", fill: { fgColor: { rgb: "7FFFAA" } } },
{ cell: "1-6", fill: { fgColor: { rgb: "FFA500" } } },
{ cell: "1-9", fill: { fgColor: { rgb: "F4A460" } } },
{ cell: "1-12", fill: { fgColor: { rgb: "00BFFF" } } },
{ cell: "1-15", fill: { fgColor: { rgb: "C0C0C0" } } },
],
}
]
})
所以 cellStyle
属性就是一个对象数组,可配置的样式属性就是和全局样式是一致的。
但是我在项目中配置 cellStyle
的时候,控制台抛出了异常:
[Vue warn]: Error in v-on handler: "TypeError: N[t.cell] is undefined"
found in
---> <ExcelExport>
TypeError: N[t.cell] is undefined
exportExcel PikazJsExcel.umd.min.js:19
exportExcel PikazJsExcel.umd.min.js:19
exportExcel PikazJsExcel.umd.min.js:19
exportExcel PikazJsExcel.umd.min.js:19
click PikazJsExcel.umd.min.js:19
VueJS(5)
很明显单元格取值的时候出现错误了,因为我使用的是 v1.x
的支持的 cell
的数字行列名称写法: { cell: "1-1", fill: { fgColor: { rgb: "B0C4DE" } } }
,但是项目中使用的 pikaz-excel-js
的版本是 0.2.x
,并不支持 数字行列格式 (如 3-1
),仅支持 Excel单元格名称 (如 A3
)。
那么就需要去转换成Excel单元格名称了,但是我又不想自己写一个函数,就去看了一下 v1.x
版本内部是怎么处理的。很快就找到了 numToLetter
这个函数 👉 pikaz-excel-js/src/excelExport/index.js at master · pikaz-18/pikaz-excel-js
/**
* @description: 纯数字转换为excel格式行列合并项
* @param {*} num
* @return {*}
*/
const numToLetter = (merge = "1-1:2-1") => {
const mergeArr = merge.split(":").map(item => {
const [row, column] = item.split("-").map(s => Number(s))
const stringArray = [];
const numToLetters = (num) => {
const result = num - 1;
const first = parseInt(result / 26);
const second = result % 26;
stringArray.push(String.fromCharCode(64 + parseInt(second + 1)));
if (first > 0) {
numToLetters(first);
}
}
numToLetters(row);
return stringArray.reverse().join("") + column;
})
return mergeArr.join(":")
}
如果不想升级版本的话,直接复制过来使用就可以处理成期望的结果了。
numToLetter('33-1')
// => "AG1"