如何将条件格式添加到 Javascript 中的 Excel 文件?

How to add conditional formatting to an Excel file in Javascript?

我应该如何将条件格式添加到我在 Node.js 中生成的 Excel 文件中的某些列?当我将 xml 添加到 Node.js 中的 answer I get errors in Excel, thought the file opens. I generate the file using xlsx 工作表时,Excel 文件在内部看起来像这样:

我将条件格式写入 sheet1.xml,这是执行此操作的代码:

var fs = require("fs");
var jszip = require("jszip");
var CONDITIONAL_FORMATTING = '<conditionalFormatting sqref="A1">' +
  '<cfRule type="expression" dxfId="0" priority="1"><formula>LEN(A1)&' +
  'gt;2</formula></cfRule></conditionalFormatting>';
var WORKSHEET1 = 'xl/worksheets/sheet1.xml';

fs.readFile("excel/rewrite.xlsx", function(err, data) {
    jszip.loadAsync(data).
        then(function(zip) {
            rezip = zip;
            return zip.file(WORKSHEET1).async("string");
        }).then(function (worksheet) {
            var pos = worksheet.indexOf('<pageMargins');
            if(pos > 0) {
                worksheet = worksheet.substring(0,pos) +
                  CONDITIONAL_FORMATTING + worksheet.substring(pos);
            } 
            rezip.file(WORKSHEET1,worksheet);
            rezip.generateNodeStream({type:'nodebuffer',streamFiles:true})
                .pipe(fs.createWriteStream('out.xlsx'))
                .on('finish', function () {
                    console.log('done');    
                });
        });
});

我想出了如何向 Excel 中的列添加条件格式,所以我正在分享我的解决方案。此代码读取由 xlsx 生成的 Excel 文件并向 A 列和 C 列添加条件格式。诀窍是 styles.xml 和 sheet1.xml 都需要修改,以便条件格式具有要应用的样式。

var fs = require("fs");
var jszip = require("jszip");
var WORKSHEET1 = 'xl/worksheets/sheet1.xml';
var STYLES = 'xl/styles.xml';
var STYLE_WITHOUT_CONDITIONAL_FORMATTING = '<dxfs count="0"/>';
var STYLE_WITH_CONDITIONAL_FORMATTING = '<dxfs count="1"><dxf><font>' + 
   '<color rgb="FF9C0006"/></font><fill><patternFill>' +
   '<bgColor rgb="FFFFC7CE"/></patternFill></fill></dxf></dxfs>';
var zip;

function buildConditionalFormulas(worksheet,columnFormats) {
    var conditionalFormatting = '';
    var i;
    for(i = 0; i < columnFormats.length; i++) {
        conditionalFormatting += '<conditionalFormatting sqref="' + columnFormats[i].column +
            '1:' + columnFormats[i].column + '200"><cfRule type="expression" dxfId="0" ' +
            ' priority="1"><formula>LEN(' + columnFormats[i].column + '1)&gt;' +
            columnFormats[i].maximum + '</formula></cfRule></conditionalFormatting>';
    }
    conditionalFormatting += '<pageMargins';
    return worksheet.replace('<pageMargins',conditionalFormatting);
}

fs.readFile("excel/rewrite.xlsx", function(err, data) {
    jszip.loadAsync(data).
        then(function(ziper) {
            zip = ziper;
            return zip.file(WORKSHEET1).async("string");
        }).then(function (worksheet) {
            worksheet = buildConditionalFormulas(worksheet,[{column:'A',maximum:5},{column:'C',maximum:10}]);
            zip.file(WORKSHEET1,worksheet);
            return zip.file(STYLES).async("string");
        }).then(function (styles) {
            styles = styles.replace(STYLE_WITHOUT_CONDITIONAL_FORMATTING,STYLE_WITH_CONDITIONAL_FORMATTING);
            zip.file(STYLES,styles);
            zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
                .pipe(fs.createWriteStream('out.xlsx'))
                .on('finish', function () {
                    console.log('done');
                });
        });
});