最近遇到一个需要:解析 excel 并获取单元格内的色彩。说起解析 excel,不得不提一下SheetJS js-xlsx , github上有22k多Star,性能非常弱小。

惋惜,他们是有个免费版的,解析单元格背景色彩的性能并不对我等白嫖用户凋谢。

在我坚定不移的面向程(gu)序(ge)编程下,终于让我发现一个能解决需要的node库 xlsx-populate

装置xlsx-populate

这个无需多言,关上终端间接输出命令就好

npm install xlsx-populate

开始应用

创立一个新的excel

const XlsxPopulate = require('xlsx-populate');XlsxPopulate.fromBlankAsync()    .then(workbook => {        workbook.sheet("Sheet1").cell("A1").value("This is neat!");        return workbook.toFileAsync("./out.xlsx");    });  

解析excel

const XlsxPopulate = require('xlsx-populate');XlsxPopulate.fromFileAsync("./Book1.xlsx")    .then(workbook => {        const value = workbook.sheet("Sheet1").cell("A1").value();        console.log(value);    });
下面只是惯例操作,上面来点不一样的

将单元格设置为富文本

const RichText = require('xlsx-Populate').RichText;const cell = workbook.sheet(0).cell('A1');cell.value(new RichText()); cell.value()    .add('hello ', { italic: true, bold: true })    .add('world!', { fontColor: 'FF0000' });

增加超链接

cell.value("Link Text")    .style({ fontColor: "0563c1", underline: true })    .hyperlink("http://example.com");

获取单元格背景

const XlsxPopulate = require('xlsx-populate');XlsxPopulate.fromFileAsync("./Book1.xlsx")    .then(workbook => {        const background = workbook.sheet("Sheet1").cell("A1").style("fill");        console.log(background);    });
其中style(value)可选的参数十分多 style参数 ,根本的款式都可能获取的到

应用分享

上面是我利用xlsx-populate解析excel的代码

XlsxPopulate.fromFileAsync(newPath)  .then(workbook => {    var sheet = workbook.sheet(0)    var rows = sheet._rows    let resultData = {        tableHead: [],        tableData: []    }    let tableId = []    rows.forEach(row => {      row._cells.forEach(cell => {        let col = cell.columnNumber()        let row = cell.rowNumber()        if(row == 1 && cell.value()){          let value = cell.value()          resultData.tableHead.push(value)        }        let backgroundCR = cell.columnName() + row        let background = workbook.sheet("Sheet1").cell(backgroundCR).style("fill")        let bg        if(background){          bg = background.color != undefined ? '#' + workbook.sheet("Sheet1").cell(backgroundCR).style("fill").color.rgb.substring(2) : null        }else{          bg = null        }        if(tableId.indexOf(row) == -1 && row != 1){          let resultDataItem = [{            columnNumber: col,            rowNumber: row,            background: bg,            value: cell.value() || "none"          }]          resultData.tableData.push(resultDataItem)          tableId.push(row)        }else if(tableId.indexOf(row) != -1 && row != 1){          let resultDataItem = {            columnNumber: col,            rowNumber: row,            background: bg,            value: cell.value() || "none"          }          resultData.tableData[row - 2].push(resultDataItem)        }      })    })  }).catch( error => {      console.log(error)  });