超有趣的JS

使用xlsx-populate导出excel

2019-07-16  本文已影响25人  Nanayai

毕竟几人真得鹿,不知终日梦为鱼

简单的导出excel并不需要额外的库,但是最近在做数据汇总分析的时候,客户想要导出这样的表:

这是一张调查问卷回收以后,做个简单的频率分析,每一道题是一个table;

还有这样的:

这两张属于交叉分析,是指不同的题目之间进行运算,以上是两种模式,在这里就不细说了.

为了实现上面的需求,我先找了比较流行的SheetJS / js-xlsx;官网是sheetjs.com ;但是很快就发现社区版不支持添加样式,虽然有protobi / js-xlsxxSirrioNx / js-xlsx 这样的可添加样式增强版,但是组织数据的格式麻烦的让人发指,还好最后找到了适合我的库:xlsx-populate :

Excel XLSX parser/generator written in JavaScript with Node.js and browser support, jQuery/d3-style method chaining, encryption, and a focus on keeping existing workbook features and styles in tact.

翻看它的文档你可以清楚地发现,这个库提供sheet,单元格(cell),范围(range),行和列等对象,可以方便快捷的组织你的excel;使用方法也很简单, sheet.cell("A1").value().style() 链式调用,可以设置值和样式,sheet.range("A1:C3").merged(true) 可以合并单元格,文档上很清楚了我就不再赘述了,你可以在以下关键词中寻找你所需要的:

var Promise = XlsxPopulate.Promise;
var name = "问卷分析";

XlsxPopulate.fromBlankAsync()
    .then(function (workbook) {
    //处理数据和导出样式
    var sheet = workbook.sheet(0);
    sheet.column("A").width(35).style({
        wrapText: true
    });
    sheet.column("B").width(18).style({
        wrapText: true,
        numberFormat: "0.00"
    });
    sheet.cell("A1").value([1,2,3]).style({leftBorder: "thick", rightBorder: "thick" })
    //处理完毕
    return workbook.outputAsync({
        type: ""
    });
}).then(function (blob) {
    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(blob, name + ".xlsx");
    } else {
        var url = window.URL.createObjectURL(blob);
        var a = document.createElement("a");
        document.body.appendChild(a);
        a.href = url;
        a.download = name + ".xlsx";
        a.click();
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);
    }
}).catch (function (err) {
    alert(err.message || err);
    throw err;
});

Tips:若想实现这种指定位置换行效果,需要先设置单元格自动换行,再在字符串中添加\n即可:

XlsxPopulate.fromBlankAsync()
    .then(workbook => {
      // Modify the workbook.
      workbook.sheet("Sheet1").column("A").width(100)
      workbook.sheet("Sheet1").row(1).height(100)
      workbook.sheet("Sheet1").cell("A1").value("AAAAAA\nBBBBBB\nCCCCCC\nDDDDDD")
      .style("verticalAlignment", "center")//居中
      .style("horizontalAlignment", "center")//居中
      .style("wrapText", true)//自动换行

      // Write to file.
      return workbook.toFileAsync("./gn/xlsx.xlsx");
    });
上一篇下一篇

猜你喜欢

热点阅读