Node.js 如何快速导出嵌套列(多表头)的excel文件。效果图如下:
1:使用 @zurmokeeper/exceljs, V4.4.1以上 安装:
npm i @zurmokeeper/exceljs
2: 有一个 worksheet.makeColumns 方法,API文档: 代码示例:
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('Sheet1', {
views: [{state: 'frozen', xSplit: 0, ySplit: 2}], // 冻结第1行和第二行
});
// 设置多级表头
worksheet.makeColumns([
{
id: 1,
title: '姓名',
},
{id: 2, title: 'Qwe'},
{id: 3, title: 'Foo'},
{
id: 4,
title: '基础信息',
children: [
{id: 41, title: 'Zoo 1'},
{id: 42, title: 'Zoo 2'},
{id: 44, title: 'Zoo 3'},
],
},
{
id: 5,
title: 'Zoo1',
children: [
{id: 51, title: 'Zoo 51'},
{id: 52, title: 'Zoo 52'},
{id: 54, title: 'Zoo 53'},
],
},
{id: 6, title: 'Foo123213'},
]);
const data = [
[1, 2, 3, null, null, 'DOB'],
[1, 'electron', 'DOB'],
[1, 'electron', 'DOB'],
[1, 'electron', 'DOB'],
[1, 'electron', 'DOB'],
[1, 'electron', 'DOB'],
[1, 'electron', 'DOB'],
[1, 'electron', 'DOB'],
];
worksheet.addRows(data);
worksheet.columns.forEach(function(column) {
column.alignment = {horizontal: 'center', vertical: 'middle'};
});
await workbook.xlsx.writeFile(test);
})()" title="" data-bs-original-title="复制" aria-label="复制"></button>
</div>
const ExcelJS = require('@zurmokeeper/exceljs');
(async ()=>{
const test = 'test.xlsx';
<span class="hljs-keyword">const</span> <span class="hljs-variable constant_">workbook</span> = <span class="hljs-keyword">new</span> ExcelJS.<span class="hljs-title function_ invoke__">Workbook</span>();
<span class="hljs-keyword">const</span> <span class="hljs-variable constant_">worksheet</span> = workbook.<span class="hljs-title function_ invoke__">addWorksheet</span>(<span class="hljs-string">'Sheet1'</span>, {
<span class="hljs-attr">views</span>: [{<span class="hljs-attr">state</span>: <span class="hljs-string">'frozen'</span>, <span class="hljs-attr">xSplit</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">ySplit</span>: <span class="hljs-number">2</span>}], // 冻结第<span class="hljs-number">1</span>行和第二行
});
<span class="hljs-comment">// 设置多级表头</span>
worksheet.<span class="hljs-title function_ invoke__">makeColumns</span>([
{
<span class="hljs-attr">id</span>: <span class="hljs-number">1</span>,
<span class="hljs-attr">title</span>: <span class="hljs-string">'姓名'</span>,
},
{<span class="hljs-attr">id</span>: <span class="hljs-number">2</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Qwe'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-number">3</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Foo'</span>},
{
<span class="hljs-attr">id</span>: <span class="hljs-number">4</span>,
<span class="hljs-attr">title</span>: <span class="hljs-string">'基础信息'</span>,
<span class="hljs-attr">children</span>: [
{<span class="hljs-attr">id</span>: <span class="hljs-number">41</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Zoo 1'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-number">42</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Zoo 2'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-number">44</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Zoo 3'</span>},
],
},
{
<span class="hljs-attr">id</span>: <span class="hljs-number">5</span>,
<span class="hljs-attr">title</span>: <span class="hljs-string">'Zoo1'</span>,
<span class="hljs-attr">children</span>: [
{<span class="hljs-attr">id</span>: <span class="hljs-number">51</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Zoo 51'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-number">52</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Zoo 52'</span>},
{<span class="hljs-attr">id</span>: <span class="hljs-number">54</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Zoo 53'</span>},
],
},
{<span class="hljs-attr">id</span>: <span class="hljs-number">6</span>, <span class="hljs-attr">title</span>: <span class="hljs-string">'Foo123213'</span>},
]);
<span class="hljs-keyword">const</span> <span class="hljs-variable constant_">data</span> = [
[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-literal">null</span>, <span class="hljs-literal">null</span>, <span class="hljs-string">'DOB'</span>],
[<span class="hljs-number">1</span>, <span class="hljs-string">'electron'</span>, <span class="hljs-string">'DOB'</span>],
[<span class="hljs-number">1</span>, <span class="hljs-string">'electron'</span>, <span class="hljs-string">'DOB'</span>],
[<span class="hljs-number">1</span>, <span class="hljs-string">'electron'</span>, <span class="hljs-string">'DOB'</span>],
[<span class="hljs-number">1</span>, <span class="hljs-string">'electron'</span>, <span class="hljs-string">'DOB'</span>],
[<span class="hljs-number">1</span>, <span class="hljs-string">'electron'</span>, <span class="hljs-string">'DOB'</span>],
[<span class="hljs-number">1</span>, <span class="hljs-string">'electron'</span>, <span class="hljs-string">'DOB'</span>],
[<span class="hljs-number">1</span>, <span class="hljs-string">'electron'</span>, <span class="hljs-string">'DOB'</span>],
];
worksheet.<span class="hljs-title function_ invoke__">addRows</span>(data);
worksheet.columns.<span class="hljs-title function_ invoke__">forEach</span>(function(column) {
column.alignment = {horizontal: <span class="hljs-string">'center'</span>, vertical: <span class="hljs-string">'middle'</span>};
});
await workbook.xlsx.<span class="hljs-title function_ invoke__">writeFile</span>(test);
})()</pre>