讀取、操作電子表格資料和樣式並將其寫入 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 的角度梯度。請注意此填充,以確保目標 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 毫秒。可以透過設定括號來調整這一點,該括號可用於使流程更快或更彈性。
場地 | 預設 | 描述 |
---|---|---|
Selectlockedcells | 真的 | 讓使用者選擇鎖定的儲存格 |
selectunlockedcells | 真的 | 讓使用者選擇解鎖的儲存格 |
格式 | 錯誤的 | 讓使用者格式儲存格 |
格式化 | 錯誤的 | 讓使用者格式列 |
格式 | 錯誤的 | 讓使用者格式行 |
inserstrows | 錯誤的 | 讓使用者插入行 |
插入 | 錯誤的 | 讓使用者插入列 |
inserthyperlinks | 錯誤的 | 讓用戶插入超鏈接 |
eleterows | 錯誤的 | 讓使用者刪除行 |
Deletecolumns | 錯誤的 | 讓使用者刪除列 |
種類 | 錯誤的 | 讓用戶排序數據 |
自動移動器 | 錯誤的 | 讓使用者過濾器資料在表中 |
樞紐 | 錯誤的 | 讓使用者使用樞軸表 |
鏈 | 100000 | 保護或無保護時執行的劇本數量 |
讀取XLSX檔時支援的選項。
場地 | 必需的 | 類型 | 描述 |
---|---|---|---|
無知 | 氮 | 大批 | 載入XLSX文件時要忽略的節點名稱清單。在某些情況下提高效能。 Available: 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檔案時支援的選項。
場地 | 必需的 | 類型 | 描述 |
---|---|---|---|
dateformats | 氮 | 大批 | 指定Dayjs的日期編碼格式。 |
地圖 | 氮 | 功能 | 自訂ARRAY.PROTOTYPE.MAP()回呼功能用於處理資料。 |
SheetName | 氮 | 細繩 | 指定工作表名稱。 |
分類 | 氮 | 目的 | parseoptions選項 @fast-csv/格式模組編寫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/格式模組以編寫CSV資料。有關詳細信息,請參考Fast-CSV readme.md。
使用NPM模組Dayjs解析日期。如果未提供dateformats數組,則使用以下dateformats:
有關如何建立dateFormat的詳細信息,請參考Dayjs customparseformat插件。
寫入CSV檔案時支援的選項。
場地 | 必需的 | 類型 | 描述 |
---|---|---|---|
dateformat | 氮 | 細繩 | 指定Dayjs的日期編碼格式。 |
dateutc | 氮 | 布林值 | 指定ExcelJS是否使用dayjs.utc () 將時區轉換為解析日期。 |
編碼 | 氮 | 細繩 | 指定文件編碼格式。 (僅適用於.writeFile 。) |
包括emptermentyrows | 氮 | 布林值 | 指定是否可以寫空白行。 |
地圖 | 氮 | 功能 | custom array.prototype.map()回呼函數,用於處理行值。 |
SheetName | 氮 | 細繩 | 指定工作表名稱。 |
工作表 ID | 氮 | 數位 | 指定工作表ID。 |
構造 | 氮 | 目的 | formatteroptions選項 @fast-csv/格式模組編寫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/格式模組以編寫CSV資料。有關詳細信息,請參考Fast-CSV readme.md。
使用NPM模組Dayjs格式化日期。如果未提供dateformat,則使用dayjs.so_8601。在編寫CSV時,您可以將布林dateutc提供為真實的exceljs解析日期,而無需自動使用dayjs.utc()
自動轉換時區。
上面記錄的文件I/O要求將整個工作簿在記憶中構建,然後才能編寫文件。雖然方便,但由於所需的記憶體量,它可以限製文件的大小。
串流媒體作者(或讀者)產生的工作簿或工作表數據,將其轉換為文件表單。通常,由於最終的記憶體足跡甚至中間的記憶體足跡比文件版本要緊湊得多,因此這在記憶體上要高得多,尤其是當您考慮到一旦投入行時,將它們放置。
串流媒體工作簿和工作表的介面幾乎與文件版本幾乎相同,具有一些較小的實際差異:
請注意,可以建立整個工作簿而無需進行任何行。完成工作簿後,所有新增的工作表(包括所有未承諾的行)將自動投入。但是,在這種情況下,文件版本幾乎沒有收穫。
串流XLSX Workbook Writer可在exceljs.stream.xlsx名稱空間中找到。
建構函數採用以下欄位的可選選項物件:
場地 | 描述 |
---|---|
溪流 | 指定寫入XLSX工作簿的可寫入流。 |
檔案名稱 | 如果未指定流,則此欄位指定將XLSX Workbook寫入的檔案的路徑。 |
USESHAREDSTRINGS | 指定是否在工作簿中使用共享字串。預設為false 。 |
企業 | 指定是否將樣式資訊新增至工作簿。樣式可以增加一些效能開銷。預設為false 。 |
拉鍊 | exceljs內部傳遞給Archiver的ZIP選項。預設值undefined 。 |
如果選項中均未指定流程和檔案名,則工作簿編寫者將建立一個streambuf對象,該物件將XLSX工作簿的內容儲存在記憶體中。可透過屬性workbook.stream存取的StreamBuf物件可用於直接透過Stream.Read.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 ( ) ;
工作表格作者不添加的行不提交行的原因是允許將單元組合到行中:
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工作簿的可讀流。 |
選項(可選) | 指定如何處理讀取過程中發生的事件類型。 |
options.entries | 指定是否要發射條目( 'emit' )( 'ignore' )。預設值為'emit' 。 |
options.sharedstrings | 指定將它們插入相應的單元格值的緩存共享字串( 'cache' ),還是發射它們( 'emit' )還是忽略它們( 'ignore' ),在這種情況下,單元格值將是對共享字串索引的引用。預設值為'cache' 。 |
options.hyperlinks | 指定是否要插入它們各自的儲存格(“ 'emit' 'cache' )或是否忽略它們( 'ignore' ),將它們插入各自的儲存格中。預設值為'cache' 。 |
選項。 | 指定是否要將它們插入各自的行和儲存格中,還是忽略它們( 'cache' 'ignore' )。預設值為'cache' 。 |
options.worksheets | 指定是否要發射工作表( '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儲存庫中的規格/瀏覽器資料夾。
以下檔案是預先捆綁的,並包含在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公式。請注意,儘管單元格類型將是公式,但單元格可能具有從結果值中得出的有效型值。
請注意,ExcelJS無法處理公式以產生結果,必須提供。
請注意,功能語義名稱必須是英語,且分隔符號必須是逗號。
例如
worksheet . getCell ( 'A3' ) . value = { formula : 'A1+A2' , result : 7 } ;
worksheet . getCell ( 'A3' ) . value = { formula : 'SUM(A1,A2)' , result : 7 } ;
細胞還支持便利的獲取器訪問公式並結果:
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 } ;
這指定單元格是一個公式,將從A2中的公式中得出,其結果為10。
公式便利性獲取將將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 ) ;
要區分真實和翻譯的配方單元,請使用配方型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中表達共享公式的新方法是陣列公式。在這種形式中,主電池是唯一包含與公式相關的任何資訊的單元格。它包含共用類型的「陣列」以及所套用的儲存格範圍以及將要複製的公式。其餘的細胞是具有常規值的常規細胞。
注意:數組公式不會以共享公式的方式翻譯。因此,如果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)。
細胞。
從藍鳥轉變為本機節點承諾的功能返回的承諾,如果它們依靠Bluebird的額外功能,它們可能會破壞呼叫代碼。
為了減輕這一點,以下兩個更改添加到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 | Major Version ChangeIntroducing async/await to ExcelJS! The new async and await features of JavaScript can help a lot to make code more readable and maintainable. To avoid confusion, particularly with returned promises from async functions, we have had to remove the Promise class configuration option and from v2 onwards ExcelJS will use native Promises. Since this is potentially a breaking change we're bumping the major version for this release. 變化
|
3.0.0 | Another Major Version ChangeJavascript has changed a lot over the years, and so have the modules and technologies surrounding it. To this end, this major version of ExcelJS changes the structure of the publish artefacts: Main Export is now the Original Javascript SourcePrior to this release, the transpiled ES5 code was exported as the package main. From now on, the package main comes directly from the lib/ folder. This means a number of dependencies have been removed, including the polyfills. ES5 and Browserify are Still IncludedIn order to support those that still require ES5 ready code (eg as dependencies in web apps) the source code will still be transpiled and available in dist/es5. The ES5 code is also browserified and available as dist/exceljs.js or dist/exceljs.min.js See the section Importing for details |
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 |
|