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

我应该如何将条件格式添加到我在Node.js中生成的Excel文件中的某些列? 当我像这个答案添加到工作表的XML我在Excel中得到错误,认为文件打开。 我在Node.js中使用xlsx生成文件,所以Excel文件看起来像这样:

  • Sample.xlsx
    • [CONTENT_TYPES] .XML
    • XL
      • _rels
      • sharedString.xml
      • styles.xml
      • 主题
      • workbook.xml
      • 工作表
        • sheet1.xml

我写我的条件格式到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中的列,所以我分享我的解决scheme。 这段代码读取由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'); }); }); });