关于node.js:xlsxpopulate-花式解析excel

最近遇到一个需要:解析 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)
  });

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理