繁体   English   中英

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

[英]How to add conditional formatting to an Excel file in Javascript?

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

  • Sample.xlsx
    • [Content_Types] .xml
    • ...
    • l
      • _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中的列添加条件格式,以便共享我的解决方案。 此代码读取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');
                });
        });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM