如何将条件格式添加到 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 文件在内部看起来像这样:
- 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 中的列添加条件格式,所以我正在分享我的解决方案。此代码读取由 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)>' +
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');
});
});
});
我应该如何将条件格式添加到我在 Node.js 中生成的 Excel 文件中的某些列?当我将 xml 添加到 Node.js 中的 answer I get errors in Excel, thought the file opens. I generate the file using 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 中的列添加条件格式,所以我正在分享我的解决方案。此代码读取由 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)>' +
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');
});
});
});