读取、操作电子表格数据和样式并将其写入 XLSX 和 JSON。
将 Excel 电子表格文件作为项目进行逆向工程。
npm install exceljs
非常欢迎您的贡献!它帮助我了解需要哪些功能或哪些错误造成了最大的痛苦。
我只有一个要求;如果您提交错误修复的拉取请求,请添加捕获问题的单元测试或集成测试(在规范文件夹中)。即使只是测试失败的 PR 也很好 - 我可以分析测试正在做什么并从中修复代码。
注意:请尽量避免在 PR 中修改软件包版本。版本在发布时更新,任何更改很可能会导致合并冲突。
需要明确的是,添加到该库的所有贡献都将包含在该库的 MIT 许可证中。
const ExcelJS = require ( 'exceljs' ) ;
要使用 ES5 转译代码(例如,对于早于 10 的 Node.js 版本),请使用 dist/es5 路径。
const ExcelJS = require ( 'exceljs/dist/es5' ) ;
注意: ES5 构建对许多 polyfill 具有隐式依赖,而 exceljs 不再显式添加这些填充。您需要将“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 正则表达式模式。例如,
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 . prototype ;
}
ExcelJS 在 dist/ 文件夹内发布两个浏览器化包:
一种隐式依赖于 core-js polyfills 的...
< script src =" https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.js " > </ script >
< script src =" exceljs.js " > </ script >
还有一个没有...
< script src =" --your-project's-pollyfills-here-- " > </ script >
< script src =" exceljs.bare.js " > </ script >
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]
,因为workbook.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 为 true 时激活 |
适合高度 | 1 | 纸张应打印到多少页高。当 fitToPage 为 true 时激活 |
纸张尺寸 | 使用什么纸张尺寸(见下文) | |
显示行列标题 | 错误的 | 是否显示行号和列字母 |
显示网格线 | 错误的 | 是否显示网格线 |
第一页码 | 第一页使用哪个号码 | |
水平居中 | 错误的 | 工作表数据是否水平居中 |
垂直居中 | 错误的 | 工作表数据是否垂直居中 |
纸张尺寸示例
姓名 | 价值 |
---|---|
信 | 不明确的 |
合法的 | 5 |
管理人员 | 7 |
A3 | 8 |
A4 | 9 |
A5 | 11 |
B5(日标) | 13 |
10 号信封 | 20 |
信封DL | 27 |
信封C5 | 28 |
信封B5 | 34 |
信封君主 | 37 |
双日本明信片旋转 | 82 |
16K 197x273 毫米 | 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 | 将位置设置为中心 |
与研究 | 将位置设置为右侧 |
与普 | 当前页码 |
&N | 总页数 |
与发展 | 当前日期 |
与T | 当前时间 |
&G | 一张图片 |
&一个 | 工作表名称 |
与F | 文件名 |
及B | 将文本设为粗体 |
&我 | 斜体文本 |
与U | 下划线文本 |
&“字体名称” | 字体名称,例如 &"Aril" |
字体大小(&F) | 字体大小,例如12 |
十六进制代码(&K) | 字体颜色,例如&KCCCCCC |
工作表现在支持视图列表,这些视图控制 Excel 如何显示工作表:
每个视图还支持各种属性:
姓名 | 默认 | 描述 |
---|---|---|
状态 | '普通的' | 控制视图状态 - 正常、冻结或分割之一 |
从右到左 | 错误的 | 将工作表视图的方向设置为从右到左 |
活动细胞 | 不明确的 | 当前选定的单元格 |
显示标尺 | 真的 | 在页面布局中显示或隐藏标尺 |
显示行列标题 | 真的 | 显示或隐藏行和列标题(例如顶部为 A1、B1,左侧为 1、2、3 |
显示网格线 | 真的 | 显示或隐藏网格线(针对尚未定义边框的单元格显示) |
缩放比例 | 100 | 用于视图的缩放百分比 |
缩放比例正常 | 100 | 视图的正常缩放 |
风格 | 不明确的 | 演示样式 - pageBreakPreview 或 pageLayout 之一。注意 pageLayout 与冻结视图不兼容 |
冻结视图支持以下额外属性:
姓名 | 默认 | 描述 |
---|---|---|
x分割 | 0 | 要冻结多少列。要仅冻结行,请将其设置为 0 或未定义 |
y 分割 | 0 | 要冻结多少行。要仅冻结列,请将其设置为 0 或未定义 |
左上角单元格 | 特别的 | 哪个单元格将位于右下窗格的左上角。注意:不能是冷冻细胞。默认为第一个解冻单元格 |
worksheet . views = [
{ state : 'frozen' , xSplit : 2 , ySplit : 3 , topLeftCell : 'G10' , activeCell : 'A1' }
] ;
分割视图支持以下额外属性:
姓名 | 默认 | 描述 |
---|---|---|
x分割 | 0 | 从左边起多少个点可以放置分离器。要垂直分割,请将其设置为 0 或未定义 |
y 分割 | 0 | 从顶部起多少点放置分离器。要水平分割,请将其设置为 0 或未定义 |
左上角单元格 | 不明确的 | 哪个单元格将位于右下窗格的左上角。 |
活动窗格 | 不明确的 | 哪个窗格将处于活动状态 - 左上、右上、左下和右下之一 |
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 = '<div>' + cell . html + '</div>' ;
// merge a range of cells
worksheet . mergeCells ( '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
worksheet . mergeCells ( 'K10' , 'M12' ) ;
// merge by start row, start column, end row, end column (equivalent to K10:M12)
worksheet . mergeCells ( 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 |
插入 | 如果要为重复项插入新行,则为true ;如果要替换它们,则为false | 真的 |
单个单元格(或多组单元格)可以分配有名称。这些名称可用于公式和数据验证(可能还有更多)。
// 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' ,
} ;
下表定义了单元格注释支持的属性。
场地 | 必需的 | 默认值 | 描述 |
---|---|---|---|
文本 | 是 | 评论正文 | |
边距 | 氮 | {} | 确定自动或自定义单元格注释的边距值 |
保护 | 氮 | {} | 使用保护属性指定对象和对象文本的锁定状态 |
编辑为 | 氮 | '绝对' | 使用“editAs”属性指定注释如何锚定到单元格 |
确定单元格注释的页边距设置模式,自动或自定义模式。
ws . getCell ( 'B1' ) . note . margins = {
insetmode : 'custom' ,
inset : [ 0.25 , 0.25 , 0.35 , 0.35 ]
}
财产 | 必需的 | 默认值 | 描述 |
---|---|---|---|
插入模式 | 氮 | '汽车' | 确定是否自动设置注释边距,值为“auto”或“custom” |
插图 | 氮 | [0.13, 0.13, 0.25, 0.25] | 注释边框上有空格。单位为厘米。方向为左、上、右、下 |
注意:此inset
设置仅当insetmode
的值为 'custom' 时才生效。
使用保护属性指定对象和对象文本的锁定状态。
ws . getCell ( 'B1' ) . note . protection = {
locked : 'False' ,
lockText : 'False' ,
} ;
财产 | 必需的 | 默认值 | 描述 |
---|---|---|---|
锁定 | 氮 | '真的' | 该元素指定当工作表受保护时该对象被锁定 |
锁定文本 | 氮 | '真的' | 该元素指定对象的文本被锁定 |
注意:锁定对象仅在工作表受保护时才有效。
单元格注释还可以具有属性“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 ] ,
] ,
} ) ;
注意:将表添加到工作表将通过将标题和行数据放置到工作表来修改工作表。结果表所覆盖的工作表上的任何数据(包括标题和总计)都将被覆盖。
下表定义了表支持的属性。
表属性 | 描述 | 必需的 | 默认值 |
---|---|---|---|
姓名 | 表的名称 | 是 | |
显示名称 | 表的显示名称 | 氮 | 姓名 |
参考 | 表格左上角的单元格 | 是 | |
标题行 | 在表格顶部显示标题 | 氮 | 真的 |
总计行 | 在表格底部显示总计 | 氮 | 错误的 |
风格 | 额外的样式属性 | 氮 | {} |
列 | 列定义 | 是 | |
行 | 数据行 | 是 |
下表定义了表格样式属性中支持的属性。
风格属性 | 描述 | 必需的 | 默认值 |
---|---|---|---|
主题 | 桌子的颜色主题 | 氮 | '表格样式中2' |
显示第一列 | 突出显示第一列(粗体) | 氮 | 错误的 |
显示最后一列 | 突出显示最后一列(粗体) | 氮 | 错误的 |
显示行条纹 | 以背景颜色显示替代行 | 氮 | 错误的 |
显示列条纹 | 以背景颜色显示替代行 | 氮 | 错误的 |
下表定义了每个表列中支持的属性。
列属性 | 描述 | 必需的 | 默认值 |
---|---|---|---|
姓名 | 列的名称,也用在标题中 | 是 | |
过滤按钮 | 切换标题中的过滤器控制 | 氮 | 错误的 |
总计行标签 | 用于描述总计行的标签(第一列) | 氮 | '全部的' |
总计行函数 | 总计函数名称 | 氮 | '没有任何' |
总计行公式 | 自定义函数的可选公式 | 氮 |
下表列出了按列定义的totalsRowFunction 属性的有效值。如果使用“自定义”以外的任何值,则无需包含关联的公式,因为该公式将由表插入。
总计 功能 | 描述 |
---|---|
没有任何 | 该列没有总计功能 |
平均的 | 计算该列的平均值 |
计数值 | 计算数字条目的数量 |
数数 | 条目数 |
最大限度 | 该列中的最大值 |
分钟 | 该列中的最小值 |
标准偏差 | 该列的标准差 |
变量 | 该列的方差 |
和 | 此列的条目总和 |
风俗 | 自定义公式。需要关联的totalsRowFormula 值。 |
有效的主题名称遵循以下模式:
阴影、数字可以是以下之一:
如果没有主题,请使用值 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 - Serif,2 - Sans Serif,3 - Mono,其他 - 未知 |
方案 | 字体方案。 | “次要”、“主要”、“无” |
字符集 | 字体字符集。一个整数值。 | 1、2 等 |
尺寸 | 字体大小。一个整数值。 | 9、10、12、16 等 |
颜色 | 颜色描述,包含 ARGB 值的对象。 | { argb: 'FFFF0000'} |
大胆的 | 字体粗细 | 真,假 |
斜体 | 字体斜率 | 真,假 |
强调 | 字体下划线样式 | true、false、“无”、“单”、“双”、“单会计”、“双会计” |
罢工 | 字体 | 真,假 |
大纲 | 字体轮廓 | 真,假 |
垂直对齐 | 垂直对齐 | '上标', '下标' |
// 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' } }
]
} ;
财产 | 必需的 | 描述 |
---|---|---|
类型 | 是 | 值:“模式” 指定此填充使用图案 |
图案 | 是 | 指定模式类型(请参阅下面的有效模式类型) |
颜色 | 氮 | 指定图案前景色。默认为黑色。 |
背景颜色 | 氮 | 指定图案背景颜色。默认为白色。 |
注意:如果您想使用solid
图案填充单元格,则无需指定bgColor
。请参阅上面的示例,了解具有solid
图案和珊瑚色fgColor
的单元格A3
。
有效模式类型
财产 | 必需的 | 描述 |
---|---|---|
类型 | 是 | 值:“渐变” 指定此填充使用渐变 |
坡度 | 是 | 指定渐变类型。 ['角度'、'路径'] 之一 |
程度 | 角度 | 对于“角度”渐变,指定渐变的方向。 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 将按升序分配它们。
注意:目前仅支持条件格式规则的子集。具体来说,仅是不需要在 <extLst> 元素内呈现 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 | 指定格式中包含多少个顶部(或底部)值 |
百分比 | 是 | 错误的 | 如果为 true,则排名字段是百分比,而不是绝对值 |
底部 | 是 | 错误的 | 如果为 true,则包含底部值而不是顶部值 |
风格 | 如果比较返回 true,则应用样式结构 |
场地 | 选修的 | 默认 | 描述 |
---|---|---|---|
类型 | “高于平均水平” | ||
优先事项 | 是 | <自动> | 确定样式的优先顺序 |
高于平均水平 | 是 | 错误的 | 如果为 true,则排名字段是百分比,而不是绝对值 |
风格 | 如果比较返回 true,则应用样式结构 |
场地 | 选修的 | 默认 | 描述 |
---|---|---|---|
类型 | '色阶' | ||
优先事项 | 是 | <自动> | 确定样式的优先顺序 |
CFVO | 2 到 5 个条件格式化值对象的数组,指定值范围内的路径点 | ||
颜色 | 在给定路径点使用相应的颜色数组 | ||
风格 | 如果比较返回 true,则应用样式结构 |
场地 | 选修的 | 默认 | 描述 |
---|---|---|---|
类型 | '图标集' | ||
优先事项 | 是 | <自动> | 确定样式的优先顺序 |
图标集 | 是 | 3交通灯 | 要使用的图标集的名称 |
显示值 | 真的 | 指定应用范围内的单元格是显示图标和单元格值,还是仅显示图标 | |
撤销 | 错误的 | 指定 iconSet 中指定的图标集中的图标是否按保留顺序显示。如果自定义等于“true”,则必须忽略该值 | |
风俗 | 错误的 | 指定是否使用自定义图标集 | |
CFVO | 2 到 5 个条件格式化值对象的数组,指定值范围内的路径点 | ||
风格 | 如果比较返回 true,则应用样式结构 |
场地 | 选修的 | 默认 | 描述 |
---|---|---|---|
类型 | '数据栏' | ||
优先事项 | 是 | <自动> | 确定样式的优先顺序 |
最小长度 | 0 | 指定此条件格式范围中最短数据栏的长度 | |
最大长度 | 100 | 指定此条件格式范围内最长数据条的长度 | |
显示值 | 真的 | 指定条件格式区域中的单元格是同时显示数据栏和数值还是只显示数据栏 | |
坡度 | 真的 | 指定数据栏是否有渐变填充 | |
边界 | 真的 | 指定数据栏是否有边框 | |
负条颜色与正条颜色相同 | 真的 | 指定数据条是否具有与正条颜色不同的负条颜色 | |
负值条形边框颜色与正值相同 | 真的 | 指定数据栏的负边框颜色是否与正边框颜色不同 | |
轴位置 | '汽车' | 指定数据栏的轴位置 | |
方向 | '从左到右' | 指定数据栏的方向 | |
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函数支持按文件名或按Buffer添加图像。请注意,在这两种情况下,都必须指定扩展名。有效的扩展值包括“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 ( ) ;
有关如何修改单个单元保护的详细信息,请参阅单元保护。
注意:虽然 protected() 函数返回一个 Promise 表明它是异步的,但当前实现在主线程上运行,并且在平均 CPU 上将使用大约 600 毫秒。这可以通过设置 spinCount 来调整,它可用于使过程更快或更灵活。
场地 | 默认 | 描述 |
---|---|---|
选择锁定单元格 | 真的 | 允许用户选择锁定的单元格 |
选择已解锁的单元格 | 真的 | 让用户选择未锁定的单元格 |
格式化单元格 | 错误的 | 允许用户设置单元格格式 |
格式化列 | 错误的 | 允许用户设置列格式 |
格式化行 | 错误的 | 允许用户设置行格式 |
插入行 | 错误的 | 允许用户插入行 |
插入列 | 错误的 | 允许用户插入列 |
插入超链接 | 错误的 | 允许用户插入超链接 |
删除行 | 错误的 | 允许用户删除行 |
删除列 | 错误的 | 允许用户删除列 |
种类 | 错误的 | 让用户对数据进行排序 |
自动过滤 | 错误的 | 让用户过滤表中的数据 |
数据透视表 | 错误的 | 允许用户使用数据透视表 |
自旋计数 | 100000 | 保护或取消保护时执行的哈希迭代次数 |
读取 XLSX 文件时支持的选项。
场地 | 必需的 | 类型 | 描述 |
---|---|---|---|
忽略节点 | 氮 | 大批 | 加载 XLSX 文档时要忽略的节点名称列表。提高某些情况下的性能。 可用: sheetPr , dimension , sheetViews , sheetFormatPr , cols , sheetData , autoFilter , mergeCells , rowBreaks , hyperlinks , pageMargins , dataValidations , pageSetup , headerFooter , printOptions , picture , drawing , sheetProtection , tableParts , conditionalFormatting , extLst , |
// 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
// using additional options
const workbook = new Excel . Workbook ( ) ;
await workbook . xlsx . load ( data , {
ignoreNodes : [
'dataValidations' // ignores the workbook's Data Validations
] ,
} ) ;
// ... use workbook
// 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 文件时支持的选项。
场地 | 必需的 | 类型 | 描述 |
---|---|---|---|
日期格式 | 氮 | 大批 | 指定dayjs的日期编码格式。 |
地图 | 氮 | 功能 | 自定义 Array.prototype.map() 回调函数用于处理数据。 |
工作表名称 | 氮 | 细绳 | 指定工作表名称。 |
解析器选项 | 氮 | 目的 | 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.github.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 文件。传递给上述写入函数的选项中的formatterOptions将传递给@fast-csv/format模块来写入csv数据。详细信息请参考fast-csv README.md。
使用 npm 模块 dayjs 解析日期。如果未提供 dateFormats 数组,则使用以下 dateFormats:
有关如何构造 dateFormat 的详细信息,请参阅 dayjs CustomParseFormat 插件。
写入 CSV 文件时支持的选项。
场地 | 必需的 | 类型 | 描述 |
---|---|---|---|
日期格式 | 氮 | 细绳 | 指定dayjs的日期编码格式。 |
日期UTC | 氮 | 布尔值 | 指定ExcelJS是否使用dayjs.utc () 来转换时区以解析日期。 |
编码 | 氮 | 细绳 | 指定文件编码格式。 (仅适用于.writeFile 。) |
包含空行 | 氮 | 布尔值 | 指定是否可以写入空行。 |
地图 | 氮 | 功能 | 用于处理行值的自定义 Array.prototype.map() 回调函数。 |
工作表名称 | 氮 | 细绳 | 指定工作表名称。 |
工作表 ID | 氮 | 数字 | 指定工作表 ID。 |
格式化选项 | 氮 | 目的 | 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.github.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 文件。传递给上述写入函数的选项中的formatterOptions将传递给@fast-csv/format模块来写入csv数据。详细信息请参考fast-csv README.md。
日期使用 npm 模块 dayjs 进行格式化。如果未提供 dateFormat,则使用 dayjs.ISO_8601。编写 CSV 时,您可以将布尔值 dateUTC 提供为 true,以使 ExcelJS 解析日期,而无需使用dayjs.utc()
自动转换时区。
上面记录的文件 I/O 要求在写入文件之前在内存中构建整个工作簿。虽然方便,但由于所需的内存量,它会限制文档的大小。
流式写入器(或读取器)在生成工作簿或工作表数据时对其进行处理,并将其转换为文件形式。通常,这对内存的效率要高得多,因为最终的内存占用甚至中间的内存占用比文档版本要紧凑得多,特别是当您考虑到行和单元对象在提交后就会被释放时。
流工作簿和工作表的界面与文档版本几乎相同,但有一些细微的实际差异:
请注意,可以在不提交任何行的情况下构建整个工作簿。提交工作簿时,所有添加的工作表(包括所有未提交的行)将自动提交。然而,在这种情况下,与文档版本相比,几乎没有什么收获。
流式 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 在添加行时不提交行的原因是允许跨行合并单元格:
worksheet . mergeCells ( '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 工作簿阅读器可在 ExcelJS.stream.xlsx 命名空间中使用。
构造函数采用必需的输入参数和可选的选项参数:
争论 | 描述 |
---|---|
输入(必填) | 指定从中读取 XLSX 工作簿的文件或可读流的名称。 |
选项(可选) | 指定如何处理读取解析期间发生的事件类型。 |
选项.条目 | 指定是否发出条目 ( 'emit' ) 或不发出条目 ( 'ignore' )。默认为'emit' 。 |
选项.sharedStrings | 指定是否缓存共享字符串( 'cache' ),这会将它们插入到相应的单元格值中,或者是否发出它们( 'emit' )或忽略它们( 'ignore' ),在这两种情况下,单元格值将是对共享字符串索引的引用。默认为'cache' 。 |
选项.超链接 | 指定是否缓存超链接( 'cache' ),将它们插入到各自的单元格中,是否发出它们( 'emit' )或是否忽略它们( 'ignore' )。默认为'cache' 。 |
选项.样式 | 指定是否缓存样式( '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
返回行数组而不是单独的每一行:nodejs/node#31979
工作簿上的事件是“工作表”、“共享字符串”和“超链接”。工作表上的事件是“行”和“超链接”。
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
}
}
虽然我们强烈鼓励使用异步迭代,但我们还公开了一个流接口以实现向后兼容性。
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 文件夹中。
支持以下值类型。
枚举: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 } ;
worksheet . getCell ( 'A3' ) . value = { formula : 'SUM(A1,A2)' , result : 7 } ;
Cells 还支持方便的 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 getter:
worksheet . getCell ( 'A3' ) . formulaType === Enums . FormulaType . Master ;
worksheet . getCell ( 'B3' ) . formulaType === Enums . FormulaType . Shared ;
公式类型具有以下值:
姓名 | 价值 |
---|---|
Enums.FormulaType.None | 0 |
Enums.FormulaType.Master | 1 |
Enums.FormulaType.Shared | 2 |
在 Excel 中表达共享公式的一种新方法是数组公式。在这种形式中,主单元格是唯一包含与公式相关的任何信息的单元格。它包含 shareType“数组”及其适用的单元格范围以及将复制的公式。其余单元格是具有常规值的常规单元格。
注意:数组公式不会按照共享公式的方式进行转换。因此,如果Master Cell 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! |
尽一切努力使一个良好的一致界面不会突破版本,但令人遗憾的是,有些事情必须为了更大的利益而改变。
回调函数中的参数已交换和更改;它是函数(Rownumber,RowValues),现在是函数(行,rownumber),它使其看起来和感觉更像下划线(_.EAK)函数(_.EAK)函数和优先级,而行中的行对于行号上的行为。
此功能已从返回稀疏的单元格值阵列转变为返回行对象。这可以访问行属性,并有助于管理行样式等。
单元格值的稀疏阵列仍可以通过Worksheet.getrow(Rownumber)。
细胞。风格重命名为Cell.Style
从蓝鸟转变为本机节点Promist的功能返回的承诺,如果蓝鸟的额外功能依靠蓝鸟,它们可能会破坏呼叫代码。
为了减轻这一点,以下两个更改添加到0.3.0:
ExcelJS现在支持Promise库的依赖注入。您可以通过在模块中加入以下代码来还原蓝鸟的承诺...
ExcelJS . config . setValue ( 'promise' , require ( 'bluebird' ) ) ;
请注意:我已经专门用Bluebird测试了Exceljs(因为直到最近,这是它使用的库)。从我完成的测试中,它将无法与Q一起使用。
在发布此模块之前,将源代码转移和处理,然后再将其放置在dist/文件夹中。此读数文件标识了两个文件 - 浏览捆绑包和缩小版本。除了在package.json中指定为“主”的文件之外
本Lib中包含的测试套件包括一个在无头浏览器中执行的小脚本,以验证捆绑包装。在撰写本文时,看来该测试在Windows Linux子系统中表现不佳。
因此,可以通过名为.disable-Test-Browser的文件来禁用浏览器测试
sudo apt-get install libfontconfig
如果任何剪接操作都会影响合并的单元格,则合并组将无法正确移动
版本 | 变化 |
---|---|
0.0.9 |
|
0.1.0 |
|
0.1.1 |
|
0.1.2 |
|
0.1.3 |
|
0.1.5 |
|
0.1.6 |
|
0.1.8 |
|
0.1.9 |
|
0.1.10 |
|
0.1.11 |
|
0.2.0 |
|
0.2.2 |
|
0.2.3 |
|
0.2.4 |
|
0.2.6 |
|
0.2.7 |
|
0.2.8 |
|
0.2.9 |
|
0.2.10 |
|
0.2.11 |
|
0.2.12 |
|
0.2.13 |
|
0.2.14 |
|
0.2.15 |
|
0.2.16 |
|
0.2.17 |
|
0.2.18 |
|
0.2.19 |
|
0.2.20 |
|
0.2.21 |
|
0.2.22 |
|
0.2.23 |
|
0.2.24 |
|
0.2.25 |
|
0.2.26 |
|
0.2.27 |
|
0.2.28 |
|
0.2.29 |
|
0.2.30 |
|
0.2.31 |
|
0.2.32 |
|
0.2.33 |
|
0.2.34 |
|
0.2.35 |
|
0.2.36 |
|
0.2.37 |
|
0.2.38 |
|
0.2.39 |
|
0.2.42 |
|
0.2.43 |
|
0.2.44 |
|
0.2.45 |
|
0.2.46 |
|
0.3.0 |
|
0.3.1 |
|
0.4.0 |
|
0.4.1 |
|
0.4.2 |
|
0.4.3 |
|
0.4.4 |
|
0.4.6 |
|
0.4.9 |
|
0.4.10 |
|
0.4.11 |
|
0.4.12 |
|
0.4.13 |
|
0.4.14 |
|
0.5.0 |
|
0.5.1 |
|
0.6.0 |
|
0.6.1 |
|
0.6.2 |
|
0.7.0 |
|
0.7.1 |
|
0.8.0 |
|
0.8.1 |
|
0.8.2 |
|
0.8.3 |
|
0.8.4 |
|
0.8.5 |
|
0.9.0 |
|
0.9.1 |
|
1.0.0 |
|
1.0.1 |
|
1.0.2 |
|
1.1.0 |
|
1.1.1 |
|
1.1.2 |
|
1.1.3 |
|
1.2.0 |
|
1.2.1 |
|
1.3.0 |
|
1.4.2 |
|
1.4.3 |
|
1.4.5 |
|
1.4.6 |
|
1.4.7 |
|
1.4.8 |
|
1.4.9 |
|
1.4.10 |
|
1.4.12 |
|
1.4.13 |
|
1.5.0 |
|
1.5.1 |
|
1.6.0 |
|
1.6.1 |
|
1.6.2 |
|
1.6.3 |
|
1.7.0 |
|
1.8.0 |
|
1.9.0 |
|
1.9.1 |
|
1.10.0 |
|
1.11.0 |
|
1.12.0 |
|
1.12.1 |
|
1.12.2 |
|
1.13.0 |
|
1.14.0 |
|
1.15.0 |
|
2.0.1 | 主要版本更改引入异步/等待exceljs! JavaScript的新异步和等待功能可以帮助很多使代码更可读和可维护的代码。为了避免混乱,尤其是从异步函数的返回承诺,我们必须删除Promise类配置选项,并且从V2开始,ExcelJS将使用本机承诺。由于这可能是一个破坏的变化,因此我们正在为此版本碰到主要版本。 变化
|
3.0.0 | 另一个主要版本更改多年来,JavaScript发生了很大变化,围绕它的模块和技术也发生了很大的变化。为此,这个主要版本的ExcelJS改变了发布文物的结构: 主要导出现在是原始的JavaScript源在此版本之前,将转录的ES5代码导出为包装主。从现在开始,包装主管直接来自LIB/文件夹。这意味着已经删除了许多依赖项,包括多填充。 ES5和浏览仍然包括在内为了支持那些仍然需要ES5 Ready代码(例如,作为Web应用程序中的依赖关系)的源代码仍将在DIST/ES5中使用。 ES5代码也已浏览并作为Dist/exceljs.js或Dist/exceljs.min.js提供 有关详细信息,请参见输入的部分 |
3.1.0 |
|
3.2.0 |
|
3.3.0 |
|
3.3.1 |
|
3.4.0 |
|
3.5.0 |
|
3.6.0 |
|
3.6.1 |
|
3.7.0 |
|
3.8.0 |
|
3.8.1 |
|
3.8.2 |
|
3.9.0 |
|
3.10.0 |
|
4.0.1 |
|
4.1.0 |
|
4.1.1 |
|
4.2.0 |
|
4.2.1 |
|
4.3.0 |
|