nodejs使用xlsx和xlsx-style导出Excel文件
生活随笔
收集整理的這篇文章主要介紹了
nodejs使用xlsx和xlsx-style导出Excel文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
nodejs 導(dǎo)出 Excel
安裝依賴
- npm install xlsx --save
- npm install xlsx-style --save
- npm install fs --save
修改文件
-
在導(dǎo)出 xlsx 文件中 表格展示內(nèi)容樣式錯誤 請修改下列文件部分內(nèi)容。
-
在 node_modules/xlsx-style下的xlsx.js文件中,把 write_ws_xml_data()替換成下列這個,導(dǎo)出excel沒有樣式,直接修改方法。
使用 導(dǎo)出Excel 功能
- ExcelData :[{},{},{}] —— 需要自定義單元格樣式 或者 合并單元 使用下列格式
let ExcelData = [{
value : String // 單元格內(nèi)容
style :Object //單元格樣式
colSpan : Number //以當(dāng)前單元格為起點(diǎn) 合并列的單元格
rowSpan : Number //以當(dāng)前單元格為起點(diǎn) 合并行的單元格
}]; - workSheet :需要自定義行高或者列表 合并單元等等
let workSheet = {
“!merges” : [ {
s: { //s為開始 c: 1,//開始列 r: 0//可以看成開始行,實(shí)際是取值范圍 },
e: { // e結(jié)束 c: 4,//結(jié)束列 r: 0//結(jié)束行 }
}],
“!cols” : [{wch:10},{wch:10}],
“!rows” : [{hpx:20},{hpx:20}],
};
功能實(shí)現(xiàn)詳細(xì)代碼
import * as xlsx from 'xlsx'; import * as XLSX_STYLE from 'xlsx-style'; import * as fs from 'fs';// 導(dǎo)出并生成Excel class ExportExcel {/*** 邊框樣式*/BorderStyle = {border: {color: {auto: 1},top: {style: 'thin'},bottom: {style: 'thin'},left: {style: 'thin'},right: {style: 'thin'}}};/** 默認(rèn)樣式 */defaultStyle = {...this.BorderStyle,alignment: {/// 自動換行wrapText: true,// 內(nèi)容在單元格 居中horizontal: "center",vertical: "center",},font: {name: "宋體",sz: 12, // 字體大小color: {auto: 1},bgColor : '#fff'},};/*** 默認(rèn)標(biāo)題樣式*/defaultTitleStyle = {...this.defaultStyle,font: {name: "宋體",sz: 12,color: {auto: 1},bold : true, // 字體加粗},};/*** 將對象數(shù)組按指定屬性順序轉(zhuǎn)為二維數(shù)組* @param objects 對象數(shù)組* @param props 對象的屬性列表,屬性可寫為數(shù)組,數(shù)組只包含兩個值,* 第一個值為對象屬性名,第二個值為過濾函數(shù)*/static objectsToRows(objects, props) {const rows = [];for (let i = 0; i < objects.length; i++) {const row = [];const item = objects[i];for (const key of props) {if (key instanceof Array) {row.push(key[1](item[key[0]]));} else {row.push(item[key]);}}rows.push(row);}return rows;}/*** 設(shè)置顯示數(shù)據(jù)樣式顯示* @param RowData 數(shù)據(jù)* @param isBold 顯示內(nèi)容是否加粗* @returns {*}*/setRowData(RowData = [],isBold = false,index = 0){for (let i = 0; i < RowData.length; i++) {if(RowData[i] instanceof Array){this.setRowData(RowData[i],isBold,(i + index));}else if(RowData[i] instanceof Object){if(!this.merges){this.merges = [];}let {value = '', style = {}, colSpan = 0, rowSpan = 0} = RowData[i];RowData[i] = {v: value, s: {...this.defaultStyle, ...style}};if(rowSpan > 0){this.merges.push({s: {c: i,r: index},e: {c: i,r: (index + rowSpan) }})}if(rowSpan === 0 && colSpan > 0){this.merges.push({s: {c: i,r: index},e: {c: (colSpan + i),r: index }})}}else {if(isBold){RowData[i] = {v: RowData[i] || '', s: this.defaultTitleStyle};}else {RowData[i] = {v: RowData[i] || '', s: this.defaultStyle};}}}return RowData;}/** * ExcelData = [{value : String 單元格內(nèi)容style :Object 單元格樣式colSpan : Number 以當(dāng)前單元格為起點(diǎn) 合并列的單元格rowSpan : Number 以當(dāng)前單元格為起點(diǎn) 合并行的單元格}]workSheet = {"!merges" : [ {s: { //s為開始 c: 1,//開始列 r: 0//可以看成開始行,實(shí)際是取值范圍 },e: { // e結(jié)束 c: 4,//結(jié)束列 r: 0//結(jié)束行 }}];}*/createSheet = async ({ExcelHeaders = [], ExcelData = [] , workSheet = {}}) => {const data = [];if(ExcelHeaders.length){const headers = await this.setRowData(ExcelHeaders, true );data.push(headers);}// 表格數(shù)據(jù)內(nèi)容let rowData = await this.setRowData(ExcelData, false, data.length );data.push(...rowData);let sheet = xlsx.utils.aoa_to_sheet(data, {cellDates: true, cellStyles: true});// 表單合并情況sheet["!merges"] = this.merges || [];// 表格每列顯示的列寬let cols = [];if(workSheet['cols']){for(let i = 0; i < workSheet['cols'].length; i++){cols.push({wch: workSheet['cols'][i] || 10})}workSheet['!cols'] = cols;}else {for(let i = 0; i < ExcelHeaders.length; i++){cols.push({wch: ExcelHeaders[i] || 10})}}sheet["!cols"] = cols;// 表格顯示 行高let rows = [];if(ExcelHeaders.length) {rows.push({hpx: 30});}for(let i = 0; i < ExcelData.length; i++){rows.push({hpx: 24})}sheet['!rows'] = rows;return {...sheet, ...workSheet};};/*** 創(chuàng)建 Excel 工作簿* @param data Array 可創(chuàng)建一個或者多個 sheet* @returns {Promise<*>}*/createWorkBook = async (data = []) => {// 創(chuàng)建一個工作簿const workBook = xlsx.utils.book_new();for(let i = 0; i < data.length; i++){let sheet = await this.createSheet(data[i]);if(sheet){let sheetName = `sheet${i}`;if(data[i].sheetName){sheetName = data[i].sheetName;}xlsx.utils.book_append_sheet(workBook, sheet, sheetName);}}// 返回寫入數(shù)據(jù) bufferreturn XLSX_STYLE.write(workBook, {type: 'buffer'});};}export {ExportExcel};總結(jié)
以上是生活随笔為你收集整理的nodejs使用xlsx和xlsx-style导出Excel文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# object 类型
- 下一篇: 十分钟深入理解const用法(趣味故事)