exceljs中文文档

您所在的位置:网站首页 删除大纲excel exceljs中文文档

exceljs中文文档

2023-10-16 10:37| 来源: 网络整理| 查看: 265

ExcelJS

构建状态 代码质量:Javascript 警报总数

读取、操作电子表格数据和样式并将其写入 XLSX 和 JSON。

作为项目从 Excel 电子表格文件逆向工程。

翻译 中文文档 安装 npm install exceljs 新特性! 合并添加工作簿属性的 TS 声明 #1656。非常感谢Tanawit Kritwongwiman的贡献。 合并修复问题 #178 #201。非常感谢Vasiliy Stavenko的贡献。 合并文档:添加实体图案使用示例 #1649。非常感谢fpaupier的贡献。 合并为 lastColumn 属性添加类型定义(修复 #1453)#1629。修复了 worsheet.lastcolumn #1453 属性的添加类型。非常感谢Daniel Gonçalves的贡献。 合并修复 #1598 lint 违规 #1599。修复[BUG] npm run lint 报告多次违规 #1598。非常感谢Ilya I的贡献。 合并更新 @types/node 版本到最新的 lts #1133。修复了 node_modules/exceljs/index.d.ts(1648,34) 中的错误:错误 TS2503:找不到命名空间“NodeJS”。#971 和node_modules/exceljs/index.d.ts(1661,34) 中的错误:错误 TS2503:找不到命名空间“NodeJS”。#997。非常感谢Siemienik Pawel的贡献。 将Node v16 添加到测试套件 #1731 中。非常感谢Alex Bjørlig的贡献。 合并自述文件到 dayjs #1708。非常感谢Jerebtw的贡献。 合并能够为超链接 #602 设置工具提示。非常感谢Aleksey Kuznetsov的贡献。 合并固定条件格式损坏工作表 #1305 #1574。修复了[BUG] 在使用条件格式保存文件后在 Excel 中打开文件时出现的错误 #1305。非常感谢Rolando Romero的贡献。 图像的 合并改进(正确的读/写位置)#702。非常感谢Siemienik Pawel的贡献。 贡献

非常欢迎投稿!它帮助我了解需要哪些功能或哪些错误导致最痛苦。

我只有一个请求;如果您提交了一个修复错误的拉取请求,请添加一个单元测试或集成测试(在规范文件夹中)来捕捉问题。即使只是测试失败的 PR 也很好——我可以分析测试正在做什么并从中修复代码。

注意:请尽量避免在 PR 中修改包版本。版本在发布时更新,任何更改很可能会导致合并冲突。

需要明确的是,添加到该库的所有贡献都将包含在该库的 MIT 许可证中。

内容 输入 界面 创建工作簿 设置工作簿属性 工作簿视图 添加工作表 删除工作表 访问工作表 工作表状态 工作表属性 页面设置 页眉和页脚 工作表视图 冻结视图 拆分视图 自动过滤器 列 行 添加行 处理单个细胞 合并单元格 插入行 拼接 重复行 定义的名称 数据验证 单元格注释 表 样式 数字格式 字体 结盟 边框 填充 富文本 条件格式 大纲级别 图片 板材保护 文件输入/输出 XLSX 阅读 XLSX 写 XLSX CSV文件 读取CSV 写入 CSV 流输入/输出 流媒体 XLSX 浏览器 值类型 空值 合并单元格 数值 字符串值 日期值 超链接值 公式值 共享公式 公式类型 数组公式 富文本值 布尔值 错误值 配置 已知的问题 发布历史 输入⬆ const ExcelJS = require('exceljs'); ES5 导入⬆

要使用 ES5 转译的代码,例如对于 10 之前的 node.js 版本,请使用 dist/es5 路径。

const ExcelJS = require('exceljs/dist/es5');

注意: ES5 构建对许多 exceljs 不再显式添加的 polyfill 具有隐式依赖关系。您需要在依赖项中添加“core-js”和“regenerator-runtime”,并在导入 exceljs 之前在代码中包含以下要求:

// polyfills required by exceljs require('core-js/modules/es.promise'); require('core-js/modules/es.string.includes'); require('core-js/modules/es.object.assign'); require('core-js/modules/es.object.keys'); require('core-js/modules/es.symbol'); require('core-js/modules/es.symbol.async-iterator'); require('regenerator-runtime/runtime'); const ExcelJS = require('exceljs/dist/es5');

对于 IE 11,您还需要一个 polyfill 来支持 unicode regex 模式。例如,

const rewritePattern = require('regexpu-core'); const {generateRegexpuOptions} = require('@babel/helper-create-regexp-features-plugin/lib/util'); const {RegExp} = global; try { new RegExp('a', 'u'); } catch (err) { global.RegExp = function(pattern, flags) { if (flags && flags.includes('u')) { return new RegExp(rewritePattern(pattern, flags, generateRegexpuOptions({flags, pattern}))); } return new RegExp(pattern, flags); }; global.RegExp.prototype = RegExp; } 浏览器化⬆

ExcelJS 在 dist/ 文件夹中发布了两个浏览器化的包:

一种对 core-js polyfills 的隐式依赖…

还有一个没有…

界面⬆ 创建工作簿⬆ const workbook = new ExcelJS.Workbook(); 设置工作簿属性⬆ workbook.creator = 'Me'; workbook.lastModifiedBy = 'Her'; workbook.created = new Date(1985, 8, 30); workbook.modified = new Date(); workbook.lastPrinted = new Date(2016, 9, 27); // Set workbook dates to 1904 date system workbook.properties.date1904 = true; 设置计算属性⬆ // Force workbook calculation on load workbook.calcProperties.fullCalcOnLoad = true; 工作簿视图⬆

工作簿视图控制在查看工作簿时 Excel 将打开多少个单独的窗口。

workbook.views = [ { x: 0, y: 0, width: 10000, height: 20000, firstSheet: 0, activeTab: 1, visibility: 'visible' } ] 添加工作表⬆ const sheet = workbook.addWorksheet('My Sheet');

使用 addWorksheet 函数的第二个参数来指定工作表的选项。

例如:

// create a sheet with red tab colour const sheet = workbook.addWorksheet('My Sheet', {properties:{tabColor:{argb:'FFC0000'}}}); // create a sheet where the grid lines are hidden const sheet = workbook.addWorksheet('My Sheet', {views: [{showGridLines: false}]}); // create a sheet with the first row and column frozen const sheet = workbook.addWorksheet('My Sheet', {views:[{state: 'frozen', xSplit: 1, ySplit:1}]}); // Create worksheets with headers and footers const sheet = workbook.addWorksheet('My Sheet', { headerFooter:{firstHeader: "Hello Exceljs", firstFooter: "Hello World"} }); // create new sheet with pageSetup settings for A4 - landscape const worksheet = workbook.addWorksheet('My Sheet', { pageSetup:{paperSize: 9, orientation:'landscape'} }); 删除工作表⬆

使用工作id表从工作簿中删除工作表。

例如:

// Create a worksheet const sheet = workbook.addWorksheet('My Sheet'); // Remove the worksheet using worksheet id workbook.removeWorksheet(sheet.id) 访问工作表⬆ // Iterate over all sheets // Note: workbook.worksheets.forEach will still work but this is better workbook.eachSheet(function(worksheet, sheetId) { // ... }); // fetch sheet by name const worksheet = workbook.getWorksheet('My Sheet'); // fetch sheet by id // INFO: Be careful when using it! // It tries to access to `worksheet.id` field. Sometimes (really very often) workbook has worksheets with id not starting from 1. // For instance It happens when any worksheet has been deleted. // It's much more safety when you assume that ids are random. And stop to use this function. // If you need to access all worksheets in a loop please look to the next example. const worksheet = workbook.getWorksheet(1); // access by `worksheets` array: workbook.worksheets[0]; //the first one;

重要的是要知道这是重要的workbook.getWorksheet(1) != Workbook.worksheets[0]和workbook.getWorksheet(1) != Workbook.worksheets[1],becouseworkbook.worksheets[0].id可有任何价值。

工作表状态⬆ // make worksheet visible worksheet.state = 'visible'; // make worksheet hidden worksheet.state = 'hidden'; // make worksheet hidden from 'hide/unhide' dialog worksheet.state = 'veryHidden'; 工作表属性⬆

工作表支持属性桶以允许控制工作表的某些功能。

// create new sheet with properties const worksheet = workbook.addWorksheet('sheet', {properties:{tabColor:{argb:'FF00FF00'}}}); // create a new sheet writer with properties const worksheetWriter = workbookWriter.addWorksheet('sheet', {properties:{outlineLevelCol:1}}); // adjust properties afterwards (not supported by worksheet-writer) worksheet.properties.outlineLevelCol = 2; worksheet.properties.defaultRowHeight = 15;

支持的属性

名称 默认 描述 选项卡颜色 不明确的 选项卡的颜色 大纲水平列 0 工作表列大纲级别 大纲水平行 0 工作表行大纲级别 默认行高度 15 默认行高 默认列宽 (选修的) 默认列宽 血统 55 待定 工作表指标⬆

工作表中添加了一些新指标…

名称 描述 行数 文档的总行大小。等于具有值的最后一行的行号。 实际行数 具有值的行数的计数。如果中间文档行为空,则不会包括在计数中。 列数 文档的总列大小。等于所有行的最大单元格数 实际列数 具有值的列数的计数。 页面设置⬆

可以影响工作表打印的所有属性都保存在工作表上的 pageSetup 对象中。

// create new sheet with pageSetup settings for A4 - landscape const worksheet = workbook.addWorksheet('sheet', { pageSetup:{paperSize: 9, orientation:'landscape'} }); // create a new sheet writer with pageSetup settings for fit-to-page const worksheetWriter = workbookWriter.addWorksheet('sheet', { pageSetup:{fitToPage: true, fitToHeight: 5, fitToWidth: 7} }); // adjust pageSetup settings afterwards worksheet.pageSetup.margins = { left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3 }; // Set Print Area for a sheet worksheet.pageSetup.printArea = 'A1:G20'; // Set multiple Print Areas by separating print areas with '&&' worksheet.pageSetup.printArea = 'A1:G10&&A11:G20'; // Repeat specific rows on every printed page worksheet.pageSetup.printTitlesRow = '1:3'; // Repeat specific columns on every printed page worksheet.pageSetup.printTitlesColumn = 'A:C';

支持的页面设置设置

名称 默认 描述 边距 页面边框上的空白。单位是英寸。 方向 ‘肖像’ 页面方向 – 即更高(纵向)或更宽(横向) 水平Dpi 4294967295 每英寸水平点数。默认值为 -1 垂直Dpi 4294967295 每英寸垂直点数。默认值为 -1 适合页面 是否使用 fitToWidth 和 fitToHeight 或比例设置。默认值基于 pageSetup 对象中这些设置的存在 – 如果两者都存在,则缩放获胜(即默认值为 false) 页面顺序 ‘downThenOver’ 打印页面的顺序 – [‘downThenOver’, ‘overThenDown’] 之一 黑和白 错误的 无色打印 草稿 错误的 打印质量较差(和墨水) 细胞评论 ‘没有任何’ 在哪里放置评论 – [‘atEnd’, ‘asDisplayed’, ‘None’] 之一 错误 ‘显示’ 在哪里显示错误 – [‘dash’, ‘blank’, ‘NA’, ‘displayed’] 之一 规模 100 增加或减少打印尺寸的百分比值。当 fitToPage 为 false 时激活 适合宽度 1 纸张应该打印到多少页宽。当 fitToPage 为真时激活 适合高度 1 纸张应该打印到多少页高。当 fitToPage 为真时激活 纸张大小 使用什么尺寸的纸张(见下文) 显示行列头 错误的 是否显示行号和列字母 显示网格线 错误的 是否显示网格线 第一个页码 第一页使用哪个数字 水平居中 错误的 是否将工作表数据水平居中 垂直居中 错误的 是否垂直居中表格数据

示例纸张尺寸

名称 价值 信 不明确的 合法的 5 管理人员 7 A3 8 A4 9 A5 11 B5 (JIS) 13 信封 #10 20 信封 DL 27 信封 C5 28 信封 B5 34 信封君主 37 双面日本明信片旋转 82 16K 197×273 毫米 119 页眉和页脚⬆

这是添加页眉和页脚的方法。添加的内容主要是文字,如时间、简介、文件信息等,可以设置文字的样式。此外,您可以为第一页和偶数页设置不同的文本。

注意:当前不支持图像。

// Create worksheets with headers and footers var sheet = workbook.addWorksheet('sheet', { headerFooter:{firstHeader: "Hello Exceljs", firstFooter: "Hello World"} }); // Create worksheets with headers and footers var worksheetWriter = workbookWriter.addWorksheet('sheet', { headerFooter:{firstHeader: "Hello Exceljs", firstFooter: "Hello World"} }); // Set footer (default centered), result: "Page 2 of 16" worksheet.headerFooter.oddFooter = "Page &P of &N"; // Set the footer (default centered) to bold, resulting in: "Page 2 of 16" worksheet.headerFooter.oddFooter = "Page &P of &N"; // Set the left footer to 18px and italicize. Result: "Page 2 of 16" worksheet.headerFooter.oddFooter = "&LPage &P of &N"; // Set the middle header to gray Aril, the result: "52 exceljs" worksheet.headerFooter.oddHeader = "&C&KCCCCCC&\"Aril\"52 exceljs"; // Set the left, center, and right text of the footer. Result: “Exceljs” in the footer left. “demo.xlsx” in the footer center. “Page 2” in the footer right worksheet.headerFooter.oddFooter = "&Lexceljs&C&F&RPage &P"; // Add different header & footer for the first page worksheet.headerFooter.differentFirst = true; worksheet.headerFooter.firstHeader = "Hello Exceljs"; worksheet.headerFooter.firstFooter = "Hello World"

支持的页眉页脚设置

名称 默认 描述 不同的第一 错误的 将 differentFirst 的值设置为 true,表示第一页的页眉/页脚与其他页面不同 异奇偶 错误的 将 differentOddEven 的值设置为 true,表示奇偶页的页眉/页脚不同 奇数标题 空值 为奇数(默认)页面设置标题字符串,可以格式化字符串 奇怪的页脚 空值 为奇数(默认)页面设置页脚字符串,可以格式化字符串 偶数标题 空值 为偶数页设置标题字符串,可以格式化字符串 甚至页脚 空值 为偶数页设置页脚字符串,可以格式化字符串 第一个标题 空值 为第一页设置标题字符串,可以格式化字符串 第一个页脚 空值 为第一页设置页脚字符串,可以格式化字符串

脚本命令

命令 描述 &L 将位置设置为左侧 &C 将位置设置为中心 &R 将位置设置为右侧 &P 当前页码 &N 总页数 &D 当前日期 &T 当前时间 &G 照片 &一个 工作表名称 &F 文件名 &B 使文本加粗 &一世 斜体文本 &U 下划线文字 &”字体名称” 字体名称,例如 &”Aril” &字体大小 字体大小,例如 12 &KHEX代码 字体颜色,例如 &KCCCCCC 工作表视图⬆

工作表现在支持视图列表,控制 Excel 如何呈现工作表:

冻结 – 顶部和左侧的许多行和列被冻结到位。只有右下部分会滚动 split – 视图被分成 4 个部分,每个部分都可以半独立地滚动。

每个视图还支持各种属性:

名称 默认 描述 状态 ‘普通的’ 控制视图状态 – 正常、冻结或拆分之一 右到左 错误的 将工作表视图的方向设置为从右到左 活动单元格 不明确的 当前选中的单元格 显示标尺 真的 在页面布局中显示或隐藏标尺 显示行列头 真的 显示或隐藏行和列标题(例如顶部的 A1、B1 和左侧的 1、2、3 显示网格线 真的 显示或隐藏网格线(为未定义边框的单元格显示) 缩放比例 100 用于视图的百分比缩放 zoomScaleNormal 100 视图的正常缩放 风格 不明确的 演示样式 – pageBreakPreview 或 pageLayout 之一。注意 pageLayout 与冻结视图不兼容 冻结视图⬆

冻结视图支持以下额外属性:

名称 默认 描述 拆分 0 要冻结多少列。要仅冻结行,请将其设置为 0 或未定义 y拆分 0 要冻结多少行。要仅冻结列,请将其设置为 0 或未定义 左上角单元格 特别的 哪个单元格将位于右下窗格中的左上角。注意:不能是冷冻细胞。默认为第一个解冻单元格 worksheet.views = [ {state: 'frozen', xSplit: 2, ySplit: 3, topLeftCell: 'G10', activeCell: 'A1'} ]; 拆分视图⬆

拆分视图支持以下额外属性:

名称 默认 描述 拆分 0 从左边开始放置拆分器的点数。要垂直拆分,请将其设置为 0 或未定义 y拆分 0 从顶部到放置拆分器的点数。要水平拆分,请将其设置为 0 或未定义 左上角单元格 不明确的 哪个单元格将位于右下窗格中的左上角。 活动窗格 不明确的 哪个窗格将处于活动状态 – topLeft、topRight、bottomLeft 和 bottomRight 之一 worksheet.views = [ {state: 'split', xSplit: 2000, ySplit: 3000, topLeftCell: 'G10', activeCell: 'A1'} ]; 自动过滤器⬆

可以对您的工作表应用自动过滤器。

worksheet.autoFilter = 'A1:C1';

虽然范围字符串是自动过滤器的标准形式,但工作表还将支持以下值:

// Set an auto filter from A1 to C1 worksheet.autoFilter = { from: 'A1', to: 'C1', } // Set an auto filter from the cell in row 3 and column 1 // to the cell in row 5 and column 12 worksheet.autoFilter = { from: { row: 3, column: 1 }, to: { row: 5, column: 12 } } // Set an auto filter from D3 to the // cell in row 7 and column 5 worksheet.autoFilter = { from: 'D3', to: { row: 7, column: 5 } } 列⬆ // Add column headers and define column keys and widths // Note: these column structures are a workbook-building convenience only, // apart from the column width, they will not be fully persisted. worksheet.columns = [ { header: 'Id', key: 'id', width: 10 }, { header: 'Name', key: 'name', width: 32 }, { header: 'D.O.B.', key: 'DOB', width: 10, outlineLevel: 1 } ]; // Access an individual columns by key, letter and 1-based column number const idCol = worksheet.getColumn('id'); const nameCol = worksheet.getColumn('B'); const dobCol = worksheet.getColumn(3); // set column properties // Note: will overwrite cell value C1 dobCol.header = 'Date of Birth'; // Note: this will overwrite cell values C1:C2 dobCol.header = ['Date of Birth', 'A.K.A. D.O.B.']; // from this point on, this column will be indexed by 'dob' and not 'DOB' dobCol.key = 'dob'; dobCol.width = 15; // Hide the column if you'd like dobCol.hidden = true; // set an outline level for columns worksheet.getColumn(4).outlineLevel = 0; worksheet.getColumn(5).outlineLevel = 1; // columns support a readonly field to indicate the collapsed state based on outlineLevel expect(worksheet.getColumn(4).collapsed).to.equal(false); expect(worksheet.getColumn(5).collapsed).to.equal(true); // iterate over all current cells in this column dobCol.eachCell(function(cell, rowNumber) { // ... }); // iterate over all current cells in this column including empty cells dobCol.eachCell({ includeEmpty: true }, function(cell, rowNumber) { // ... }); // add a column of new values worksheet.getColumn(6).values = [1,2,3,4,5]; // add a sparse column of values worksheet.getColumn(7).values = [,,2,3,,5,,7,,,,11]; // cut one or more columns (columns to the right are shifted left) // If column properties have been defined, they will be cut or moved accordingly // Known Issue: If a splice causes any merged cells to move, the results may be unpredictable worksheet.spliceColumns(3,2); // remove one column and insert two more. // Note: columns 4 and above will be shifted right by 1 column. // Also: If the worksheet has more rows than values in the column inserts, // the rows will still be shifted as if the values existed const newCol3Values = [1,2,3,4,5]; const newCol4Values = ['one', 'two', 'three', 'four', 'five']; worksheet.spliceColumns(3, 1, newCol3Values, newCol4Values); 行⬆ // Get a row object. If it doesn't already exist, a new empty one will be returned const row = worksheet.getRow(5); // Get multiple row objects. If it doesn't already exist, new empty ones will be returned const rows = worksheet.getRows(5, 2); // start, length (>0, else undefined is returned) // Get the last editable row in a worksheet (or undefined if there are none) const row = worksheet.lastRow; // Set a specific row height row.height = 42.5; // make row hidden row.hidden = true; // set an outline level for rows worksheet.getRow(4).outlineLevel = 0; worksheet.getRow(5).outlineLevel = 1; // rows support a readonly field to indicate the collapsed state based on outlineLevel expect(worksheet.getRow(4).collapsed).to.equal(false); expect(worksheet.getRow(5).collapsed).to.equal(true); row.getCell(1).value = 5; // A5's value set to 5 row.getCell('name').value = 'Zeb'; // B5's value set to 'Zeb' - assuming column 2 is still keyed by name row.getCell('C').value = new Date(); // C5's value set to now // Get a row as a sparse array // Note: interface change: worksheet.getRow(4) ==> worksheet.getRow(4).values row = worksheet.getRow(4).values; expect(row[5]).toEqual('Kyle'); // assign row values by contiguous array (where array element 0 has a value) row.values = [1,2,3]; expect(row.getCell(1).value).toEqual(1); expect(row.getCell(2).value).toEqual(2); expect(row.getCell(3).value).toEqual(3); // assign row values by sparse array (where array element 0 is undefined) const values = [] values[5] = 7; values[10] = 'Hello, World!'; row.values = values; expect(row.getCell(1).value).toBeNull(); expect(row.getCell(5).value).toEqual(7); expect(row.getCell(10).value).toEqual('Hello, World!'); // assign row values by object, using column keys row.values = { id: 13, name: 'Thing 1', dob: new Date() }; // Insert a page break below the row row.addPageBreak(); // Iterate over all rows that have values in a worksheet worksheet.eachRow(function(row, rowNumber) { console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values)); }); // Iterate over all rows (including empty rows) in a worksheet worksheet.eachRow({ includeEmpty: true }, function(row, rowNumber) { console.log('Row ' + rowNumber + ' = ' + JSON.stringify(row.values)); }); // Iterate over all non-null cells in a row row.eachCell(function(cell, colNumber) { console.log('Cell ' + colNumber + ' = ' + cell.value); }); // Iterate over all cells in a row (including empty cells) row.eachCell({ includeEmpty: true }, function(cell, colNumber) { console.log('Cell ' + colNumber + ' = ' + cell.value); }); // Commit a completed row to stream row.commit(); // row metrics const rowSize = row.cellCount; const numValues = row.actualCellCount; 添加行⬆ // Add a couple of Rows by key-value, after the last current row, using the column keys worksheet.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)}); worksheet.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)}); // Add a row by contiguous Array (assign to columns A, B & C) worksheet.addRow([3, 'Sam', new Date()]); // Add a row by sparse Array (assign to columns A, E & I) const rowValues = []; rowValues[1] = 4; rowValues[5] = 'Kyle'; rowValues[9] = new Date(); worksheet.addRow(rowValues); // Add a row with inherited style // This new row will have same style as last row // And return as row object const newRow = worksheet.addRow(rowValues, 'i'); // Add an array of rows const rows = [ [5,'Bob',new Date()], // row by array {id:6, name: 'Barbara', dob: new Date()} ]; // add new rows and return them as array of row objects const newRows = worksheet.addRows(rows); // Add an array of rows with inherited style // These new rows will have same styles as last row // and return them as array of row objects const newRowsStyled = worksheet.addRows(rows, 'i'); 范围 描述 默认值 值/秒 新行/秒值 风格 “i”表示从上面的行继承,“i+”表示包含空单元格,“n”表示没有 ‘n’ 处理单个细胞⬆ const cell = worksheet.getCell('C3'); // Modify/Add individual cell cell.value = new Date(1968, 5, 1); // query a cell's type expect(cell.type).toEqual(Excel.ValueType.Date); // use string value of cell myInput.value = cell.text; // use html-safe string for rendering... const html = '' + cell.html + ''; 合并单元格⬆ // merge a range of cells worksheergeCells('A4:B5'); // ... merged cells are linked worksheet.getCell('B5').value = 'Hello, World!'; expect(worksheet.getCell('B5').value).toBe(worksheet.getCell('A4').value); expect(worksheet.getCell('B5').master).toBe(worksheet.getCell('A4')); // ... merged cells share the same style object expect(worksheet.getCell('B5').style).toBe(worksheet.getCell('A4').style); worksheet.getCell('B5').style.font = myFonts.arial; expect(worksheet.getCell('A4').style.font).toBe(myFonts.arial); // unmerging the cells breaks the style links worksheet.unMergeCells('A4'); expect(worksheet.getCell('B5').style).not.toBe(worksheet.getCell('A4').style); expect(worksheet.getCell('B5').style.font).not.toBe(myFonts.arial); // merge by top-left, bottom-right worksheergeCells('K10', 'M12'); // merge by start row, start column, end row, end column (equivalent to K10:M12) worksheergeCells(10,11,12,13); 插入行⬆ insertRow(pos, value, style = 'n') insertRows(pos, values, style = 'n') // Insert a couple of Rows by key-value, shifting down rows every time worksheet.insertRow(1, {id: 1, name: 'John Doe', dob: new Date(1970,1,1)}); worksheet.insertRow(1, {id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)}); // Insert a row by contiguous Array (assign to columns A, B & C) worksheet.insertRow(1, [3, 'Sam', new Date()]); // Insert a row by sparse Array (assign to columns A, E & I) var rowValues = []; rowValues[1] = 4; rowValues[5] = 'Kyle'; rowValues[9] = new Date(); // insert new row and return as row object const insertedRow = worksheet.insertRow(1, rowValues); // Insert a row, with inherited style // This new row will have same style as row on top of it // And return as row object const insertedRowInherited = worksheet.insertRow(1, rowValues, 'i'); // Insert a row, keeping original style // This new row will have same style as it was previously // And return as row object const insertedRowOriginal = worksheet.insertRow(1, rowValues, 'o'); // Insert an array of rows, in position 1, shifting down current position 1 and later rows by 2 rows var rows = [ [5,'Bob',new Date()], // row by array {id:6, name: 'Barbara', dob: new Date()} ]; // insert new rows and return them as array of row objects const insertedRows = worksheet.insertRows(1, rows); // Insert an array of rows, with inherited style // These new rows will have same style as row on top of it // And return them as array of row objects const insertedRowsInherited = worksheet.insertRows(1, rows, 'i'); // Insert an array of rows, keeping original style // These new rows will have same style as it was previously in 'pos' position const insertedRowsOriginal = worksheet.insertRows(1, rows, 'o'); 范围 描述 默认值 位置 要插入的行号,从那里向下推所有行 值/秒 新行/秒值 风格 ‘i’ 代表从上面的行继承,’i+’ 包括空单元格,’o’ 代表原始样式,’o+’ 包括空单元格,’n’ 代表无 ‘n’ 拼接⬆ // Cut one or more rows (rows below are shifted up) // Known Issue: If a splice causes any merged cells to move, the results may be unpredictable worksheet.spliceRows(4, 3); // remove one row and insert two more. // Note: rows 4 and below will be shifted down by 1 row. const newRow3Values = [1, 2, 3, 4, 5]; const newRow4Values = ['one', 'two', 'three', 'four', 'five']; worksheet.spliceRows(3, 1, newRow3Values, newRow4Values); // Cut one or more cells (cells to the right are shifted left) // Note: this operation will not affect other rows row.splice(3, 2); // remove one cell and insert two more (cells to the right of the cut cell will be shifted right) row.splice(4, 1, 'new value 1', 'new value 2'); 范围 描述 默认值 开始 拼接起点 数数 要删除的行数/单元格数 …插入 要插入的新行/单元格值 复制一行⬆ duplicateRow(start, amount = 1, insert = true) const wb = new ExcelJS.Workbook(); const ws = wb.addWorksheet('duplicateTest'); ws.getCell('A1').value = 'One'; ws.getCell('A2').value = 'Two'; ws.getCell('A3').value = 'Three'; ws.getCell('A4').value = 'Four'; // This line will duplicate the row 'One' twice but it will replace rows 'Two' and 'Three' // if third param was true so it would insert 2 new rows with the values and styles of row 'One' ws.duplicateRow(1,2,false); 范围 描述 默认值 开始 要复制的行号(excel中的第一个是1) 数量 您想要复制该行的次数 1 插入 如此,如果要插入的重复新行,或假,如果你想更换它们 真的 定义的名称⬆

可以为单个单元格(或多组单元格)分配名称。这些名称可用于公式和数据验证(可能还有更多)。

// assign (or get) a name for a cell (will overwrite any other names that cell had) worksheet.getCell('A1').name = 'PI'; expect(worksheet.getCell('A1').name).to.equal('PI'); // assign (or get) an array of names for a cell (cells can have more than one name) worksheet.getCell('A1').names = ['thing1', 'thing2']; expect(worksheet.getCell('A1').names).to.have.members(['thing1', 'thing2']); // remove a name from a cell worksheet.getCell('A1').removeName('thing1'); expect(worksheet.getCell('A1').names).to.have.members(['thing2']); 数据验证⬆

单元格可以定义哪些值有效或无效,并向用户提供提示以帮助指导它们。

验证类型可以是以下之一:

类型 描述 列表 定义一组离散的有效值。Excel 将在下拉列表中提供这些以便于输入 所有的 该值必须是整数 十进制 该值必须是十进制数 文本长度 值可以是文本但长度是受控的 风俗 自定义公式控制有效值

对于列表或自定义以外的类型,以下运算符会影响验证:

操作员 描述 之间 值必须位于公式结果之间 不介于 值不得介于公式结果之间 平等的 值必须等于公式结果 不等于 值不能等于公式结果 比…更棒 值必须大于公式结果 少于 值必须小于公式结果 大于或等于 值必须大于或等于公式结果 小于或等于 值必须小于或等于公式结果 // Specify list of valid values (One, Two, Three, Four). // Excel will provide a dropdown with these values. worksheet.getCell('A1').dataValidation = { type: 'list', allowBlank: true, formulae: ['"One,Two,Three,Four"'] }; // Specify list of valid values from a range. // Excel will provide a dropdown with these values. worksheet.getCell('A1').dataValidation = { type: 'list', allowBlank: true, formulae: ['$D$5:$F$5'] }; // Specify Cell must be a whole number that is not 5. // Show the user an appropriate error message if they get it wrong worksheet.getCell('A1').dataValidation = { type: 'whole', operator: 'notEqual', showErrorMessage: true, formulae: [5], errorStyle: 'error', errorTitle: 'Five', error: 'The value must not be Five' }; // Specify Cell must be a decimal number between 1.5 and 7. // Add 'tooltip' to help guid the user worksheet.getCell('A1').dataValidation = { type: 'decimal', operator: 'between', allowBlank: true, showInputMessage: true, formulae: [1.5, 7], promptTitle: 'Decimal', prompt: 'The value must between 1.5 and 7' }; // Specify Cell must be have a text length less than 15 worksheet.getCell('A1').dataValidation = { type: 'textLength', operator: 'lessThan', showErrorMessage: true, allowBlank: true, formulae: [15] }; // Specify Cell must be have be a date before 1st Jan 2016 worksheet.getCell('A1').dataValidation = { type: 'date', operator: 'lessThan', showErrorMessage: true, allowBlank: true, formulae: [new Date(2016,0,1)] }; 单元格注释⬆

向单元格添加旧样式注释

// plain text note worksheet.getCell('A1').note = 'Hello, ExcelJS!'; // colourful formatted note ws.getCell('B1').note = { texts: [ {'font': {'size': 12, 'color': {'theme': 0}, 'name': 'Calibri', 'family': 2, 'scheme': 'minor'}, 'text': 'This is '}, {'font': {'italic': true, 'size': 12, 'color': {'theme': 0}, 'name': 'Calibri', 'scheme': 'minor'}, 'text': 'a'}, {'font': {'size': 12, 'color': {'theme': 1}, 'name': 'Calibri', 'family': 2, 'scheme': 'minor'}, 'text': ' '}, {'font': {'size': 12, 'color': {'argb': 'FFFF6600'}, 'name': 'Calibri', 'scheme': 'minor'}, 'text': 'colorful'}, {'font': {'size': 12, 'color': {'theme': 1}, 'name': 'Calibri', 'family': 2, 'scheme': 'minor'}, 'text': ' text '}, {'font': {'size': 12, 'color': {'argb': 'FFCCFFCC'}, 'name': 'Calibri', 'scheme': 'minor'}, 'text': 'with'}, {'font': {'size': 12, 'color': {'theme': 1}, 'name': 'Calibri', 'family': 2, 'scheme': 'minor'}, 'text': ' in-cell '}, {'font': {'bold': true, 'size': 12, 'color': {'theme': 1}, 'name': 'Calibri', 'family': 2, 'scheme': 'minor'}, 'text': 'format'}, ], margins: { insetmode: 'custom', inset: [0.25, 0.25, 0.35, 0.35] }, protection: { locked: True, lockText: False }, editAs: 'twoCells', }; 单元格注释属性⬆

下表定义了单元格注释支持的属性。

场地 必需的 默认值 描述 文本 是 评论的正文 边距 N {} 确定自动或自定义单元格注释的边距值 保护 N {} 使用保护属性指定对象和对象文本的锁定状态 编辑为 N ‘绝对’ 使用“editAs”属性指定注释如何锚定到单元格 单元格注释边距

确定单元格注释的页边距设置模式,自动或自定义模式。

ws.getCell('B1').note.margins = { insetmode: 'custom', inset: [0.25, 0.25, 0.35, 0.35] } 支持的边距属性⬆ 财产 必需的 默认值 描述 插入模式 N ‘汽车’ 确定是否自动设置注释边距,值为 ‘auto’ 或 ‘custom’ 插图 N [0.13, 0.13, 0.25, 0.25] 评论边框上的空白。单位是厘米。方向是左、上、右、下

注意:此 inset设置仅在值为insetmode“custom”时生效。

单元格评论保护

使用保护属性指定对象和对象文本的锁定状态。

ws.getCell('B1').note.protection = { locked: 'False', lockText: 'False', }; 支持的保护属性⬆ 财产 必需的 默认值 描述 锁定 N ‘真的’ 此元素指定当工作表受保护时对象被锁定 锁定文本 N ‘真的’ 该元素指定对象的文本被锁定

注意:锁定对象仅在工作表受保护时才有效。

单元格注释编辑为⬆

单元格注释也可以具有属性“editAs”,该属性将控制注释如何锚定到单元格。它可以具有以下值之一:

ws.getCell('B1').note.editAs = 'twoCells'; 价值 描述 双细胞 它指定笔记的大小和位置随单元格而变化 一个细胞 指定笔记大小固定,位置随单元格变化 绝对 这是默认设置。评论不会随单元格移动或调整大小 表⬆

表格允许对表格数据进行表格内操作。

要将表格添加到工作表,请定义表格模型并调用 addTable:

// add a table to a sheet ws.addTable({ name: 'MyTable', ref: 'A1', headerRow: true, totalsRow: true, style: { theme: 'TableStyleDark3', showRowStripes: true, }, columns: [ {name: 'Date', totalsRowLabel: 'Totals:', filterButton: true}, {name: 'Amount', totalsRowFunction: 'sum', filterButton: false}, ], rows: [ [new Date('2019-07-20'), 70.10], [new Date('2019-07-21'), 70.60], [new Date('2019-07-22'), 70.10], ], });

注意:将表格添加到工作表将通过将标题和行数据放置到工作表来修改工作表。结果表(包括标题和总计)覆盖的工作表上的任何数据都将被覆盖。

表格属性⬆

下表定义了表支持的属性。

表属性 描述 必需的 默认值 名称 表名 是 显示名称 表的显示名称 N 名称 参考 表格左上角的单元格 是 标题行 在表格顶部显示标题 N 真的 总计行 在表格底部显示总计 N 错误的 风格 额外的样式属性 N {} 列 列定义 是 行 数据行 是 表格样式属性⬆

下表定义了表格样式属性中支持的属性。

风格属性 描述 必需的 默认值 主题 桌子的颜色主题 N ‘TableStyleMedium2’ 显示第一列 突出显示第一列(粗体) N 错误的 显示最后一列 突出显示最后一列(粗体) N 错误的 显示行条纹 用背景颜色显示的交替行 N 错误的 显示列条纹 用背景颜色显示的交替行 N 错误的 表格列属性⬆

下表定义了每个表列中支持的属性。

列属性 描述 必需的 默认值 名称 列的名称,也用在标题中 是 过滤按钮 切换标题中的过滤器控件 N 错误的 总计行标签 用于描述总计行(第一列)的标签 N ‘全部的’ totalsRowFunction 总计函数的名称 N ‘没有任何’ 总计行公式 自定义函数的可选公式 N 总计函数⬆

下表列出了由列定义的 totalsRowFunction 属性的有效值。如果使用除 ‘custom’ 以外的任何值,则不必包括关联的公式,因为这将被表格插入。

总计函数 描述 没有任何 此列没有总计功能 平均 计算列的平均值 计数 计算数字条目 数数 条目数 最大限度 此列中的最大值 分钟 此列中的最小值 标准偏差 此列的标准偏差 无功 此列的方差 和 此列的条目总和 风俗 自定义公式。需要关联的 totalsRowFormula 值。 表格样式主题⬆

有效的主题名称遵循以下模式:

“TableStyle[Shade][Number]”

阴影,数字可以是以下之一:

轻,1-21 中等,1-28 黑暗,1-11

对于没有主题,使用值 null。

注意:exceljs 尚不支持自定义表格主题。

修改表格⬆

表支持一组操作函数,允许添加或删除数据以及更改某些属性。由于这些操作中的许多操作可能会在工作表上产生影响,因此必须在完成后提交更改。

表中的所有索引值都是从零开始的,所以第一行号和第一列号都是 0。

添加或删除标题和总计

const table = ws.getTable('MyTable'); // turn header row on table.headerRow = true; // turn totals row off table.totalsRow = false; // commit the table changes into the sheet table.commit();

重定位表

const table = ws.getTable('MyTable'); // table top-left move to D4 table.ref = 'D4'; // commit the table changes into the sheet table.commit();

添加和删​​除行

const table = ws.getTable('MyTable'); // remove first two rows table.removeRows(0, 2); // insert new rows at index 5 table.addRow([new Date('2019-08-05'), 5, 'Mid'], 5); // append new row to bottom of table table.addRow([new Date('2019-08-10'), 10, 'End']); // commit the table changes into the sheet table.commit();

添加和删​​除列

const table = ws.getTable('MyTable'); // remove second column table.removeColumns(1, 1); // insert new column (with data) at index 1 table.addColumn( {name: 'Letter', totalsRowFunction: 'custom', totalsRowFormula: 'ROW()', totalsRowResult: 6, filterButton: true}, ['a', 'b', 'c', 'd'], 2 ); // commit the table changes into the sheet table.commit();

更改列属性

const table = ws.getTable('MyTable'); // Get Column Wrapper for second column const column = table.getColumn(1); // set some properties column.name = 'Code'; column.filterButton = true; column.style = {font:{bold: true, name: 'Comic Sans MS'}}; column.totalsRowLabel = 'Totals'; column.totalsRowFunction = 'custom'; column.totalsRowFormula = 'ROW()'; column.totalsRowResult = 10; // commit the table changes into the sheet table.commit(); 样式⬆

单元格、行和列均支持一组丰富的样式和格式,这些样式和格式会影响单元格的显示方式。

通过分配以下属性来设置样式:

数量 字体 结盟 边界 充满 // assign a style to a cell ws.getCell('A1').numFmt = '0.00%'; // Apply styles to worksheet columns ws.columns = [ { header: 'Id', key: 'id', width: 10 }, { header: 'Name', key: 'name', width: 32, style: { font: { name: 'Arial Black' } } }, { header: 'D.O.B.', key: 'DOB', width: 10, style: { numFmt: 'dd/mm/yyyy' } } ]; // Set Column 3 to Currency Format ws.getColumn(3).numFmt = '"£"#,##0.00;[Red]\-"£"#,##0.00'; // Set Row 2 to Comic Sans. ws.getRow(2).font = { name: 'Comic Sans MS', family: 4, size: 16, underline: 'double', bold: true };

当样式应用于行或列时,它将应用于该行或列中所有当前存在的单元格。此外,创建的任何新单元格都将从其所属的行和列继承其初始样式。

如果单元格的行和列都定义了特定样式(例如字体),则单元格将使用行样式而不是列样式。但是,如果行和列定义了不同的样式(例如 column.numFmt 和 row.font),单元格将继承行的字体和列的 numFmt。

警告:以上所有属性(numFmt 除外,它是一个字符串)都是 JS 对象结构。如果相同的样式对象分配给多个电子表格实体,则每个实体将共享相同的样式对象。如果样式对象在电子表格序列化之前被修改,那么所有引用该样式对象的实体也将被修改。此行为旨在通过减少创建的 JS 对象的数量来优先考虑性能。如果您希望样式对象是独立的,则需要在分配它们之前克隆它们。此外,默认情况下,当从文件(或流)读取文档时,如果电子表格实体共享相似的样式,那么它们也将引用相同的样式对象。

数字格式⬆ // display value as '1 3/5' ws.getCell('A1').value = 1.6; ws.getCell('A1').numFmt = '# ?/?'; // display value as '1.60%' ws.getCell('B1').value = 0.016; ws.getCell('B1').numFmt = '0.00%'; 字体⬆ // for the wannabe graphic designers out there ws.getCell('A1').font = { name: 'Comic Sans MS', family: 4, size: 16, underline: true, bold: true }; // for the graduate graphic designers... ws.getCell('A2').font = { name: 'Arial Black', color: { argb: 'FF00FF00' }, family: 2, size: 14, italic: true }; // for the vertical align ws.getCell('A3').font = { vertAlign: 'superscript' }; // note: the cell will store a reference to the font object assigned. // If the font object is changed afterwards, the cell font will change also... const font = { name: 'Arial', size: 12 }; ws.getCell('A3').font = font; font.size = 20; // Cell A3 now has font size 20! // Cells that share similar fonts may reference the same font object after // the workbook is read from file or stream 字体属性 描述 示例值 名称 字体名称。 ‘Arial’、’Calibri’ 等 家庭 后备字体系列。一个整数值。 1 – 衬线,2 – 无衬线,3 – 单色,其他 – 未知 方案 字体方案。 “次要”、“主要”、“无” 字符集 字体字符集。一个整数值。 1、2 等 尺寸 字体大小。一个整数值。 9、10、12、16 等 颜色 颜色描述,一个包含 ARGB 值的对象。 { argb: ‘FFFF0000’} 胆大 字体粗细 真假 斜体 字体斜率 真假 强调 字体下划线样式 真、假、“无”、“单”、“双”、“单会计”、“双会计” 罢工 字体删除线 真假 大纲 字体轮廓 真假 垂直对齐 垂直对齐 “上标”、“下标” 结盟⬆ // set cell alignment to top-left, middle-center, bottom-right ws.getCell('A1').alignment = { vertical: 'top', horizontal: 'left' }; ws.getCell('B1').alignment = { vertical: 'middle', horizontal: 'center' }; ws.getCell('C1').alignment = { vertical: 'bottom', horizontal: 'right' }; // set cell to wrap-text ws.getCell('D1').alignment = { wrapText: true }; // set cell indent to 1 ws.getCell('E1').alignment = { indent: 1 }; // set cell text rotation to 30deg upwards, 45deg downwards and vertical text ws.getCell('F1').alignment = { textRotation: 30 }; ws.getCell('G1').alignment = { textRotation: -45 }; ws.getCell('H1').alignment = { textRotation: 'vertical' };

有效的对齐属性值

水平的 垂直的 包裹文本 缩小到适合 缩进 阅读顺序 文字旋转 剩下 最佳 真的 真的 整数 时间 0 到 90 中央 中间 错误的 错误的 升 -1 到 -90 对 底部 垂直的 充满 分散式 证明合法 证明合法 中心连续 分散式 边框⬆ // set single thin border around A1 ws.getCell('A1').border = { top: {style:'thin'}, left: {style:'thin'}, bottom: {style:'thin'}, right: {style:'thin'} }; // set double thin green border around A3 ws.getCell('A3').border = { top: {style:'double', color: {argb:'FF00FF00'}}, left: {style:'double', color: {argb:'FF00FF00'}}, bottom: {style:'double', color: {argb:'FF00FF00'}}, right: {style:'double', color: {argb:'FF00FF00'}} }; // set thick red cross in A5 ws.getCell('A5').border = { diagonal: {up: true, down: true, style:'thick', color: {argb:'FFFF0000'}} };

有效的边框样式

薄薄地 点缀 点划线 头发 点划线 斜线点 中虚线 中划线点点 中划线 中等的 双倍的 厚的 填充⬆ // fill A1 with red darkVertical stripes ws.getCell('A1').fill = { type: 'pattern', pattern:'darkVertical', fgColor:{argb:'FFFF0000'} }; // fill A2 with yellow dark trellis and blue behind ws.getCell('A2').fill = { type: 'pattern', pattern:'darkTrellis', fgColor:{argb:'FFFFFF00'}, bgColor:{argb:'FF0000FF'} }; // fill A3 with solid coral ws.getCell('A3').fill = { type: 'pattern', pattern:'solid', fgColor:{argb:'F08080'}, }; // fill A4 with blue-white-blue gradient from left to right ws.getCell('A4').fill = { type: 'gradient', gradient: 'angle', degree: 0, stops: [ {position:0, color:{argb:'FF0000FF'}}, {position:0.5, color:{argb:'FFFFFFFF'}}, {position:1, color:{argb:'FF0000FF'}} ] }; // fill A5 with red-green gradient from center ws.getCell('A5').fill = { type: 'gradient', gradient: 'path', center:{left:0.5,top:0.5}, stops: [ {position:0, color:{argb:'FFFF0000'}}, {position:1, color:{argb:'FF00FF00'}} ] }; 图案填充⬆ 财产 必需的 描述 类型 是 值:’pattern’指定此填充使用模式 图案 是 指定模式的类型(请参阅下面的有效模式类型) 颜色 N 指定图案前景色。默认为黑色。 背景色 N 指定图案背景颜色。默认为白色。

注意:如果要使用solid模式填充单元格,则无需指定bgColor. 请参阅上面的示例,了解A3带有solid图案和珊瑚的单元格fgColor。

有效模式类型

没有任何 坚硬的 深灰色 中灰 浅灰 灰色125 灰色0625 深色水平 暗垂直 暗下来 变暗 暗格 暗格子 光水平 轻垂直 灯下 点亮 光格 灯架 渐变填充⬆ 财产 必需的 描述 类型 是 值:’gradient’指定此填充使用渐变 坡度 是 指定渐变类型。[‘角度’,’路径’]之一 程度 角度 对于 ‘angle’ 渐变,指定渐变的方向。0 是从左到右。1 – 359 之间的值顺时针旋转方向 中央 小路 对于“路径”渐变。指定路径起点的相对坐标。‘left’ 和 ‘top’ 值范围从 0 到 1 停止 是 指定渐变颜色序列。是包含从位置 0 开始到位置 1 结束的位置和颜色的对象数组。中间位置可用于指定路径上的其他颜色。

注意事项

使用上面的界面,可以创建使用 XLSX 编辑器程序无法实现的渐变填充效果。例如,Excel 仅支持 0、45、90 和 135 的角度梯度。同样,停止的顺序也可能受 UI 限制,位置 [0,1] 或 [0,0.5,1] 作为唯一选项。请注意此填充,以确保目标 XLSX 查看器支持它。

富文本⬆

单个单元格现在支持富文本或单元格格式。富文本值可以控制文本值内任意数量的子字符串的字体属性。有关支持哪些字体属性的完整详细信息,请参阅字体。

ws.getCell('A1').value = { 'richText': [ {'font': {'size': 12,'color': {'theme': 0},'name': 'Calibri','family': 2,'scheme': 'minor'},'text': 'This is '}, {'font': {'italic': true,'size': 12,'color': {'theme': 0},'name': 'Calibri','scheme': 'minor'},'text': 'a'}, {'font': {'size': 12,'color': {'theme': 1},'name': 'Calibri','family': 2,'scheme': 'minor'},'text': ' '}, {'font': {'size': 12,'color': {'argb': 'FFFF6600'},'name': 'Calibri','scheme': 'minor'},'text': 'colorful'}, {'font': {'size': 12,'color': {'theme': 1},'name': 'Calibri','family': 2,'scheme': 'minor'},'text': ' text '}, {'font': {'size': 12,'color': {'argb': 'FFCCFFCC'},'name': 'Calibri','scheme': 'minor'},'text': 'with'}, {'font': {'size': 12,'color': {'theme': 1},'name': 'Calibri','family': 2,'scheme': 'minor'},'text': ' in-cell '}, {'font': {'bold': true,'size': 12,'color': {'theme': 1},'name': 'Calibri','family': 2,'scheme': 'minor'},'text': 'format'} ] }; expect(ws.getCell('A1').text).to.equal('This is a colorful text with in-cell format'); expect(ws.getCell('A1').type).to.equal(Excel.ValueType.RichText); 细胞保护⬆

可以使用保护属性修改单元级保护。

ws.getCell('A1').protection = { locked: false, hidden: true, };

支持的保护属性

财产 默认 描述 锁定 真的 指定在工作表受保护时是否锁定单元格。 隐 错误的 指定如果工作表受保护,单元格的公式是否可见。 条件格式⬆

条件格式允许工作表根据单元格值或任何任意公式显示特定样式、图标等。

条件格式规则是在工作表级别添加的,通常会覆盖一系列单元格。

多个规则可以应用于给定的单元格范围,每个规则将应用自己的样式。

如果多个规则影响给定单元格,则规则优先级值将确定在竞争样式发生冲突时哪个规则胜出。优先级值较低的规则获胜。如果没有为给定规则指定优先级值,ExcelJS 将按升序分配它们。

注意:目前只支持条件格式规则的一个子集。具体来说,只有不需要在 元素内呈现 XML 的格式规则。这意味着不支持数据集和三个特定图标集(3Triangles、3Stars、5Boxes)。

// add a checkerboard pattern to A1:E7 based on row + col being even or odd worksheet.addConditionalFormatting({ ref: 'A1:E7', rules: [ { type: 'expression', formulae: ['MOD(ROW()+COLUMN(),2)=0'], style: {fill: {type: 'pattern', pattern: 'solid', bgColor: {argb: 'FF00FF00'}}}, } ] })

支持的条件格式规则类型

类型 描述 表达 可以使用任何自定义函数来激活规则。 单元格 使用指定的运算符将单元格值与提供的公式进行比较 前10名 将格式应用于具有顶部(或底部)范围内的值的单元格 高于平均水平 将格式应用于值高于(或低于)平均值的单元格 色阶 根据值在范围内的位置将彩色背景应用于单元格 图标集 根据值将一系列图标中的一个添加到单元格 包含文本 根据单元格是否为特定文本应用格式 时间段 根据单元格日期时间值是否在指定范围内应用格式 表达⬆ 场地 选修的 默认 描述 类型 ‘表达’ 优先事项 是 确定样式的优先顺序 公式 返回真/假值的 1 个公式字符串数组。要引用单元格值,请使用左上角的单元格地址 风格 如果公式返回 true 则应用样式结构 单元格是⬆ 场地 选修的 默认 描述 类型 ‘细胞’ 优先事项 是 确定样式的优先顺序 操作员 如何将单元格值与公式结果进行比较 公式 1 个公式字符串的数组,返回要与每个单元格进行比较的值 风格 如果比较返回 true 则应用样式结构

细胞是运算符

操作员 描述 平等的 如果单元格值等于公式值,则应用格式 比…更棒 如果单元格值大于公式值,则应用格式 少于 如果单元格值小于公式值,则应用格式 之间 如果单元格值介于两个公式值之间(含),则应用格式 前10名⬆ 场地 选修的 默认 描述 类型 ‘前10名’ 优先事项 是 确定样式的优先顺序 秩 是 10 指定格式中包含多少个顶部(或底部)值 百分 是 错误的 如果为真,排名字段是百分比,而不是绝对值 底部 是 错误的 如果为真,则包括底部值而不是顶部值 风格 如果比较返回 true 则应用样式结构 高于平均水平⬆ 场地 选修的 默认 描述 类型 ‘高于平均水平’ 优先事项 是 确定样式的优先顺序 高于平均水平 是 错误的 如果为真,排名字段是百分比,而不是绝对值 风格 如果比较返回 true 则应用样式结构 色阶⬆ 场地 选修的 默认 描述 类型 ‘色标’ 优先事项 是 确定样式的优先顺序 CFVO 由 2 到 5 个条件格式值对象组成的数组,用于指定值范围内的路径点 颜色 在给定的路点使用的相应颜色数组 风格 如果比较返回 true 则应用样式结构 图标集⬆ 场地 选修的 默认 描述 类型 ‘图标集’ 优先事项 是 确定样式的优先顺序 图标集 是 3交通灯 要使用的图标集的名称 显示值 真的 指定应用范围内的单元格是显示图标和单元格值,还是只显示图标 撤销 错误的 指定 iconSet 中指定的图标集中的图标是否按保留顺序显示。如果 custom 等于“true”,则必须忽略此值 风俗 错误的 指定是否使用自定义图标集 CFVO 由 2 到 5 个条件格式值对象组成的数组,用于指定值范围内的路径点 风格 如果比较返回 true 则应用样式结构 数据条⬆ 场地 选修的 默认 描述 类型 ‘数据条’ 优先事项 是 确定样式的优先顺序 最小长度 0 指定此条件格式范围内最短数据栏的长度 最长长度 100 指定此条件格式范围内最长数据栏的长度 显示值 真的 指定条件格式范围内的单元格是同时显示数据栏和数值还是数据栏 坡度 真的 指定数据栏是否有渐变填充 边界 真的 指定数据栏是否有边框 负BarColorSameAsPositive 真的 指定数据条是否具有与正条颜色不同的负条颜色 负BarBorderColorSameAsPositive 真的 指定数据栏是否具有与正边框颜色不同的负边框颜色 轴位置 ‘汽车’ 指定数据条的轴位置 方向 ‘左到右’ 指定数据条的方向 CFVO 由 2 到 5 个条件格式值对象组成的数组,用于指定值范围内的路径点 风格 如果比较返回 true 则应用样式结构 包含文本⬆ 场地 选修的 默认 描述 类型 ‘包含文本’ 优先事项 是 确定样式的优先顺序 操作员 文本比较类型 文本 要搜索的文本 风格 如果比较返回 true 则应用样式结构

包含文本运算符

操作员 描述 包含文本 如果单元格值包含在“文本”字段中指定的值,则应用格式 包含空白 如果单元格值包含空格,则应用格式 不包含空白 如果单元格值不包含空格,则应用格式 包含错误 如果单元格值包含错误,则应用格式 不包含错误 如果单元格值不包含错误,则应用格式 时间段⬆ 场地 选修的 默认 描述 类型 ‘时间段’ 优先事项 是 确定样式的优先顺序 时间段 将单元格值与哪个时间段进行比较 风格 如果比较返回 true 则应用样式结构

时间段

时间段 描述 上星期 如果单元格值在上周内,则应用格式 本星期 如果单元格值落在本周,则应用格式 下周 如果单元格值在下周下降,则应用格式 昨天 如果单元格值等于昨天,则应用格式 今天 如果单元格值等于今天,则应用格式 明天 如果单元格值等于明天,则应用格式 最后7天 如果单元格值在过去 7 天内应用格式 上个月 如果单元格值落在上个月,则应用格式 这个月 如果单元格值落在本月,则应用格式 下个月 如果单元格值在下个月下降,则应用格式 大纲级别⬆

Excel支持大纲;可以根据用户希望查看的详细程度来展开或折叠行或列的位置。

可以在列设置中定义大纲级别:

worksheet.columns = [ { header: 'Id', key: 'id', width: 10 }, { header: 'Name', key: 'name', width: 32 }, { header: 'D.O.B.', key: 'DOB', width: 10, outlineLevel: 1 } ];

或直接在行或列上

worksheet.getColumn(3).outlineLevel = 1; worksheet.getRow(3).outlineLevel = 1;

可以在工作表上设置工作表大纲级别

// set column outline level worksheet.properties.outlineLevelCol = 1; // set row outline level worksheet.properties.outlineLevelRow = 1;

注意:调整行或列上的大纲级别或工作表上的大纲级别会导致同时修改受属性更改影响的所有行或列的折叠属性的副作用。例如:

worksheet.properties.outlineLevelCol = 1; worksheet.getColumn(3).outlineLevel = 1; expect(worksheet.getColumn(3).collapsed).to.be.true; worksheet.properties.outlineLevelCol = 2; expect(worksheet.getColumn(3).collapsed).to.be.false;

可以在工作表上设置大纲属性

worksheet.properties.outlineProperties = { summaryBelow: false, summaryRight: false, }; 图片⬆

将图像添加到工作表是一个两步过程。首先,图像通过 addImage() 函数添加到工作簿,该函数也将返回一个 imageId 值。然后,使用 imageId,可以将图像作为平铺背景或覆盖单元格范围添加到工作表中。

注意:从这个版本开始,不支持调整或转换图像,并且在流模式下不​​支持图像。

将图像添加到工作簿⬆

Workbook.addImage 函数支持按文件名或按缓冲区添加图像。请注意,在这两种情况下,都必须指定扩展名。有效的扩展值包括“jpeg”、“png”、“gif”。

// add image to workbook by filename const imageId1 = workbook.addImage({ filename: 'path/to/image.jpg', extension: 'jpeg', }); // add image to workbook by buffer const imageId2 = workbook.addImage({ buffer: fs.readFileSync('path/to.image.png'), extension: 'png', }); // add image to workbook by base64 const myBase64Image = "data:image/png;base64,iVBORw0KG..."; const imageId2 = workbook.addImage({ base64: myBase64Image, extension: 'png', }); 将图像背景添加到工作表⬆

使用 Workbook.addImage 中的图像 ID,可以使用 addBackgroundImage 函数设置工作表的背景

// set background worksheet.addBackgroundImage(imageId1); 在范围内添加图像⬆

使用 Workbook.addImage 中的图像 ID,可以将图像嵌入到工作表中以覆盖一个范围。从范围计算的坐标将覆盖从第一个单元格的左上角到第二个单元格的右下角。

// insert an image over B2:D6 worksheet.addImage(imageId2, 'B2:D6');

使用结构而不是范围字符串,可以部分覆盖单元格。

请注意,用于此的坐标系是基于零的,因此 A1 的左上角将为 { col: 0, row: 0 }。可以使用浮点数指定单元格的分数,例如 A1 的中点是 { col: 0.5, row: 0.5 }。

// insert an image over part of B2:D6 worksheet.addImage(imageId2, { tl: { col: 1.5, row: 1.5 }, br: { col: 3.5, row: 5.5 } });

单元格范围也可以具有属性“editAs”,该属性将控制图像如何锚定到单元格它可以具有以下值之一:

价值 描述 不明确的 它指定图像将与单元格一起移动和调整大小 一个细胞 这是默认设置。图像将与单元格一起移动但不调整大小 绝对 图像不会随单元格移动或调整大小 ws.addImage(imageId, { tl: { col: 0.1125, row: 0.4 }, br: { col: 2.101046875, row: 3.4 }, editAs: 'oneCell' }); 将图像添加到单元格⬆

您可以将图像添加到单元格,然后以 96dpi 的像素定义其宽度和高度。

worksheet.addImage(imageId2, { tl: { col: 0, row: 0 }, ext: { width: 500, height: 200 } }); 添加带有超链接的图像⬆

您可以将带有超链接的图像添加到单元格,并在图像范围内定义超链接。

worksheet.addImage(imageId2, { tl: { col: 0, row: 0 }, ext: { width: 500, height: 200 }, hyperlinks: { hyperlink: 'http://www.somewhere.com', tooltip: 'http://www.somewhere.com' } }); 板材保护⬆

可以通过添加密码来保护工作表不被修改。

await worksheet.protect('the-password', options);

也可以删除工作表保护:

worksheet.unprotect();

见细胞保护作用有关如何修改单个细胞保护的细节。

注意:虽然protect() 函数返回一个Promise 表示它是异步的,但当前的实现在主线程上运行,平均CPU 将使用大约600 毫秒。这可以通过设置 spinCount 来调整,它可用于使过程更快或更灵活。

工作表保护选项⬆ 场地 默认 描述 选择锁定单元格 真的 让用户选择锁定的单元格 选择未锁定的单元格 真的 让用户选择未锁定的单元格 格式单元格 错误的 让用户格式化单元格 格式列 错误的 让用户格式化列 格式行 错误的 让用户格式化行 插入行 错误的 让用户插入行 插入列 错误的 让用户插入列 插入超链接 错误的 让用户插入超链接 删除行 错误的 让用户删除行 删除列 错误的 让用户删除列 种类 错误的 让用户对数据进行排序 自动过滤器 错误的 让用户过滤表中的数据 数据透视表 错误的 让用户使用数据透视表 自旋计数 100000 保护或取消保护时执行的哈希迭代次数 文件输入/输出⬆ XLSX⬆ 阅读 XLSX⬆ // read from a file const workbook = new Excel.Workbook(); await workbook.xlsx.readFile(filename); // ... use workbook // read from a stream const workbook = new Excel.Workbook(); await workbook.xlsx.read(stream); // ... use workbook // load from buffer const workbook = new Excel.Workbook(); await workbook.xlsx.load(data); // ... use workbook 写 XLSX⬆ // write to a file const workbook = createAndFillWorkbook(); await workbook.xlsx.writeFile(filename); // write to a stream await workbook.xlsx.write(stream); // write to a new buffer const buffer = await workbook.xlsx.writeBuffer(); CSV文件⬆ 读取CSV⬆

读取 CSV 文件时支持的选项。

场地 必需的 类型 描述 日期格式 N 大批 指定dayjs的日期编码格式。 地图 N 功能 用于处理数据的自定义 Array.prototype.map() 回调函数。 表名 N 细绳 指定工作表名称。 解析器选项 N 目的 parseOptions 选项 @fast-csv/format 模块写入 csv 数据。 // read from a file const workbook = new Excel.Workbook(); const worksheet = await workbook.csv.readFile(filename); // ... use workbook or worksheet // read from a stream const workbook = new Excel.Workbook(); const worksheet = await workbook.csv.read(stream); // ... use workbook or worksheet // read from a file with European Dates const workbook = new Excel.Workbook(); const options = { dateFormats: ['DD/MM/YYYY'] }; const worksheet = await workbook.csv.readFile(filename, options); // ... use workbook or worksheet // read from a file with custom value parsing const workbook = new Excel.Workbook(); const options = { map(value, index) { switch(index) { case 0: // column 1 is string return value; case 1: // column 2 is a date return new Date(value); case 2: // column 3 is JSON of a formula value return JSON.parse(value); default: // the rest are numbers return parseFloat(value); } }, // https://c2fo.io/fast-csv/docs/parsing/options parserOptions: { delimiter: '\t', quote: false, }, }; const worksheet = await workbook.csv.readFile(filename, options); // ... use workbook or worksheet

CSV 解析器使用fast-csv读取 CSV 文件。上面传递给write函数的options中的formatterOptions会传递给@fast-csv/format模块来写入csv数据。详情请参阅 fast-csv README.md。

使用 npm 模块dayjs解析日期。如果未提供 dateFormats 数组,则使用以下 dateFormats:

‘YYYY-MM-DD[T]HH:mm:ss’ ‘MM-DD-YYYY’ ‘YYYY-MM-DD’

有关如何构建 dateFormat 的详细信息,请参阅dayjs CustomParseFormat 插件。

写入 CSV⬆

写入 CSV 文件时支持的选项。

场地 必需的 类型 描述 日期格式 N 细绳 指定dayjs的日期编码格式。 日期UTC N 布尔值 指定 ExcelJS 是否dayjs.utc ()用于转换时区以解析日期。 编码 N 细绳 指定文件编码格式。(仅适用于.writeFile。) 包含空行 N 布尔值 指定是否可以写入空行。 地图 N 功能 用于处理行值的自定义 Array.prototype.map() 回调函数。 表名 N 细绳 指定工作表名称。 表ID N 数字 指定工作表 ID。 格式化选项 N 目的 formatterOptions 选项@fast-csv/format 模块写入 csv 数据。 // write to a file const workbook = createAndFillWorkbook(); await workbook.csv.writeFile(filename); // write to a stream // Be careful that you need to provide sheetName or // sheetId for correct import to csv. await workbook.csv.write(stream, { sheetName: 'Page name' }); // write to a file with European Date-Times const workbook = new Excel.Workbook(); const options = { dateFormat: 'DD/MM/YYYY HH:mm:ss', dateUTC: true, // use utc when rendering dates }; await workbook.csv.writeFile(filename, options); // write to a file with custom value formatting const workbook = new Excel.Workbook(); const options = { map(value, index) { switch(index) { case 0: // column 1 is string return value; case 1: // column 2 is a date return dayjs(value).format('YYYY-MM-DD'); case 2: // column 3 is a formula, write just the result return value.result; default: // the rest are numbers return value; } }, // https://c2fo.io/fast-csv/docs/formatting/options formatterOptions: { delimiter: '\t', quote: false, }, }; await workbook.csv.writeFile(filename, options); // write to a new buffer const buffer = await workbook.csv.writeBuffer();

CSV 解析器使用fast-csv来写入 CSV 文件。上面传递给write函数的options中的formatterOptions会传递给@fast-csv/format模块来写入csv数据。详情请参阅 fast-csv README.md。

日期使用 npm 模块dayjs格式化。如果未提供 dateFormat,则使用 dayjs.ISO_8601。编写 CSV 时,您可以将布尔值 dateUTC 提供为 true,以便 ExcelJS 解析日期,而无需使用dayjs.utc().

流输入/输出⬆

上面记录的文件 I/O 要求在写入文件之前在内存中建立整个工作簿。虽然方便,但由于需要的内存量,它可以限制文档的大小。

流式写入器(或读取器)在生成工作簿或工作表数据时对其进行处理,并在生成时将其转换为文件形式。通常,这在内存上效率更高,因为最终内存占用甚至中间内存占用比文档版本要紧凑得多,尤其是当您考虑到行和单元格对象在提交后就会被释放时。

流工作簿和工作表的界面与文档版本几乎相同,但有一些细微的实际差异:

将工作表添加到工作簿后,将无法将其删除。 一旦提交了一行,它就不再可访问,因为它已从工作表中删除。 不支持 unMergeCells()。

请注意,可以在不提交任何行的情况下构建整个工作簿。提交工作簿后,将自动提交所有添加的工作表(包括所有未提交的行)。然而,在这种情况下,文档版本几乎没有任何好处。

流媒体 XLSX⬆ 流式 XLSX Writer(#contents)

流式 XLSX 工作簿编写器在 ExcelJS.stream.xlsx 命名空间中可用。

构造函数采用具有以下字段的可选选项对象:

场地 描述 溪流 指定要写入 XLSX 工作簿的可写流。 文件名 如果未指定流,则此字段指定要写入 XLSX 工作簿的文件的路径。 使用共享字符串 指定是否在工作簿中使用共享字符串。默认为false。 使用样式 指定是否向工作簿添加样式信息。样式会增加一些性能开销。默认为false。 压缩 ExcelJS 内部传递给Archiver 的Zip 选项。默认为undefined。

如果在选项中既没有指定流也没有指定文件名,工作簿编写器将创建一个 StreamBuf 对象,该对象将在内存中存储 XLSX 工作簿的内容。此 StreamBuf 对象可通过属性 workbook.stream 访问,可用于通过 stream.read() 直接访问字节或将内容通过管道传输到另一个流。

// construct a streaming XLSX workbook writer with styles and shared strings const options = { filename: './streamed-workbook.xlsx', useStyles: true, useSharedStrings: true }; const workbook = new Excel.stream.xlsx.WorkbookWriter(options);

通常,流式 XLSX 编写器的接口与上述文档工作簿(和工作表)相同,实际上行、单元格和样式对象是相同的。

但是还是有一些区别…

建造

如上所示,WorkbookWriter 通常需要在构造函数中指定输出流或文件。

提交数据

当工作表行准备好时,应该提交它以便可以释放行对象和内容。通常,这将在添加每一行时完成…

worksheet.addRow({ id: i, name: theName, etc: someOtherDetail }).commit();

WorksheetWriter 在添加行时不提交行的原因是允许跨行合并单元格:

worksheergeCells('A1:B2'); worksheet.getCell('A1').value = 'I am merged'; worksheet.getCell('C1').value = 'I am not'; worksheet.getCell('C2').value = 'Neither am I'; worksheet.getRow(2).commit(); // now rows 1 and two are committed.

每个工作表完成后,还必须提交:

// Finished adding data. Commit the worksheet worksheet.commit();

要完成 XLSX 文档,必须提交工作簿。如果工作簿中的任何工作表未提交,它们将作为工作簿提交的一部分自动提交。

// Finished the workbook. await workbook.commit(); // ... the stream has been written 流式 XLSX 阅读器(#contents)

ExcelJS.stream.xlsx 命名空间中提供了流式 XLSX 工作簿阅读器。

构造函数接受一个必需的输入参数和一个可选的 options 参数:

争论 描述 输入(必填) 指定要从中读取 XLSX 工作簿的文件或可读流的名称。 选项(可选) 指定如何处理读取解析期间发生的事件类型。 选项.entries 指定是否发出条目 ( 'emit') 或不发出( 'ignore')。默认为'emit'。 options.sharedStrings 指定是否缓存共享字符串 ( 'cache'),将它们插入到相应的单元格值中,或者是发出 ( 'emit') 还是忽略它们 ( 'ignore'),在这两种情况下,单元格值都将是对共享字符串索引的引用。默认为'cache'。 选项.超链接 指定是否缓存超链接 ( 'cache'),这将它们插入到各自的单元格中,是否发出它们 ( 'emit') 或是否忽略它们 ( 'ignore')。默认为'cache'。 options.styles 指定是否缓存样式 ( 'cache'),将它们插入到各自的行和单元格中,或者是否忽略它们 ( 'ignore')。默认为'cache'。 选项.工作表 指定是否发出工作表 ( 'emit') 或不发出( 'ignore')。默认为'emit'。 const workbookReader = new ExcelJS.stream.xlsx.WorkbookReader('./file.xlsx'); for await (const worksheetReader of workbookReader) { for await (const row of worksheetReader) { // ... } }

请注意,worksheetReader出于性能原因,返回一个行数组而不是单独的每一行:https : //github.com/nodejs/node/issues/31979

迭代所有事件(#contents)

工作簿上的事件是“工作表”、“共享字符串”和“超链接”。工作表上的事件是“行”和“超链接”。

const options = { sharedStrings: 'emit', hyperlinks: 'emit', worksheets: 'emit', }; const workbook = new ExcelJS.stream.xlsx.WorkbookReader('./file.xlsx', options); for await (const {eventType, value} of workbook.parse()) { switch (eventType) { case 'shared-strings': // value is the shared string case 'worksheet': // value is the worksheetReader case 'hyperlinks': // value is the hyperlinksReader } } 可读流(#contents)

虽然我们强烈鼓励使用异步迭代,但我们也公开了一个流接口以实现向后兼容性。

const options = { sharedStrings: 'emit', hyperlinks: 'emit', worksheets: 'emit', }; const workbookReader = new ExcelJS.stream.xlsx.WorkbookReader('./file.xlsx', options); workbookReader.read(); workbookReader.on('worksheet', worksheet => { worksheet.on('row', row => { }); }); workbookReader.on('shared-strings', sharedString => { // ... }); workbookReader.on('hyperlinks', hyperlinksReader => { // ... }); workbookReader.on('end', () => { // ... }); workbookReader.on('error', (err) => { // ... }); 浏览器⬆

该库的一部分已被隔离并经过测试,可在浏览器环境中使用。

由于工作簿阅读器和工作簿编写器的流式特性,这些尚未包括在内。只能使用基于文档的工作簿(有关详细信息,请参阅创建工作簿)。

例如,在浏览器中使用 ExcelJS 的代码请查看github 存储库中的spec/browser文件夹。

预装⬆

以下文件已预先打包并包含在 dist 文件夹中。

exceljs.js exceljs.min.js 值类型⬆

支持以下值类型。

空值⬆

枚举:Excel.ValueType.Null

空值表示没有值,通常不会在写入文件时存储(合并单元格除外)。它可用于从单元格中删除值。

例如

worksheet.getCell('A1').value = null; 合并单元格⬆

枚举:Excel.ValueType.Merge

合并单元格的值绑定到另一个“主”单元格。分配给合并单元格将导致主单元格被修改。

数值⬆

枚举:Excel.ValueType.Number

一个数值。

例如

worksheet.getCell('A1').value = 5; worksheet.getCell('A2').value = 3.14159; 字符串值⬆

枚举:Excel.ValueType.String

一个简单的文本字符串。

例如

worksheet.getCell('A1').value = 'Hello, World!'; 日期值⬆

枚举:Excel.ValueType.Date

一个日期值,由 JavaScript 日期类型表示。

例如

worksheet.getCell('A1').value = new Date(2017, 2, 15); 超链接值⬆

枚举:Excel.ValueType.Hyperlink

具有文本和链接值的 URL。

例如

// link to web worksheet.getCell('A1').value = { text: 'www.mylink.com', hyperlink: 'http://www.mylink.com', tooltip: 'www.mylink.com' }; // internal link worksheet.getCell('A1').value = { text: 'Sheet2', hyperlink: '#\'Sheet2\'!A1' }; 公式值⬆

枚举:Excel.ValueType.Formula

用于即时计算值的 Excel 公式。请注意,虽然单元格类型将为公式,但该单元格可能具有从结果值派生的 EffectiveType 值。

请注意,ExcelJS 无法处理公式以生成结果,必须提供它。

例如

worksheet.getCell('A3').value = { formula: 'A1+A2', result: 7 };

单元格还支持方便的 getter 来访问公式和结果:

worksheet.getCell('A3').formula === 'A1+A2'; worksheet.getCell('A3').result === 7; 共享公式⬆

共享公式通过减少工作表 xml 中文本的重复来增强 xlsx 文档的压缩。区域中左上角的单元格是指定的主单元格,将保存该区域中所有其他单元格所源自的公式。然后其他“从”单元格可以引用这个主单元格,而不是再次重新定义整个公式。请注意,主公式将以通常的 Excel 方式转换为从单元格,因此对其他单元格的引用将根据从单元到主单元的偏移量向下和向右移动。例如:如果主单元格 A2 有一个引用 A1 的公式,那么如果单元格 B2 共享 A2 的公式,那么它将引用 B1。

可以将主公式与其范围内的从属单元格一起分配给单元格

worksheet.getCell('A2').value = { formula: 'A1', result: 10, shareType: 'shared', ref: 'A2:B3' };

可以使用新值形式将共享公式分配给单元格:

worksheet.getCell('B2').value = { sharedFormula: 'A2', result: 10 };

这指定单元格 B2 是将从 A2 中的公式派生的公式,其结果为 10。

公式便利 getter 会将 A2 中的公式转换为 B2 中的公式:

expect(worksheet.getCell('B2').formula).to.equal('B1');

可以使用“fillFormula”函数将共享公式分配到工作表中:

// set A1 to starting number worksheet.getCell('A1').value = 1; // fill A2 to A10 with ascending count starting from A1 worksheet.fillFormula('A2:A10', 'A1+1', [2,3,4,5,6,7,8,9,10]);

fillFormula 还可以使用回调函数来计算每个单元格处的值

// fill A2 to A100 with ascending count starting from A1 worksheet.fillFormula('A2:A100', 'A1+1', (row, col) => row); 公式类型⬆

要区分真实的和翻译的公式单元格,请使用 formulaType 获取器:

worksheet.getCell('A3').formulaType === Enums.FormulaType.Master; worksheet.getCell('B3').formulaType === Enums.FormulaType.Shared;

公式类型具有以下值:

名称 价值 枚举.FormulaType.None 0 枚举.FormulaType.Master 1 枚举.FormulaType.Shared 2 数组公式⬆

在 Excel 中表达共享公式的一种新方法是数组公式。在这种形式中,主单元格是唯一包含与公式相关的任何信息的单元格。它包含 shareType ‘array’ 以及它适用的单元格范围和将被复制的公式。其余的单元格是具有常规值的常规单元格。

注意:数组公式不会按照共享公式的方式进行翻译。因此,如果主单元 A2 指的是 A1,那么从单元 B2 也将指 A1。

例如

// assign array formula to A2:B3 worksheet.getCell('A2').value = { formula: 'A1', result: 10, shareType: 'array', ref: 'A2:B3' }; // it may not be necessary to fill the rest of the values in the sheet

fillFormula 函数还可用于填充数组公式

// fill A2:B3 with array formula "A1" worksheet.fillFormula('A2:B3', 'A1', [1,1,1,1], 'array'); 富文本值⬆

枚举:Excel.ValueType.RichText

丰富的样式文本。

例如

worksheet.getCell('A1').value = { richText: [ { text: 'This is '}, {font: {italic: true}, text: 'italic'}, ] }; 布尔值⬆

枚举:Excel.ValueType.Boolean

例如

worksheet.getCell('A1').value = true; worksheet.getCell('A2').value = false; 错误值⬆

枚举:Excel.ValueType.Error

例如

worksheet.getCell('A1').value = { error: '#N/A' }; worksheet.getCell('A2').value = { error: '#VALUE!' };

当前有效的错误文本值为:

名称 价值 Excel.ErrorValue.NotApplicable #不适用 Excel.ErrorValue.Ref #参考! Excel.ErrorValue.Name #名称? Excel.ErrorValue.DivZero #DIV/0! Excel.ErrorValue.Null #空值! Excel.ErrorValue.Value #价值! Excel.ErrorValue.Num #NUM! 界面变化⬆

尽一切努力制作一个良好的一致界面,不会突破版本,但遗憾的是,为了更大的利益,有时有些事情必须改变。

0.1.0⬆ 工作表.eachRow⬆

Worksheet.eachRow 回调函数中的参数已被交换和更改;它是 function(rowNumber,rowValues),现在是 function(row, rowNumber),这使它看起来更像下划线 (_.each) 函数,并将行对象优先于行号。

工作表.getRow⬆

此函数已从返回单元格值的稀疏数组更改为返回 Row 对象。这可以访问行属性,并有助于管理行样式等。

单元格值的稀疏数组仍然可以通过 Worksheet.getRow(rowNumber).values 获得;

0.1.1⬆ 细胞模型⬆

cell.styles 重命名为 cell.style

0.2.44⬆

从函数返回的 Promise 从 Bluebird 切换到本地节点 Promise,如果它们依赖 Bluebird 的额外功能,则可能会破坏调用代码。

为了缓解这种情况,在 0.3.0 中添加了以下两个更改:

默认情况下使用功能更齐全且仍与浏览器兼容的 promise 库。该库支持 Bluebird 的许多功能,但占用空间要小得多。 注入不同 Promise 实现的选项。有关更多详细信息,请参阅配置部分。 配置⬆

ExcelJS 现在支持 promise 库的依赖注入。您可以通过在模块中包含以下代码来恢复 Bluebird 承诺…

ExcelJS.config.setValue('promise', require('bluebird'));

请注意:我专门用 bluebird 测试过 ExcelJS(直到最近,这是它使用的库)。从我所做的测试来看,它不适用于 Q。

注意事项⬆ Dist文件夹⬆

在发布这个模块之前,源代码在被放置到 dist/ 文件夹之前被转译和其他处理。这个自述文件标识了两个文件 – 一个浏览器化的包和缩小的版本。除了 package.json 中指定为“main”的文件之外,没有以任何方式保证 dist/ 文件夹的其他内容

已知的问题⬆ 使用 Puppeteer 进行测试⬆

此库中包含的测试套件包括一个在无头浏览器中执行的小脚本,以验证捆绑包。在撰写本文时,该测试似乎在 Windows Linux 子系统中表现不佳。

出于这个原因,浏览器测试可以通过名为 .disable-test-browser 的文件的存在来禁用

sudo apt-get install libfontconfig 拼接与合并⬆

如果任何拼接操作影响合并的单元格,合并组将无法正确移动

发布历史⬆ 版本 变化 0.0.9 数字格式 0.1.0 Bug修复 “” 文本字符在 xlsx 中正确呈现 更好的列控制 更好的行控制 0.1.1 Bug修复 更多正确写入xml的文本数据(包括文本、超链接、公式结果和格式代码) 更好的日期格式代码识别 单元格字体样式 0.1.2 修复了 zip 写入的潜在竞争条件 0.1.3 单元格对齐方式 行高 一些内部重组 0.1.5 Bug修复 现在可以在一个工作簿中处理 10 个或更多工作表 正确添加和引用了 theme1.xml 文件 单元格边框 0.1.6 Bug修复 XLSX 文件中包含更兼容的 theme1.xml 单元格填充 0.1.8 Bug修复 XLSX 文件中包含更兼容的 theme1.xml 修复文件名大小写问题 单元格填充 0.1.9 Bug修复 添加了 docProps 文件以满足 Mac Excel 用户 修复文件名大小写问题 修复了工作表 ID 问题 核心工作簿属性 0.1.10 Bug修复 处理找不到文件错误 CSV 文件 0.1.11 Bug修复 固定垂直中间对齐问题 行和列样式 Worksheet.eachRow 支持选项 Row.eachCell 支持选项 新函数 Column.eachCell 0.2.0 流式 XLSX 编写器 终于,ExcelJS 可以支持以可扩展的内存高效方式编写大量 XLSX 文件。性能已经过优化,甚至更小的电子表格的编写速度也比文档编写器更快。已添加选项来控制共享字符串和样式的使用,因为它们都会对性能产生相当大的影响 工作表.lastRow 访问工作表中的最后一个可编辑行。 行提交() 对于流式编写器,此方法将行(和任何先前的行)提交到流。提交的行将不再可编辑(并且通常从工作表对象中删除)。对于文档类型工作簿,此方法无效。 0.2.2 十亿个细胞 成就解锁:使用 ExcelJS 的一个简单测试创建了一个包含 1,000,000,000 个单元格的电子表格。使用随机数据制作,每行 10 个单元格的 100,000,000 行。我还不能验证文件,因为 Excel 不会打开它,我还没有实现流式阅读器,但我完全有信心它很好,因为 1,000,000 行加载正常。 0.2.3 Bug修复 合并单元格样式 合并的单元格现在保留(并解析)它们的样式。 流式 XLSX 编写器 终于,ExcelJS 可以支持以可扩展的内存高效方式编写大量 XLSX 文件。性能已经过优化,甚至更小的电子表格的编写速度也比文档编写器更快。已添加选项来控制共享字符串和样式的使用,因为它们都会对性能产生相当大的影响 工作表.lastRow 访问工作表中的最后一个可编辑行。 行提交() 对于流式编写器,此方法将行(和任何先前的行)提交到流。提交的行将不再可编辑(并且通常从工作表对象中删除)。对于文档类型工作簿,此方法无效。 0.2.4 Bug修复 带有与号名称的工作表 工作表名称现在是 xml 编码的,应该适用于所有与 xml 兼容的字符 Row.hidden & Column.hidden 行和列现在支持隐藏属性。 工作表.addRows 将行数组(数组或对象形式)添加到工作表末尾的新函数。 0.2.6 Bug修复 无效签名:0x80014:感谢hasanlussa的 PR 定义的名称 单元格现在可以分配名称,然后可以在公式中使用这些名称。 将 Bluebird.defer() 转换为 new Bluebird(function(resolve, reject){})。感谢用户Nishchit的拉取请求 0.2.7 数据验证 单元格现在可以定义控制单元格可以具有的有效值的验证 0.2.8 富文本值 单元格现在支持单元格格式 – 感谢Peter ADAM 修正了自述文件中的错字 – 感谢MRdNk 在工作表阅读器中修复发射 – 感谢Alan Gunning 更清晰的文档 – 感谢miensol 0.2.9 修复了未定义错误的“读取属性‘richText’。感谢 james075 0.2.10 重构完成。所有单元和集成测试都通过。 0.2.11 大纲级别。感谢cricri的贡献。 工作表属性 进一步重构工作表编写器。 0.2.12 图纸视图。再次感谢cricri的贡献。 0.2.13 exceljs 的修复程序可能会因正则表达式拒绝服务而受到攻击。荣誉对yonjah和乔希·爱默生的分辨率。 修复了在 Excel 中以“组”模式打开多张工作表的问题。我的坏 – 过于热心的工作表视图代码。 还修复了生成无效 xlsx 的空表。 0.2.14 exceljs 的修复程序可能会因正则表达式拒绝服务而受到攻击。荣誉对yonjah和乔希·爱默生的分辨率。 修复了多个工作表再次在 Excel 中以“组”模式打开的问题。添加了工作簿视图。 还修复了生成无效 xlsx 的空表。 0.2.15 添加了页面设置属性。感谢Jackkum的公关 0.2.16 新页面设置属性:打印区域 0.2.17 合并修复了一个关于拼音字符的错误。这解决了与阅读带有拼音文本的工作簿相关的问题。注意拼音文本尚未得到正确支持 – 只是被正确忽略。感谢zephyrrider和gen6033的贡献。 0.2.18 合并修复回归 #150:Stream API 无法写入 XLSX 文件。为回归道歉!感谢danieleds的修复。 合并修复了一个关于拼音字符的错误。这解决了与阅读带有拼音文本的工作簿相关的问题。注意拼音文本尚未得到正确支持 – 只是被正确忽略。感谢zephyrrider和gen6033的贡献。 0.2.19 合并更新 xlsx.js #119。这应该使解析对开放式办公室文档更具弹性。感谢nvitaterna的贡献。 0.2.20 来自 exceljs/exceljs#127 的合并更改应用于最新版本 #179。修复了已定义名称值的解析。感谢agdevbridge和priitliivak的贡献。 0.2.21 worksheet-writer #135 的合并颜色选项卡。修改了打印弃用警告的行为,因为 tabColor 已移入 options.properties。感谢ethanlook的贡献。 0.2.22 合并失败 Value.getType() #136 时抛出清晰的错误。感谢wulfsolter的贡献。 尊敬的贡献者,他们的 PR 在我看到之前就已修复: 好良玉 沃尔夫索特 0.2.23 如果未知 Cell.Type #137并进行一些修改,则合并回退到 JSON.stringify()。如果将单元格值分配给无法识别的 javascript 对象,则存储在 xlsx 和 csv 文件中的值将被 JSON 字符串化。请注意,如果再次读取文件,将不会尝试解析字符串化的 JSON 文本。感谢wulfsolter的贡献。 0.2.24 合并保护单元修复 #166。这并不意味着完全支持受保护的单元格,只是解析器不会被额外的 xml 混淆。感谢jayflo的贡献。 0.2.25 添加了从工作表中删除单元格、行和列的功能。这些函数以 Array splice 方法为模型,允许删除(和可选地插入)单元格、行和列。有关详细信息,请参阅列和行。注意:与单元格合并不兼容 0.2.26 合并更新 border-xform.js #184没有样式的边框边缘将被解析并呈现为无边框。感谢skumarnk2的贡献。 0.2.27 将视图合并到 worksheet-writer #187。现在也将视图传递给工作表编写器。感谢Temetz的贡献。 合并使用共享字符串时不要转义 xml 字符 #189。修复共享字符串中的错误。感谢tkirda的贡献。 0.2.28 合并修复小错误 [更新 hyperlink-map.js] #190感谢lszlkss的贡献。 合并修复工作表视图 showGridLines 选项#196 上的错字“showGridlines”应该是“showGridLines”。感谢gadiaz1的贡献。 0.2.29 合并Fire 完成事件而不是写入流 #199 上的结束事件,并在 zip 流而不是中间流 #200 上侦听完成事件。修复了流完成事件的问题。感谢junajan的贡献。 0.2.30 合并修复问题 #178 #201。将以下属性添加到工作簿: 标题 主题 关键词 类别 描述 公司 经理

感谢斯塔文科的贡献。

0.2.31 合并修复问题 #163:行元素的“跨度”属性是可选的 #203。现在 xlsx 解析将处理没有行跨度的文档。感谢arturas-vitkauskas的贡献。 0.2.32 合并修复问题 206 #208。修复了读取已打印的 xlsx 文件的问题。还将“lastPrinted”属性添加到工作簿。感谢arturas-vitkauskas的贡献。 0.2.33 合并允许对没有值的单元格进行样式设置。#210 . 在渲染解析中包含带有样式的 Null 类型单元格。感谢offers的贡献。 0.2.34 合并修复了 LibreOffice 文档中属性 dc:language 和 cp:revision #212 的“parseOpen 中的意外 xml 节点”错误。感谢jessica-jordan的贡献。 0.2.35 修复了获取列/行数 #74 的问题。工作表现在具有 rowCount 和 columnCount 属性(和实际变体),Row具有 cellCount。 0.2.36 合并流阅读器修复 #217。感谢kturney的贡献。 0.2.37 合并修复 Sheet Properties #225 的输出顺序。感谢cuineym的贡献。 合并从 _worksheets #231 中删除空工作表 [0]。感谢pookong的贡献。 合并不会跳过共享字符串中的空字符串,以便索引匹配 #232。再次感谢pookong的贡献。 合并使用共享字符串进行流式写入 #233。再次感谢pookong的贡献。 0.2.38 合并为问题 #216 #236 添加评论。感谢jsalwen的贡献。 合并开始支持基于 1904 的日期 #237。在设置了 1904 标志的文档中修复了日期处理。感谢霍尔姆的贡献。 0.2.39 合并停止 Bluebird 关于未返回承诺 #245 的警告。感谢robinbullocks4rb的贡献。 合并添加了缺失的依赖项:col-cache.js #247。感谢Manish2005的贡献。 0.2.42 浏览器兼容! 嗯,主要是。我添加了一个浏览器子文件夹,其中包含一个浏览器包和一个可用于生成另一个包的 index.js。有关详细信息,请参阅浏览器部分。 修复了损坏的 theme.xml。抱歉让它通过。 合并[BUGFIX] 数据验证公式未定义 #253。感谢jayflo的贡献。 0.2.43 合并为问题 99 添加了(可能是部分)解决方案。我无法创建适当的测试 #255。这修复了太少数据或空工作表生成格式错误的 excel 文件 #99。感谢mminuti的贡献。 0.2.44 减少依赖。 再见 lodash,再见蓝鸟。压缩包现在只是第一个版本的一半多一点。 0.2.45 带有超链接和数据验证的合并表已损坏 #256。感谢simon-stoic的贡献。 0.2.46 合并从 XML 输出中排除字符控件。修复 #234 #262。感谢霍尔姆的贡献。 合并添加对标识符 #259 的支持。这修复了由于单元格 #234 中的“垂直制表符”ascii 字符而损坏的 XLSX。感谢NOtherDev的贡献。 0.3.0 解决了删除 bluebird #266 的重大更改。对任何不便表示歉意。 添加了 Promise 库依赖注入。有关更多详细信息,请参阅配置部分。 0.3.1 合并更新依赖项 #279。感谢霍尔姆的贡献。 合并流处理的小修复 #267。感谢霍尔姆的贡献。 在 phantomjs 中为浏览器代码添加了自动化测试。 0.4.0 修复了值为 =”true” 的布尔单元格返回为 1 #278 的问题。修复涉及添加两个新的调用值类型: 布尔值 错误值

注意:由于此版本引入了一些界面更改,因此次要版本已增加到 4 个:

以前的布尔单元格将返回 1 或 0 现在将返回 true 或 false 以前返回字符串值的错误单元现在将返回错误结构 固定问题代码正确性 – 设置者不返回值 #280。 解决了v0.3.1 破坏了流星构建 #288 的问题。 0.4.1 合并添加对 cp:contentStatus #285 的支持。感谢霍尔姆的贡献。 合并修复 XML 中的有效字符(保存时允许 \n 和 \r)#286。感谢Rycochet的贡献。 修复了带有查询参数的超链接会损坏工作簿 #275。在 xml 中序列化之前,超链接目标不会被转义。 0.4.2

解决了以下问题:

白色文本和边框被更改为黑色 #290 从加载的文件中丢失格式/数据透视表 #261 实心填充变黑 #272

这些问题可能是由一个错误引起的,该错误导致零主题、色调或索引的颜色被错误地渲染和解析。

关于主题:存储在 xlsx 容器内的主题文件包含有关颜色、样式等的重要信息,如果加载的 xlsx 文件中的主题信息丢失,结果可能是不可预测和不可取的。为了解决这个问题,当 ExcelJS 工作簿解析 XLSX 文件时,它将保留它找到的任何主题文件,并在写入新的 XLSX 时包含它们。如果不需要此行为,Workbook 类会公开一个 clearThemes() 函数,该函数将删除主题内容。请注意,此行为仅在基于文档的 Workbook 类中实现,而不是在流式 Reader 和 Writer 中实现。

0.4.3 单元格区域中的合并支持错误引用 #294。感谢霍尔姆的贡献。 0.4.4 复制单元格的合并问题 #297。此合并增加了对共享公式的支持。感谢muscapades的贡献。 0.4.6 合并正确拼写 #304。感谢toanalien的贡献。 合并添加了对自动过滤器的支持 #306。这将自动过滤器添加到工作表。感谢C4rmond4i的贡献。 通过删除解构代码恢复了 NodeJS 4.0.0 兼容性。对于任何不便,我深表歉意。 0.4.9 切换到转译的代码以进行分发。这将确保从这里开始与 4.0.0 及更高版本的兼容性。它还允许在 lib 文件夹中使用更具表现力的 JS 代码! 基本图像支持!现在可以将图像作为平铺背景或拉伸范围添加到工作表中。注意:尚不支持旋转等其他功能,需要进一步工作。 0.4.10 合并添加缺少的 Office Res #319。感谢mauriciovillalobos的贡献。 合并添加 printTitlesRow 支持 #320感谢psellers89的贡献。 0.4.11 合并避免在没有媒体的锚上出错#327。感谢霍尔姆的贡献。 合并了用于流式读取的各种修复程序 #332。感谢霍尔姆的贡献。 0.4.12 如果未定义超链接 r:id #334,则合并不要设置地址。感谢霍尔姆的贡献。 0.4.13 合并问题 296 #343。这解决了编写换行符 #296 的问题。感谢holly-weisser的贡献。 0.4.14 添加了合并语法突出显示✨#350。感谢rmariuzzo的贡献。 0.5.0 合并修复从右到左的问题 #356。修复了向 RTL 文件 #72添加选项和添加用于设置 RTL 工作表 #126 的选项。非常感谢alitaheri的贡献。 0.5.1 合并修复 #345 类型错误:无法读取未定义 #364 的属性“date1904”。这修复了TypeError: Cannot read property ‘date1904’ of undefined #345。感谢Diluka的贡献。 0.6.0 合并添加 rowBreaks 功能。#389。感谢brucejo75的贡献。 0.6.1 合并的Guard 空模型字段 – 修复和测试 #403。感谢thecjharries的贡献。还要感谢Ryc O’Chet帮助审阅。 0.6.2 合并根据 csv 导入 #396 在自述文件中添加一些注释。感谢Michael Lelyakin的贡献。还要感谢planemar帮忙审阅。这也会关闭csv 到流不起作用 #395。 0.7.0 合并的Impl #407。感谢Ocke Janssen和Kay Ramme的贡献。此更改允许控制图像如何锚定到单元格。 0.7.1 合并尝试导入非 Excel 文件(例如 .numbers)#423 的 zip 文件时不要中断。感谢Andreas Lind的贡献。此更改使 exceljs 在打开非 excel 文件时更具弹性。 合并修复 #419:更新自述文件。#434。感谢Vishnu Kyatannawar的贡献。 合并当 docProps/core.xml 包含 标签 #436 时不要中断。感谢Andreas Lind的贡献。此更改处理带有空版本标记的 core.xml 文件。 0.8.0 为 .addImage() 方法合并添加 Base64 图像支持 #442。感谢James W Mann的贡献。 将更新时刻合并到 2.19.3 #453。感谢Markan Patel的贡献。 0.8.1 已合并有关字体系列属性的附加信息 #457。感谢kayakyakr的贡献。 合并修复 #458 #459。这修复了将样式添加到列导致它被隐藏 #458。感谢Alexander James Phillips的贡献。 0.8.2 合并加载包含图表#466 的 Excel 文件时不要中断。感谢Andreas Lind的贡献。 合并的修补程序/工作表订单#257 #471。这修复了Sheet Order #257。感谢Robbi的贡献。 0.8.3 同化修复 #79 unzip2 中过时的依赖项。感谢朱尔斯山姆。Randolph启动此修复程序,非常感谢Alexander Kachkaev找到最终解决方案。 0.8.4 转换为 javascript date #479 时,将圆形 Excel 日期合并到最接近的毫秒。感谢Benoit Jean的贡献。 0.8.5 合并错误修复: wb.worksheets/wb.eachSheet 导致 getWorksheet(0) 返回工作表 #485。感谢mah110020的贡献。 0.9.0 合并功能/问题 424 #489。这修复了无法控制 summaryBelow 或 summaryRight #424 的方法。非常感谢莎拉的贡献。 0.9.1 合并添加类型定义 #490。这将类型定义添加到 ExcelJS!非常感谢taoqf的贡献。 1.0.0 合并将节点 8 和节点 9 添加到持续集成测试 #494。非常感谢Markan Patel的贡献。 合并小型自述文件修复 #508。非常感谢Guilherme Bernal的贡献。 合并添加对 inlineStr 的支持,包括富文本 #501。非常感谢linguamatics-pdenes和Rob Scott为这一贡献所做的努力。由于此更改在技术上是一个重大更改(内联字符串的呈现 XML 将更改)我将其作为一个主要版本! 1.0.1 修复了当列数很重要时的 spliceColumns 问题 #520。 1.0.2 合并松开 exceljs 对时刻 #524 的依赖要求。非常感谢nicoladefranceschi的贡献。此更改解决了使用外部“时刻”包 #517 的能力。 1.1.0 已解决有没有办法在列中插入值。#514。向 Column 添加了一个新的 getter/setter 属性以获取和设置列值(有关详细信息,请参阅列)。 1.1.1 合并在已发布的包中包含 index.d.ts #532。修复npm 包 #525 中缺少的 TypeScript 定义。非常感谢Kagami Sascha Rosylight的贡献。 1.1.2 合并当 docProps/core.xml 包含 #536 时不要中断。非常感谢Andreas Lind(和审阅者)的贡献。 1.1.3 合并尝试处理 元素缺少 r 属性 #537 的情况。非常感谢Andreas Lind的贡献。 1.2.0 合并将 dateUTC 标志添加到 CSV 写入 #544。非常感谢Zackery Griesinger的贡献。 1.2.1 合并的工作表名称是可写的 #547。非常感谢xzper的贡献。 1.3.0 合并添加 CSV 写入缓冲区支持 #549。非常感谢Jarom Loveridge的贡献。 1.4.2 合并讨论:可自定义的行/单元格限制 #541。非常感谢Andreas Lind的贡献。 1.4.3 合并从超链接的公式单元格中获取正确的文本 #552。非常感谢Andreas Lind和Christian Holm的贡献。 1.4.5 合并添加带有大文件 #556 的测试用例。非常感谢Andreas Lind和Christian Holm的贡献。 1.4.6 合并更新 README.md 以反映 row.addPageBreak() #557 的正确功能。非常感谢RajDesai的贡献。 合并修复 index.d.ts #558。非常感谢Diluka的贡献。 1.4.7 [Content_Types].xml 中的合并列表 /xl/sharedStrings.xml 仅当 … #562 之一。非常感谢Priidik Vaikla的贡献。 1.4.8 [Content_Types].xml 中的合并列表 /xl/sharedStrings.xml 仅当 … #562 之一。非常感谢Priidik Vaikla的贡献。 修复了上面使用共享字符串但未添加内容类型的问题。 1.4.9 [Content_Types].xml 中的合并列表 /xl/sharedStrings.xml 仅当 … #562 之一。非常感谢Priidik Vaikla的贡献。 修复了上面使用共享字符串但未添加内容类型的问题。 已修复问题1.4.8 破坏了使用 useSharedStrings:true #581 写入 Excel 文件的问题。 1.4.10 合并的core-xform:容忍 coreProperties 元素 #564 缺少 cp: 命名空间。非常感谢Andreas Lind的贡献。 1.4.12 合并避免格式错误的地址错误 #567。非常感谢Andreas Lind的贡献。 合并在 index.d.ts #571 中添加了一个缺失的 Promise。非常感谢Gabriel Fournier的贡献。此版本应该修复workbook.commit() 是否仍然是一个承诺 #548 1.4.13 合并问题 #488 #574。非常感谢dljenkins的贡献。此版本应修复无效时间值异常 #488。 1.5.0 合并工作表为隐藏或显示添加状态 #577。非常感谢Freddie Hsinfu Huang的贡献。此版本应修复隐藏工作表和重新排序表 #226。 1.5.1 合并更新 index.d.ts #582。非常感谢hankolsen的贡献。 合并解码共享字符串中的x转义符号 #584。非常感谢Andreas Lind的贡献。 1.6.0 向 Cells 添加了 .html 属性以促进 html 安全渲染。有关详细信息,请参阅处理单个单元格。 1.6.1 合并修复问题 #488,其中 dt 是无效的日期格式。#587修复 无效时间值异常 #488。非常感谢Iliya Zubakin的贡献。 1.6.2 合并修复问题 #488,其中 dt 是无效的日期格式。#587修复 无效时间值异常 #488。非常感谢Iliya Zubakin的贡献。 根据规范或损坏的工作表 #590,合并的绘图元素必须低于 rowBreaks非常感谢Liam Neville的贡献。 1.6.3 合并集类型可选 #595非常感谢taoqf的贡献。 合并修复了一些 xlsx 流读取 xlsx 的问题#578非常感谢KMethod的贡献。 合并修复 README #599 中的格式问题非常感谢Vishnu Kyatannawar的贡献。 1.7.0 合并为超链接设置工具提示的能力 #602非常感谢Kuznetsov Aleksey的贡献。 1.8.0 合并修复了 #636 中误解的范围非常感谢Andreas Lind的贡献。 合并添加 LGTM 代码质量徽章 #640非常感谢Xavier RENE-CORAIL的贡献。 为 Column.values合并添加类型定义 #646非常感谢Emil Laine的贡献。这修复了Column.values 缺少 TypeScript 定义 #645。 合并更新 README.md 和 load() 选项 #663非常感谢Joanna Walker的贡献。 根据 npm audit #677合并固定包非常感谢Manuel Minuti的贡献。 合并更新 index.d.ts #699非常感谢Ray Yen的贡献。 合并将 node-unzip-2 替换为更强大的解压缩包 #708非常感谢johnmalkovich100的贡献。 合并阅读工作表隐藏状态 #728非常感谢Dishu(Lester) Lyu的贡献。 合并添加 Worksheet.state 打字稿定义修复 #714 #736非常感谢Ilyes Kechidi的贡献。这修复了 index.d.ts #714 中不存在的工作表状态。 1.9.0 图像的合并改进(正确的读/写位置)#702。这修复了图像位置不考虑列宽 #650和图像位置 – 拉伸图像 #467 的问题。非常感谢Siemienik Paweł的贡献。 1.9.1 为没有结果的公式合并添加 Typescript 支持 #619。非常感谢Loursin的贡献。 合并使用 spliceRows #737 时修复现有的行样式。非常感谢cxam的贡献。 合并一致的代码质量#774。非常感谢Andreas Lubbe的贡献。 1.10.0 修复了拼接行和列对定义名称的影响 合并添加对添加锚定到一个单元格的图像的支持 #746。非常感谢Karl von Randow的贡献。 合并添加垂直对齐属性 #758。非常感谢MikeZyatkov的贡献。 合并将临时库替换为 tmp #775。非常感谢Ivan Sotnikov的贡献。 合并将临时库替换为 tmp #775。非常感谢Andreas Lubbe的贡献。 合并的更新 Worksheet.dimensions 返回类型 #793。非常感谢Siemienik Paweł的贡献。 合并另一种类型修复 #795。非常感谢Siemienik Paweł的贡献。 1.11.0 合并如果列数超过给定的限制 #776,则添加退出解析的能力。非常感谢Andreas Lind的贡献。 合并打印时添加对每页重复列的支持。#799。非常感谢Jasmin Auger的贡献。 合并不要在现代设置中使用 promise polyfill #815。非常感谢Andreas Lubbe的贡献。 合并复制 LICENSE 到 dist 文件夹 #807。非常感谢Yuping Zuo的贡献。 合并避免未处理的拒绝 XML 解析错误 #813。非常感谢Andreas Lind的贡献。 1.12.0 将(杂项)增量解压缩器合并到 0.9.12 以解决 npm 建议 886 #819。非常感谢Kreig Zimmerman的贡献。 合并文档(自述文件):改进文档 #817。非常感谢Yuping Zuo的贡献。

合并添加评论支持 #529 #823。非常感谢ilimei的贡献。

这解决了以下问题:

是否可以在单元格上添加评论?#202 向单元格 #451 添加评论 Excel 在单元格上添加注释 #503 如何添加单元格评论 #529 请添加示例以说明如何为单元格插入评论 #707 1.12.1 合并修复了打印区域定义名称损坏文件 #822 的问题。非常感谢Julia Donaldson的贡献。这修复了“定义名称破坏/损坏 Excel 文件到修复模式 #664”的问题。 合并只为 sheetname #831 保留最多 31 个字符。非常感谢何学斌的贡献。这修复了将工作表名称长度限制为 31 个字符 #398 的问题。 1.12.2 合并添加 cn doc #834和更新 cn doc #852。非常感谢flydragon的贡献。 合并修复自述文件 #853 中的小拼写错误。非常感谢John Varga的贡献。 合并修复 defaultRowHeight 不起作用 #855。非常感谢autokill的贡献。这应该修复行高不适用于行 #422,worksheet.properties.defaultRowHeight 不能工作!如何设置行高,求救!!#634和默认的行高度不起作用?#696。 合并始终保留第一个字体 #854。非常感谢Dmitriy Gusev的贡献。这应该修复读取和写入后文档比例(仅宽度)不同的问题 #816,无法解析源文档的默认字体。#833和错误的基本字体:硬编码的 Calibri 而不是来自文档 #849 的字体。 1.13.0 合并zip:允许调整压缩性能或大小 #862。非常感谢myfreeer的贡献。 合并专长配置页眉和页脚 #863。非常感谢autokill的贡献。 修复了默认值导致设置“customHeight”属性的 defaultRowHeight 问题。 1.14.0 合并修复 README.md #874 中的页眉和页脚文本格式错误。非常感谢autokill的贡献。 添加了表格。有关详细信息,请参阅表格。 合并修复:#877 和 #880。非常感谢Alexander Heinrich的贡献。这修复了错误:没有文本的超链接崩溃写入 #877和错误:格式错误的评论在写入时崩溃 #880 1.15.0 将压缩级别选项合并到 WorkbookWriterOptions 以进行流式处理 #889。非常感谢Alfredo Benassi的贡献。 合并功能/单元保护 #903和功能/工作表保护 #907。非常感谢karabaesh的这些贡献。 2.0.1 主要版本变更

向 ExcelJS 引入异步/等待!

JavaScript 的新 async 和 await 特性可以帮助提高代码的可读性和可维护性。为了避免混淆,特别是从异步函数返回的承诺,我们不得不删除 Promise 类配置选项,从 v2 开始,ExcelJS 将使用本机 Promise。由于这可能是一个突破性的变化,我们正在推出此版本的主要版本。

变化 合并引入 async/await #829。非常感谢Andreas Lubbe的贡献。 合并更新 index.d.ts #930。非常感谢cosmonovallc的贡献。 合并TS:为 addTable 函数 #940 添加类型。非常感谢egmen的贡献。 合并向 Worksheet.protect() 和 Worksheet.unprotect() #926 的类型定义添加了显式返回类型。非常感谢Tamas Czinege的贡献。 删除了对 Promise 库的依赖。 3.0.0 另一个主要版本更改

多年来,Javascript 发生了很大变化,围绕它的模块和技术也发生了很大变化。为此,这个主要版本的 ExcelJS 更改了发布工件的结构:

Main Export 现在是原始 Javascript 源

在此版本之前,转译的 ES5 代码作为包 main 导出。从现在开始,包 main 直接来自 lib/ 文件夹。这意味着许多依赖项已被删除,包括 polyfill。

ES5 和 Browserify 仍然包含在内

为了支持那些仍然需要 ES5 就绪代码的代码(例如作为 Web 应用程序中的依赖项),源代码仍将被转译并在 dist/es5 中可用。

ES5 代码也经过浏览器化,可作为 dist/exceljs.js 或 dist/exceljs.min.js 使用

有关详细信息,请参阅导入部分

3.1.0 将Uprev fast-csv合并到不使用不安全 eval #873 的最新版本。非常感谢Mike Townsend的贡献。 在 createInputStream #906 上合并排除无限。非常感谢Sophie Kwon的贡献。 合并功能/向流编写器添加评论/注释#911。非常感谢brunoargolo的贡献。这修复了无法使用流式 WorkbookWriter 添加单元格注释 #868 修复了读取包含笔记的 .xlsx 文件的问题。这应该可以解决以下问题: 阅读来自 xlsx 的评论/注释 #941 Excel.js 不解析注释/注释。第944章 3.2.0 为流式 WorkbookWriter #923 的 zip 选项合并添加文档。非常感谢Soichi Takamura的贡献。 合并数组公式#933。非常感谢yoann-antoviaque的贡献。这修复了损坏的数组公式 #932并将数组公式添加到 ExcelJS。 3.3.0 合并修复 anchor.js #892。非常感谢Wojciech Wojtkowski的贡献。 为所有空格合并添加 xml:space=”preserve” #896。非常感谢Sebastian Keller的贡献。 合并添加shrinkToFit到文档并输入 #959。非常感谢(‘3’)的贡献。这修复了文档 #943 中没有的 shrinkToFit 属性。 合并#951:对从 Excel #980 打开的文件强制重新计算公式。非常感谢zymon的贡献。这修复了对从 Excel #951 打开的文件的强制公式重新计算。 固定Lib 包含类语法,与 IE11 #989 不兼容。 3.3.1 合并的HeaderFooter添加到表模型从文件#1000导入时。非常感谢Kaiichiro Ota的贡献。 合并更新 eslint 插件和配置 #1005,删除 grunt-lib-phantomjs #1006并将.browserslintrc.txt 重命名为 .browserslistrc #1007。非常感谢Takeshi Kurosawa的贡献。 合并修复问题 #988 #1012。这修复了无法读取 excel 文件 #988。非常感谢Todd Hambley的贡献。 3.4.0 合并功能/流编写器添加背景图像 #1016。非常感谢brunoargolo的贡献。 合并修复问题 #991 #1019。这修复了读取 csv 文件问题 #991。非常感谢Nathaniel J. Liberty的贡献。 Merged Large excels – 通过 excelJS 优化写入文件的性能 + 优化生成的文件(MS excel 打开它的速度要快得多)#1018 . 非常感谢Piotr的贡献。 3.5.0 条件格式已实现 Excel 条件格式的一个子集!特别是不需要在 节点内呈现 XML 的格式规则,或者换句话说,除了数据栏和三个图标集(3Triangles、3Stars、5Boxes)之外的所有内容。这些将适时实施 合并删除 core-js/ import #1030。非常感谢jeffrey n。关心这个贡献。此更改用于创建不包含任何 polyfill 的新浏览器化包人工制品。有关详细信息,请参阅Browserify。 3.6.0 合并1041 多个打印区域 #1042。非常感谢Alexander Pruss的贡献。 合并了 cell.note #1058 的修复类型。非常感谢xydens的贡献。 条件格式已完成。 条件格式包括 dataBar 和三种 iconSet 类型(3Triangles、3Stars、5Boxes)现在可用。 3.6.1 合并按行/列编号澄清合并单元格 #1047。非常感谢Kendall Roth的贡献。 合并修复关于冻结视图 #1048 的自述文件错误。非常感谢overviewmotel的贡献。 合并: 修复问题 #1045 页面中的水平居中和垂直居中不工作 #1073 修复 readme_zh.md 文件锚定失败的问题 #1082 修复工作表名称大小写导致的问题 #1065

非常感谢Alan Wang的贡献。

3.7.0 合并修复问题 #1075:无法在 节点 #1076 中读取/写入 defaultColWidth 属性。非常感谢Kaiichiro Ota的贡献。 合并后的函数 duplicateRows 添加了 #1078和Duplicate rows #1088。非常感谢cbeltrangomez84的贡献。 在工作簿加载期间合并防止未处理的承诺拒绝 #1087。非常感谢Wojtek的贡献。 合并修复问题 #899 支持插入带有超链接的图片 #1071。非常感谢Alan Wang的贡献。 合并更新 TS 定义以引用正确的内部库 #1089。非常感谢Jesse Kawell的贡献。 3.8.0 使用带有背景图像的流编写器合并问题/损坏工作簿 #1090。非常感谢brunoargolo的贡献。 合并修复 index.d.ts #1092。非常感谢Siemienik Paweł的贡献。 合并处理 zip 流之前等待写入 tmp 字段关闭 #1093。非常感谢Wojtek的贡献。 合并支持 ArrayBuffer 作为 xlsx.load 参数 #1095。非常感谢Wojtek的贡献。 与 RichText #1099合并导出共享字符串。非常感谢Kaiichiro Ota的贡献。 合并重写 Excel 工作簿后保留合并单元格的边框 #1102。非常感谢Kaiichiro Ota的贡献。 合并修复 #1103:editAs不工作 #1104。非常感谢Alan Wang的贡献。 合并修复问题 #1101 #1105。非常感谢Carlos Andres Beltran Gomez的贡献。 合并修复了自述文件 #1107 中的一些错误和拼写错误。非常感谢Alan Wang的贡献。 合并更新问题模板#1112。非常感谢Siemienik Paweł的贡献。 3.8.1 合并更新问题模板#1112。非常感谢Siemienik Paweł的贡献。 合并错别字:将 ‘allways’ 替换为 ‘always’ #1124。非常感谢Siemienik Paweł的贡献。 合并用 terser #1125 替换 uglify。非常感谢Andreas Lubbe的贡献。 合并在每次提交上应用代码样式并运行 lint:fix #1126。非常感谢Andreas Lubbe的贡献。 合并[WIP] 将 sax 替换为 sax #1127。非常感谢Andreas Lubbe的贡献。 合并添加 PR、功能请求和问题 github 模板 #1128。非常感谢Andreas Lubbe的贡献。 合并修复问题 #749 修复自述文件 #1137 中的内部链接示例错误。非常感谢Alan Wang的贡献。 3.8.2 合并更新 @types/node 版本到最新的 lts #1133。非常感谢Siemienik Paweł的贡献。 合并修复问题 #1118 将数据验证和条件格式添加到同一工作表会导致工作簿损坏 #1134。非常感谢Alan Wang的贡献。 合并添加基准测试 #1139。非常感谢Andreas Lubbe的贡献。 合并修复问题 #731 图像扩展不区分大小写 #1148。非常感谢Alan Wang的贡献。 合并修复问题 #1165 并更新 index.d.ts #1169。非常感谢Alan Wang的贡献。 3.9.0 合并优化 SAXStream #1140。非常感谢Andreas Lubbe的贡献。 合并修复问题 #1057 在使用 Streaming XLSX Writer #1143 时修复 addConditionalFormatting 不是函数错误。非常感谢Alan Wang的贡献。 合并修复问题 #204 设置默认列宽 #1160。非常感谢Alan Wang的贡献。 共享公式母版的合并包含单元格地址必须存在.. 错误 #1164。非常感谢Brad Reed的贡献。 合并了 DataValidation 示例中的错字 #1166。非常感谢Matthieu Ravey的贡献。 合并修复 #1175 #1176。非常感谢Siemienik Paweł的贡献。 合并修复问题 #1178 并更新 index.d.ts #1179。非常感谢Alan Wang的贡献。 合并简单测试打字稿是否能够编译 #1182。非常感谢Siemienik Paweł的贡献。 合并了更多改进 #1190。非常感谢Andreas Lubbe的贡献。 合并确保所有 node_modules 与 IE11 #1193 兼容。非常感谢Andreas Lubbe的贡献。 合并修复问题 #1194 并更新 index.d.ts #1199。非常感谢Alan Wang的贡献。这修复了[BUG] TypeScript 版本没有 Worksheet.addConditionalFormatting #1194 的定义。

合并修复问题 #1157 标记为无法设置属性 #1204。非常感谢Alan Wang的贡献。这修复了[BUG] 无法设置未定义的属性 ‘marked’ #1157。

合并弃用 createInputStream #1209。非常感谢Andreas Lubbe的贡献。

合并修复问题 #1206 #1205 和属性 #1210 的异常。非常感谢Alan Wang的贡献。这修复了[BUG] 未锁定的单元格在读取和写入工作簿后不保持其解锁状态。#1205和[BUG] 未锁定的单元格在读取和写入后失去其垂直和水平对齐方式。#1206。

3.10.0 合并[Chore] 升级依赖项 #1233。非常感谢Andreas Lubbe的贡献。

合并修复问题 #1198 绝对路径和相对路径需要兼容 #1220。非常感谢Alan Wang的贡献。这修复了[BUG] 加载 OpenPyXL 工作簿 #1198。合并升级 tmp #1234。非常感谢Andreas Lubbe的贡献。这修复了Process does not exit < 8.12.0 #882。

合并新版本的 dayjs 需要明确Z的日期格式 #1270。非常感谢Andreas Lubbe的贡献。

合并固定 #1276 #1280。非常感谢Subhajit Das的贡献。这修复了[BUG] 无效的正则表达式:/^[ -퟿-�ð??€-ô??¿¿]$/: Range out of order in character class #1276。合并[错误修复] 修复导致生成无效文件的特殊单元格值 #1278。非常感谢Alan Wang的贡献。这修复了特殊单元格值导致无效文件#703。

合并重译简体中文文档(zh-cn)#1208。非常感谢不如怀念的贡献。 合并数据验证-xform:如果类型不存在,则保留公式#1229。非常感谢myfreeer的贡献。

合并的WorkbookWriter 支持 rowBreaks #1257。非常感谢Alan Wang的贡献。这修复了[BUG] WorkbookWriter 不支持 headerFooter 和 rowBreaks。#1248。

仅合并固定的 ascii #1289。非常感谢Subhajit Das的贡献。 合并支持设置单元格注释属性 #1159。非常感谢Alan Wang的贡献。 合并文档:使用 jump2header #1215 将链接添加到顶部。非常感谢Dragoș Străinu的贡献。 当单元格为空时合并修复 cell.text 返回一个空对象#1310。非常感谢Alan Wang的贡献。 合并使用 rest args 而不是切片参数 #1303。非常感谢Andreas Lubbe的贡献。 4.0.1 主要版本更改 – 主要 ExcelJS 接口已从基于流的 API 迁移到异步迭代器,从而使代码更加简洁。虽然从技术上讲是一个突破性的变化,但大部分 API 没有改变。详情请参见UPGRADE-4.0.md。 此升级来自以下合并: [主要版本] 异步迭代器 #1135 [主要版本] 将 node v8 支持移至 ES5 导入 #1142

团队为此付出了很多努力,尤其是Andreas Lubbe和Siemienik Paweł。

4.1.0 合并删除 const 枚举并在 index.d.ts 中添加 ErrorValue #1317非常感谢 Alex Plumley的贡献。 合并更新 README.md 和 READEME_zh.md #1319非常感谢 Alan Wang的贡献。 合并使用新样式添加插入行功能继承选项#1324非常感谢 Subhajit Das的贡献。 合并更新了插入行的自述文件 #1327非常感谢 Subhajit Das的贡献。 合并修复:异步迭代器定义 #1338非常感谢 Julien – JuH的贡献。 合并[bugfix] 修复导致生成无效文件的特殊单元格值(#1339)#1344。这修复了[BUG] hasOwnProperty,构造函数特殊字未正确序列化 stream.xlsx.WorkbookWriter #1339。非常感谢 Alan Wang的贡献。 已合并修复 spliceColumn #1334 处注释未删除的错误。非常感谢 sdg9670的贡献。 合并的错误修复无法读取 undefined #1328 的属性 date1904。非常感谢 1328的贡献。 4.1.1 合并更新 index.d.ts #1356非常感谢Siemienik Paweł的贡献。 合并修复 index.ts #1358 中的 styleOption 错误。这修复了[BUG] 4.1.0 导致 TypeScript 编译错误 – addRows styleOption 应该是可选的吗?#1357。非常感谢 sdg9670的贡献。 合并改进的文档 #1354非常感谢Subhajit Das的贡献。 4.2.0 合并修复问题 #1431 Streaming WorkbookReader _parseSharedStrings 不处理共享字符串节点中的富文本 #1432。非常感谢Reza Heidari的贡献。 合并将 colorScale 颜色的类型更改为颜色数组 #1442。非常感谢Leondro Lio的贡献。 合并AddRow/s 和 InsertRow/s 现在返回新添加的行 #1443。非常感谢Subhajit Das的贡献。 合并修复文档 #1475。非常感谢Dmytro Kyba的贡献。 合并[bugfix] 修复问题 #1254 并更新 index.d.ts #1360。这应该修复[BUG] getSheetValues() 打字稿定义不正确 #1254。非常感谢Alan Wang的贡献。 合并修复问题 #1261 WorkbookWriter sheet.protect() 函数不存在 #1262。这应该修复[BUG] WorkbookWriter sheet.protect() 函数不存在 #1261。非常感谢Reza Heidari的贡献。 合并自述文件:流模式不支持图像#1405。非常感谢Christian d’Heureuse的贡献。 将Run linter 与 prettier 2 #1477合并。非常感谢Andreas Lubbe的贡献。 合并提高一些 xml 和 html 助手的性能 #1476。非常感谢Andreas Lubbe的贡献。 col-cache #1482 中的合并性能改进。非常感谢Kevin Kwok的贡献。 DefinedNamesRanges #1481 的合并修复类型定义。非常感谢Kevin Kwok的贡献。 已合并修复了在工作表级别设置作为一系列单元格的数据验证时出现的未定义引用错误 #1480。非常感谢Bene-Graham的贡献。 合并添加 A3 paperSize number #1485。这应该修复[F] 打印尺寸可以设置为 A3 #1406。非常感谢skypesky的贡献。 合并修复 #1364 流式 XLSX 阅读器上的错误工作表名称 #1478。这应该修复[BUG] 流式 XLSX 阅读器上的错误工作表名称 #1364。非常感谢Kevin Kwok的贡献。 合并grunt:跳过 core-js #1466 的 babel transpile。非常感谢myfreeer的贡献。 合并的xlsx:在浏览器中使用 TextDecoder 和 TextEncoder #1486。非常感谢myfreeer的贡献。 列 #1488 的合并优化输入。这应该修复getColumn.eachCell #1120 中的 [BUG] Typescript 错误。非常感谢Selwyn Yeow的贡献。 合并col-cache:优化性能 #1489。非常感谢myfreeer的贡献。 合并添加 lastColumn 属性(修复 #1453)#1487。这应该修复worsheet.lastcolumn #1453 的属性。非常感谢FliegendeWurst的贡献。 合并为 CSV writeFile 编码添加测试 #1495。这应该关闭[BUG] 导出 CSV 乱码字符 #1473。并且无法在生成的 CSV 文件中正确显示希伯来语 #995。非常感谢Joseph Dykstra的贡献。 合并澄清encoding选项仅适用于.writeFile#1496。非常感谢Joseph Dykstra的贡献。 合并后的行插入#1377后合并单元格。非常感谢Curt Commander的贡献。 合并修复问题 1474(检查无效的工作表名称)#1484。这应该修复[BUG] 错误处理工作表名称中的 ‘/’, ‘:’ 字符 #1474。非常感谢skypesky的贡献。 4.2.1 合并打字 FillPattern fgColor 应该是可选的 #1550。非常感谢Andries Smit的贡献。 在 getRows #1564 上合并固定返回类型。非常感谢Paul Mcilwaine的贡献。 合并修复 #1598 lint 违规 #1599。修复[BUG] npm run lint 报告多次违规 #1598。非常感谢Ilya I的贡献。 合并修复 fullAddress 行和列类型 #1606。非常感谢Adam Eisenreich的贡献。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3