อ่าน จัดการ และเขียนข้อมูลและสไตล์สเปรดชีตลงใน XLSX และ JSON
วิศวกรรมย้อนกลับจากไฟล์สเปรดชีต Excel เป็นโครงการ
npm install exceljs
ยินดีเป็นอย่างยิ่ง! ช่วยให้ฉันรู้ว่าคุณสมบัติใดที่ต้องการหรือข้อบกพร่องใดที่ทำให้เกิดความเจ็บปวดมากที่สุด
ฉันมีคำขอเพียงข้อเดียว หากคุณส่งคำขอดึงเพื่อแก้ไขข้อผิดพลาด โปรดเพิ่มการทดสอบหน่วยหรือการทดสอบการรวม (ในโฟลเดอร์ข้อมูลจำเพาะ) ที่จับปัญหาได้ แม้แต่ PR ที่เพิ่งผ่านการทดสอบล้มเหลวก็ยังดี ฉันสามารถวิเคราะห์ได้ว่าการทดสอบกำลังทำอะไรอยู่ และแก้ไขโค้ดจากสิ่งนั้นได้
หมายเหตุ: โปรดพยายามหลีกเลี่ยงการแก้ไขเวอร์ชันแพ็คเกจใน PR เวอร์ชันต่างๆ ได้รับการอัปเดตเมื่อวางจำหน่าย และการเปลี่ยนแปลงใดๆ มักจะส่งผลให้เกิดการชนกันของการรวม
เพื่อให้ชัดเจน การสนับสนุนทั้งหมดที่เพิ่มในห้องสมุดนี้จะรวมอยู่ในใบอนุญาต MIT ของห้องสมุด
const ExcelJS = require ( 'exceljs' ) ;
หากต้องการใช้โค้ดที่แปลง ES5 เช่น สำหรับ node.js เวอร์ชันเก่ากว่า 10 ให้ใช้เส้นทาง dist/es5
const ExcelJS = require ( 'exceljs/dist/es5' ) ;
หมายเหตุ: บิลด์ ES5 มีการพึ่งพาโดยนัยกับโพลีฟิลจำนวนหนึ่งซึ่ง 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 คุณจะต้องมีโพลีฟิลเพื่อรองรับรูปแบบ Unicode regex ตัวอย่างเช่น,
const rewritePattern = require ( 'regexpu-core' ) ;
const { generateRegexpuOptions } = require ( '@babel/helper-create-regexp-features-plugin/lib/util' ) ;
const { RegExp } = global ;
try {
new RegExp ( 'a' , 'u' ) ;
} catch ( err ) {
global . RegExp = function ( pattern , flags ) {
if ( flags && flags . includes ( 'u' ) ) {
return new RegExp ( rewritePattern ( pattern , flags , generateRegexpuOptions ( { flags , pattern } ) ) ) ;
}
return new RegExp ( pattern , flags ) ;
} ;
global . RegExp . prototype = RegExp . 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 ;
คุณสมบัติที่รองรับ
ชื่อ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|
แท็บสี | ไม่ได้กำหนด | สีของแท็บ |
เค้าร่างระดับCol | 0 | ระดับเค้าร่างของคอลัมน์แผ่นงาน |
โครงร่างระดับแถว | 0 | ระดับโครงร่างแถวของเวิร์กชีต |
ค่าเริ่มต้นRowHeight | 15 | ความสูงของแถวเริ่มต้น |
ค่าเริ่มต้น ColWidth | (ไม่จำเป็น) | ความกว้างของคอลัมน์เริ่มต้น |
dyDescent | 55 | จะแจ้งภายหลัง |
มีการเพิ่มตัวชี้วัดใหม่บางส่วนลงในแผ่นงาน...
ชื่อ | คำอธิบาย |
---|---|
แถวนับ | ขนาดแถวรวมของเอกสาร เท่ากับหมายเลขแถวของแถวสุดท้ายที่มีค่า |
จริงRowCount | การนับจำนวนแถวที่มีค่า หากแถวกลางเอกสารว่างเปล่า แถวนั้นจะไม่ถูกรวมในการนับ |
คอลัมน์นับ | ขนาดคอลัมน์รวมของเอกสาร เท่ากับจำนวนเซลล์สูงสุดจากแถวทั้งหมด |
จริงColumnCount | การนับจำนวนคอลัมน์ที่มีค่า |
คุณสมบัติทั้งหมดที่อาจส่งผลต่อการพิมพ์แผ่นงานจะถูกเก็บไว้ในวัตถุ 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 |
พอดีToPage | ว่าจะใช้ fitToWidth และ fitToHeight หรือการตั้งค่ามาตราส่วน ค่าเริ่มต้นจะขึ้นอยู่กับการมีอยู่ของการตั้งค่าเหล่านี้ในออบเจ็กต์การตั้งค่าหน้า - หากมีทั้งสองอย่าง มาตราส่วนจะชนะ (เช่น ค่าเริ่มต้นจะเป็นเท็จ) | |
หน้าสั่งซื้อ | 'ลงแล้วโอเวอร์' | ลำดับใดที่จะพิมพ์หน้า - หนึ่งใน ['downThenOver', 'overThenDown'] |
สีดำและสีขาว | เท็จ | พิมพ์โดยไม่มีสี |
ร่าง | เท็จ | พิมพ์ด้วยคุณภาพน้อยลง (และหมึก) |
ความคิดเห็นของเซลล์ | 'ไม่มี' | ตำแหน่งที่จะแสดงความคิดเห็น - หนึ่งใน ['atEnd', 'asDisplayed', 'None'] |
ข้อผิดพลาด | 'แสดง' | ตำแหน่งที่จะแสดงข้อผิดพลาด - หนึ่งใน ['dash', 'blank', 'NA', 'displayed'] |
มาตราส่วน | 100 | ค่าเปอร์เซ็นต์เพื่อเพิ่มหรือลดขนาดของการพิมพ์ ใช้งานเมื่อ fitToPage เป็นเท็จ |
พอดีกับความกว้าง | 1 | ควรพิมพ์แผ่นงานกว้างกี่หน้า ใช้งานเมื่อ fitToPage เป็นจริง |
พอดีกับความสูง | 1 | แผ่นงานควรพิมพ์ได้สูงกี่หน้า ใช้งานเมื่อ fitToPage เป็นจริง |
ขนาดกระดาษ | ใช้กระดาษขนาดใด (ดูด้านล่าง) | |
showRowColHeaders | เท็จ | จะแสดงหมายเลขแถวและตัวอักษรคอลัมน์หรือไม่ |
showGridLines | เท็จ | จะแสดงเส้นตารางหรือไม่ |
หมายเลขหน้าแรก | จะใช้เบอร์ไหนในหน้าแรก | |
แนวนอนกึ่งกลาง | เท็จ | ไม่ว่าจะจัดกึ่งกลางข้อมูลชีตในแนวนอนหรือไม่ |
แนวตั้งกึ่งกลาง | เท็จ | ไม่ว่าจะจัดกึ่งกลางข้อมูลชีตในแนวตั้งหรือไม่ |
ตัวอย่างขนาดกระดาษ
ชื่อ | ค่า |
---|---|
จดหมาย | ไม่ได้กำหนด |
ถูกกฎหมาย | 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"
รองรับการตั้งค่า headerFooter
ชื่อ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|
แตกต่างกันก่อน | เท็จ | ตั้งค่าของ differentFirst ให้เป็นจริง ซึ่งบ่งชี้ว่าส่วนหัว/ส่วนท้ายสำหรับหน้าแรกแตกต่างจากหน้าอื่นๆ |
แตกต่างคี่คู่ | เท็จ | ตั้งค่าของ differentOddEven ให้เป็นจริง ซึ่งบ่งชี้ว่าส่วนหัว/ส่วนท้ายสำหรับหน้าคี่และหน้าคู่ต่างกัน |
ส่วนหัวแปลก | โมฆะ | ตั้งค่าสตริงส่วนหัวสำหรับหน้าคี่ (ค่าเริ่มต้น) สามารถจัดรูปแบบสตริงได้ |
คี่ฟุตเตอร์ | โมฆะ | ตั้งค่าสตริงส่วนท้ายสำหรับหน้าคี่ (ค่าเริ่มต้น) สามารถจัดรูปแบบสตริงได้ |
แม้กระทั่ง Header | โมฆะ | ตั้งค่าสตริงส่วนหัวสำหรับหน้าคู่ สามารถจัดรูปแบบสตริงได้ |
แม้กระทั่ง Footer | โมฆะ | ตั้งค่าสตริงส่วนท้ายสำหรับหน้าคู่ สามารถจัดรูปแบบสตริงได้ |
อันดับแรกHeader | โมฆะ | ตั้งค่าสตริงส่วนหัวสำหรับหน้าแรก สามารถจัดรูปแบบสตริงได้ |
อันดับแรกส่วนท้าย | โมฆะ | ตั้งค่าสตริงส่วนท้ายสำหรับหน้าแรก สามารถจัดรูปแบบสตริงได้ |
คำสั่งสคริปต์
คำสั่ง | คำอธิบาย |
---|---|
&ล | กำหนดตำแหน่งไปทางซ้าย |
แอนด์ซี | กำหนดตำแหน่งให้อยู่ตรงกลาง |
&อาร์ | กำหนดตำแหน่งไปทางขวา |
แอนด์พี | หมายเลขหน้าปัจจุบัน |
แอนด์เอ็น | จำนวนหน้าทั้งหมด |
&ดี | วันที่ปัจจุบัน |
&ที | เวลาปัจจุบัน |
&จี | รูปภาพ |
&ก | ชื่อแผ่นงาน |
&เอฟ | ชื่อไฟล์ |
แอนด์บี | ทำให้ข้อความเป็นตัวหนา |
&ฉัน | ทำให้ข้อความเป็นตัวเอียง |
&คุณ | ขีดเส้นใต้ข้อความ |
&"ชื่อแบบอักษร" | ชื่อฟอนต์ เช่น &"Aril" |
&ขนาดตัวอักษร | ขนาดตัวอักษร เช่น 12 |
&KHEXCode | สีตัวอักษร เช่น &KCCCCCC |
ขณะนี้แผ่นงานสนับสนุนรายการมุมมองที่ควบคุมวิธีที่ Excel นำเสนอแผ่นงาน:
แต่ละมุมมองยังรองรับคุณสมบัติต่างๆ:
ชื่อ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|
สถานะ | 'ปกติ' | ควบคุมสถานะมุมมอง - หนึ่งในสถานะปกติ แช่แข็ง หรือแยก |
ขวาไปซ้าย | เท็จ | ตั้งค่าการวางแนวของมุมมองเวิร์กชีตเป็นแบบขวาไปซ้าย |
เซลล์ที่ใช้งานอยู่ | ไม่ได้กำหนด | เซลล์ที่เลือกในปัจจุบัน |
แสดงไม้บรรทัด | จริง | แสดงหรือซ่อนไม้บรรทัดในเค้าโครงหน้า |
showRowColHeaders | จริง | แสดงหรือซ่อนส่วนหัวของแถวและคอลัมน์ (เช่น A1, B1 ที่ด้านบนและ 1,2,3 ทางด้านซ้าย |
showGridLines | จริง | แสดงหรือซ่อนเส้นตาราง (แสดงสำหรับเซลล์ที่ไม่ได้กำหนดเส้นขอบ) |
ซูมสเกล | 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 หรือไม่ได้กำหนด |
เซลล์ซ้ายบน | ไม่ได้กำหนด | เซลล์ใดจะอยู่ด้านซ้ายบนในบานหน้าต่างด้านขวาล่าง |
บานหน้าต่างที่ใช้งานอยู่ | ไม่ได้กำหนด | บานหน้าต่างใดที่จะใช้งาน - หนึ่งใน topLeft, topRight, BottomLeft และ BottomRight |
worksheet . views = [
{ state : 'split' , xSplit : 2000 , ySplit : 3000 , topLeftCell : 'G10' , activeCell : 'A1' }
] ;
คุณสามารถใช้ตัวกรองอัตโนมัติกับแผ่นงานของคุณได้
worksheet . autoFilter = 'A1:C1' ;
แม้ว่าสตริงช่วงจะเป็นรูปแบบมาตรฐานของตัวกรองอัตโนมัติ แต่เวิร์กชีตจะสนับสนุนค่าต่อไปนี้ด้วย:
// Set an auto filter from A1 to C1
worksheet . autoFilter = {
from : 'A1' ,
to : 'C1' ,
}
// Set an auto filter from the cell in row 3 and column 1
// to the cell in row 5 and column 12
worksheet . autoFilter = {
from : {
row : 3 ,
column : 1
} ,
to : {
row : 5 ,
column : 12
}
}
// Set an auto filter from D3 to the
// cell in row 7 and column 5
worksheet . autoFilter = {
from : 'D3' ,
to : {
row : 7 ,
column : 5
}
}
// Add column headers and define column keys and widths
// Note: these column structures are a workbook-building convenience only,
// apart from the column width, they will not be fully persisted.
worksheet . columns = [
{ header : 'Id' , key : 'id' , width : 10 } ,
{ header : 'Name' , key : 'name' , width : 32 } ,
{ header : 'D.O.B.' , key : 'DOB' , width : 10 , outlineLevel : 1 }
] ;
// Access an individual columns by key, letter and 1-based column number
const idCol = worksheet . getColumn ( 'id' ) ;
const nameCol = worksheet . getColumn ( 'B' ) ;
const dobCol = worksheet . getColumn ( 3 ) ;
// set column properties
// Note: will overwrite cell value C1
dobCol . header = 'Date of Birth' ;
// Note: this will overwrite cell values C1:C2
dobCol . header = [ 'Date of Birth' , 'A.K.A. D.O.B.' ] ;
// from this point on, this column will be indexed by 'dob' and not 'DOB'
dobCol . key = 'dob' ;
dobCol . width = 15 ;
// Hide the column if you'd like
dobCol . hidden = true ;
// set an outline level for columns
worksheet . getColumn ( 4 ) . outlineLevel = 0 ;
worksheet . getColumn ( 5 ) . outlineLevel = 1 ;
// columns support a readonly field to indicate the collapsed state based on outlineLevel
expect ( worksheet . getColumn ( 4 ) . collapsed ) . to . equal ( false ) ;
expect ( worksheet . getColumn ( 5 ) . collapsed ) . to . equal ( true ) ;
// iterate over all current cells in this column
dobCol . eachCell ( function ( cell , rowNumber ) {
// ...
} ) ;
// iterate over all current cells in this column including empty cells
dobCol . eachCell ( { includeEmpty : true } , function ( cell , rowNumber ) {
// ...
} ) ;
// add a column of new values
worksheet . getColumn ( 6 ) . values = [ 1 , 2 , 3 , 4 , 5 ] ;
// add a sparse column of values
worksheet . getColumn ( 7 ) . values = [ , , 2 , 3 , , 5 , , 7 , , , , 11 ] ;
// cut one or more columns (columns to the right are shifted left)
// If column properties have been defined, they will be cut or moved accordingly
// Known Issue: If a splice causes any merged cells to move, the results may be unpredictable
worksheet . spliceColumns ( 3 , 2 ) ;
// remove one column and insert two more.
// Note: columns 4 and above will be shifted right by 1 column.
// Also: If the worksheet has more rows than values in the column inserts,
// the rows will still be shifted as if the values existed
const newCol3Values = [ 1 , 2 , 3 , 4 , 5 ] ;
const newCol4Values = [ 'one' , 'two' , 'three' , 'four' , 'five' ] ;
worksheet . spliceColumns ( 3 , 1 , newCol3Values , newCol4Values ) ;
// Get a row object. If it doesn't already exist, a new empty one will be returned
const row = worksheet . getRow ( 5 ) ;
// Get multiple row objects. If it doesn't already exist, new empty ones will be returned
const rows = worksheet . getRows ( 5 , 2 ) ; // start, length (>0, else undefined is returned)
// Get the last editable row in a worksheet (or undefined if there are none)
const row = worksheet . lastRow ;
// Set a specific row height
row . height = 42.5 ;
// make row hidden
row . hidden = true ;
// set an outline level for rows
worksheet . getRow ( 4 ) . outlineLevel = 0 ;
worksheet . getRow ( 5 ) . outlineLevel = 1 ;
// rows support a readonly field to indicate the collapsed state based on outlineLevel
expect ( worksheet . getRow ( 4 ) . collapsed ) . to . equal ( false ) ;
expect ( worksheet . getRow ( 5 ) . collapsed ) . to . equal ( true ) ;
row . getCell ( 1 ) . value = 5 ; // A5's value set to 5
row . getCell ( 'name' ) . value = 'Zeb' ; // B5's value set to 'Zeb' - assuming column 2 is still keyed by name
row . getCell ( 'C' ) . value = new Date ( ) ; // C5's value set to now
// Get a row as a sparse array
// Note: interface change: worksheet.getRow(4) ==> worksheet.getRow(4).values
row = worksheet . getRow ( 4 ) . values ;
expect ( row [ 5 ] ) . toEqual ( 'Kyle' ) ;
// assign row values by contiguous array (where array element 0 has a value)
row . values = [ 1 , 2 , 3 ] ;
expect ( row . getCell ( 1 ) . value ) . toEqual ( 1 ) ;
expect ( row . getCell ( 2 ) . value ) . toEqual ( 2 ) ;
expect ( row . getCell ( 3 ) . value ) . toEqual ( 3 ) ;
// assign row values by sparse array (where array element 0 is undefined)
const values = [ ]
values [ 5 ] = 7 ;
values [ 10 ] = 'Hello, World!' ;
row . values = values ;
expect ( row . getCell ( 1 ) . value ) . toBeNull ( ) ;
expect ( row . getCell ( 5 ) . value ) . toEqual ( 7 ) ;
expect ( row . getCell ( 10 ) . value ) . toEqual ( 'Hello, World!' ) ;
// assign row values by object, using column keys
row . values = {
id : 13 ,
name : 'Thing 1' ,
dob : new Date ( )
} ;
// Insert a page break below the row
row . addPageBreak ( ) ;
// Iterate over all rows that have values in a worksheet
worksheet . eachRow ( function ( row , rowNumber ) {
console . log ( 'Row ' + rowNumber + ' = ' + JSON . stringify ( row . values ) ) ;
} ) ;
// Iterate over all rows (including empty rows) in a worksheet
worksheet . eachRow ( { includeEmpty : true } , function ( row , rowNumber ) {
console . log ( 'Row ' + rowNumber + ' = ' + JSON . stringify ( row . values ) ) ;
} ) ;
// Iterate over all non-null cells in a row
row . eachCell ( function ( cell , colNumber ) {
console . log ( 'Cell ' + colNumber + ' = ' + cell . value ) ;
} ) ;
// Iterate over all cells in a row (including empty cells)
row . eachCell ( { includeEmpty : true } , function ( cell , colNumber ) {
console . log ( 'Cell ' + colNumber + ' = ' + cell . value ) ;
} ) ;
// Commit a completed row to stream
row . commit ( ) ;
// row metrics
const rowSize = row . cellCount ;
const numValues = row . actualCellCount ;
// Add a couple of Rows by key-value, after the last current row, using the column keys
worksheet . addRow ( { id : 1 , name : 'John Doe' , dob : new Date ( 1970 , 1 , 1 ) } ) ;
worksheet . addRow ( { id : 2 , name : 'Jane Doe' , dob : new Date ( 1965 , 1 , 7 ) } ) ;
// Add a row by contiguous Array (assign to columns A, B & C)
worksheet . addRow ( [ 3 , 'Sam' , new Date ( ) ] ) ;
// Add a row by sparse Array (assign to columns A, E & I)
const rowValues = [ ] ;
rowValues [ 1 ] = 4 ;
rowValues [ 5 ] = 'Kyle' ;
rowValues [ 9 ] = new Date ( ) ;
worksheet . addRow ( rowValues ) ;
// Add a row with inherited style
// This new row will have same style as last row
// And return as row object
const newRow = worksheet . addRow ( rowValues , 'i' ) ;
// Add an array of rows
const rows = [
[ 5 , 'Bob' , new Date ( ) ] , // row by array
{ id : 6 , name : 'Barbara' , dob : new Date ( ) }
] ;
// add new rows and return them as array of row objects
const newRows = worksheet . addRows ( rows ) ;
// Add an array of rows with inherited style
// These new rows will have same styles as last row
// and return them as array of row objects
const newRowsStyled = worksheet . addRows ( rows , 'i' ) ;
พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น |
---|---|---|
ค่า/วินาที | ค่าแถว/s ใหม่ | |
สไตล์ | 'i' สำหรับสืบทอดจากแถวด้านบน 'i+' เพื่อรวมเซลล์ว่าง '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' ) ;
พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น |
---|---|---|
ตำแหน่ง | หมายเลขแถวที่คุณต้องการแทรก โดยกดแถวทั้งหมดลงจากนั้น | |
ค่า/วินาที | ค่าแถว/s ใหม่ | |
สไตล์ | 'i' สำหรับสืบทอดจากแถวด้านบน , 'i+' เพื่อรวมเซลล์ว่าง, 'o' สำหรับรูปแบบดั้งเดิม, 'o+' เพื่อรวมเซลล์ว่าง, 'n' สำหรับไม่มี | 'ไม่' |
// Cut one or more rows (rows below are shifted up)
// Known Issue: If a splice causes any merged cells to move, the results may be unpredictable
worksheet . spliceRows ( 4 , 3 ) ;
// remove one row and insert two more.
// Note: rows 4 and below will be shifted down by 1 row.
const newRow3Values = [ 1 , 2 , 3 , 4 , 5 ] ;
const newRow4Values = [ 'one' , 'two' , 'three' , 'four' , 'five' ] ;
worksheet . spliceRows ( 3 , 1 , newRow3Values , newRow4Values ) ;
// Cut one or more cells (cells to the right are shifted left)
// Note: this operation will not affect other rows
row . splice ( 3 , 2 ) ;
// remove one cell and insert two more (cells to the right of the cut cell will be shifted right)
row . splice ( 4 , 1 , 'new value 1' , 'new value 2' ) ;
พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น |
---|---|---|
เริ่ม | จุดเริ่มต้นที่จะประกบกัน | |
นับ | จำนวนแถว/เซลล์ที่จะลบ | |
...ส่วนแทรก | ค่าแถว/เซลล์ใหม่ที่จะแทรก |
duplicateRow ( start , amount = 1 , insert = true )
const wb = new ExcelJS . Workbook ( ) ;
const ws = wb . addWorksheet ( 'duplicateTest' ) ;
ws . getCell ( 'A1' ) . value = 'One' ;
ws . getCell ( 'A2' ) . value = 'Two' ;
ws . getCell ( 'A3' ) . value = 'Three' ;
ws . getCell ( 'A4' ) . value = 'Four' ;
// This line will duplicate the row 'One' twice but it will replace rows 'Two' and 'Three'
// if third param was true so it would insert 2 new rows with the values and styles of row 'One'
ws . duplicateRow ( 1 , 2 , false ) ;
พารามิเตอร์ | คำอธิบาย | ค่าเริ่มต้น |
---|---|---|
เริ่ม | หมายเลขแถวที่คุณต้องการทำซ้ำ (อันดับแรกใน Excel คือ 1) | |
จำนวน | เวลาที่คุณต้องการทำซ้ำแถว | 1 |
แทรก | จริง หากคุณต้องการแทรกแถวใหม่สำหรับรายการที่ซ้ำกัน หรือ เป็นเท็จ หากคุณต้องการแทนที่ | จริง |
แต่ละเซลล์ (หรือหลายกลุ่มของเซลล์) สามารถกำหนดชื่อให้กับเซลล์เหล่านั้นได้ ชื่อสามารถนำมาใช้ในสูตรและการตรวจสอบความถูกต้องของข้อมูล (และอาจมากกว่านั้น)
// assign (or get) a name for a cell (will overwrite any other names that cell had)
worksheet . getCell ( 'A1' ) . name = 'PI' ;
expect ( worksheet . getCell ( 'A1' ) . name ) . to . equal ( 'PI' ) ;
// assign (or get) an array of names for a cell (cells can have more than one name)
worksheet . getCell ( 'A1' ) . names = [ 'thing1' , 'thing2' ] ;
expect ( worksheet . getCell ( 'A1' ) . names ) . to . have . members ( [ 'thing1' , 'thing2' ] ) ;
// remove a name from a cell
worksheet . getCell ( 'A1' ) . removeName ( 'thing1' ) ;
expect ( worksheet . getCell ( 'A1' ) . names ) . to . have . members ( [ 'thing2' ] ) ;
เซลล์สามารถกำหนดค่าที่ถูกต้องหรือไม่และแจ้งให้ผู้ใช้ช่วยแนะนำได้
ประเภทการตรวจสอบสามารถเป็นอย่างใดอย่างหนึ่งต่อไปนี้:
พิมพ์ | คำอธิบาย |
---|---|
รายการ | กำหนดชุดค่าที่ถูกต้องแยกกัน Excel จะเสนอสิ่งเหล่านี้ในรูปแบบดรอปดาวน์เพื่อให้ป้อนข้อมูลได้ง่าย |
ทั้งหมด | ค่าต้องเป็นจำนวนเต็ม |
ทศนิยม | ค่าต้องเป็นเลขทศนิยม |
ข้อความความยาว | ค่าอาจเป็นข้อความแต่ควบคุมความยาวได้ |
กำหนดเอง | สูตรแบบกำหนดเองจะควบคุมค่าที่ถูกต้อง |
สำหรับประเภทอื่นที่ไม่ใช่รายการหรือแบบกำหนดเอง ตัวดำเนินการต่อไปนี้จะส่งผลต่อการตรวจสอบ:
ผู้ดำเนินการ | คำอธิบาย |
---|---|
ระหว่าง | ค่าต้องอยู่ระหว่างผลลัพธ์ของสูตร |
ไม่ระหว่าง | ค่าต้องไม่อยู่ระหว่างผลลัพธ์ของสูตร |
เท่ากัน | ค่าจะต้องเท่ากับผลลัพธ์ของสูตร |
ไม่เท่าเทียมกัน | ค่าต้องไม่เท่ากับผลลัพธ์ของสูตร |
ยิ่งใหญ่กว่า | ค่าต้องมากกว่าผลลัพธ์ของสูตร |
น้อยกว่า | ค่าต้องน้อยกว่าผลลัพธ์ของสูตร |
มากกว่าหรือเท่ากับ | ค่าต้องมากกว่าหรือเท่ากับผลลัพธ์ของสูตร |
น้อยกว่าหรือเท่ากับ | ค่าต้องน้อยกว่าหรือเท่ากับผลลัพธ์ของสูตร |
// Specify list of valid values (One, Two, Three, Four).
// Excel will provide a dropdown with these values.
worksheet . getCell ( 'A1' ) . dataValidation = {
type : 'list' ,
allowBlank : true ,
formulae : [ '"One,Two,Three,Four"' ]
} ;
// Specify list of valid values from a range.
// Excel will provide a dropdown with these values.
worksheet . getCell ( 'A1' ) . dataValidation = {
type : 'list' ,
allowBlank : true ,
formulae : [ '$D$5:$F$5' ]
} ;
// Specify Cell must be a whole number that is not 5.
// Show the user an appropriate error message if they get it wrong
worksheet . getCell ( 'A1' ) . dataValidation = {
type : 'whole' ,
operator : 'notEqual' ,
showErrorMessage : true ,
formulae : [ 5 ] ,
errorStyle : 'error' ,
errorTitle : 'Five' ,
error : 'The value must not be Five'
} ;
// Specify Cell must be a decimal number between 1.5 and 7.
// Add 'tooltip' to help guid the user
worksheet . getCell ( 'A1' ) . dataValidation = {
type : 'decimal' ,
operator : 'between' ,
allowBlank : true ,
showInputMessage : true ,
formulae : [ 1.5 , 7 ] ,
promptTitle : 'Decimal' ,
prompt : 'The value must between 1.5 and 7'
} ;
// Specify Cell must be have a text length less than 15
worksheet . getCell ( 'A1' ) . dataValidation = {
type : 'textLength' ,
operator : 'lessThan' ,
showErrorMessage : true ,
allowBlank : true ,
formulae : [ 15 ]
} ;
// Specify Cell must be have be a date before 1st Jan 2016
worksheet . getCell ( 'A1' ) . dataValidation = {
type : 'date' ,
operator : 'lessThan' ,
showErrorMessage : true ,
allowBlank : true ,
formulae : [ new Date ( 2016 , 0 , 1 ) ]
} ;
เพิ่มความคิดเห็นแบบเก่าลงในเซลล์
// plain text note
worksheet . getCell ( 'A1' ) . note = 'Hello, ExcelJS!' ;
// colourful formatted note
ws . getCell ( 'B1' ) . note = {
texts : [
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 0 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : 'This is ' } ,
{ 'font' : { 'italic' : true , 'size' : 12 , 'color' : { 'theme' : 0 } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'a' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' ' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'argb' : 'FFFF6600' } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'colorful' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' text ' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'argb' : 'FFCCFFCC' } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'with' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' in-cell ' } ,
{ 'font' : { 'bold' : true , 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : 'format' } ,
] ,
margins : {
insetmode : 'custom' ,
inset : [ 0.25 , 0.25 , 0.35 , 0.35 ]
} ,
protection : {
locked : True ,
lockText : False
} ,
editAs : 'twoCells' ,
} ;
ตารางต่อไปนี้กำหนดคุณสมบัติที่ความคิดเห็นของเซลล์รองรับ
สนาม | ที่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
ข้อความ | ย | ข้อความของความคิดเห็น | |
ระยะขอบ | เอ็น | - | กำหนดค่าของระยะขอบสำหรับความคิดเห็นในเซลล์อัตโนมัติหรือแบบกำหนดเอง |
การป้องกัน | เอ็น | - | การระบุสถานะการล็อคของวัตถุและข้อความของวัตถุโดยใช้คุณลักษณะการป้องกัน |
แก้ไขเป็น | เอ็น | 'แน่นอน' | ใช้แอตทริบิวต์ 'editAs' เพื่อระบุวิธีการยึดคำอธิบายประกอบกับเซลล์ |
กำหนดโหมดการตั้งค่าระยะขอบหน้าของคำอธิบายประกอบเซลล์ โหมดอัตโนมัติหรือแบบกำหนดเอง
ws . getCell ( 'B1' ) . note . margins = {
insetmode : 'custom' ,
inset : [ 0.25 , 0.25 , 0.35 , 0.35 ]
}
คุณสมบัติ | ที่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
โหมดแทรก | เอ็น | 'อัตโนมัติ' | กำหนดว่าขอบความคิดเห็นจะถูกตั้งค่าโดยอัตโนมัติและค่าเป็น 'อัตโนมัติ' หรือ 'กำหนดเอง' |
สิ่งที่ใส่เข้าไป | เอ็น | [0.13, 0.13, 0.25, 0.25] | ช่องว่างที่ขอบของความคิดเห็น หน่วยเป็นเซนติเมตร ทิศทางคือ ซ้าย บน ขวา ล่าง |
หมายเหตุ: การตั้งค่า inset
นี้จะมีผลเฉพาะเมื่อค่าของ insetmode
เป็น 'กำหนดเอง'
การระบุสถานะการล็อคของวัตถุและข้อความของวัตถุโดยใช้คุณลักษณะการป้องกัน
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 ] ,
] ,
} ) ;
หมายเหตุ: การเพิ่มตารางลงในเวิร์กชีตจะแก้ไขแผ่นงานโดยการวางส่วนหัวและข้อมูลแถวลงในแผ่นงาน ข้อมูลใดๆ บนชีตที่ครอบคลุมโดยตารางผลลัพธ์ (รวมถึงส่วนหัวและผลรวม) จะถูกเขียนทับ
ตารางต่อไปนี้กำหนดคุณสมบัติที่ตารางรองรับ
คุณสมบัติตาราง | คำอธิบาย | ที่จำเป็น | ค่าเริ่มต้น |
---|---|---|---|
ชื่อ | ชื่อของตาราง | ย | |
ชื่อที่แสดง | ชื่อที่แสดงของตาราง | เอ็น | ชื่อ |
อ้างอิง | เซลล์ด้านซ้ายบนของตาราง | ย | |
headerRow | แสดงส่วนหัวที่ด้านบนของตาราง | เอ็น | จริง |
ผลรวมแถว | แสดงผลรวมที่ด้านล่างของตาราง | เอ็น | เท็จ |
สไตล์ | คุณสมบัติสไตล์พิเศษ | เอ็น | - |
คอลัมน์ | คำจำกัดความของคอลัมน์ | ย | |
แถว | แถวของข้อมูล | ย |
ตารางต่อไปนี้กำหนดคุณสมบัติที่ได้รับการสนับสนุนภายในคุณสมบัติสไตล์ตาราง
คุณสมบัติสไตล์ | คำอธิบาย | ที่จำเป็น | ค่าเริ่มต้น |
---|---|---|---|
ธีม | ธีมสีของตาราง | เอ็น | 'ตารางสไตล์ปานกลาง2' |
showFirstColumn | เน้นคอลัมน์แรก (ตัวหนา) | เอ็น | เท็จ |
แสดงคอลัมน์สุดท้าย | เน้นคอลัมน์สุดท้าย (ตัวหนา) | เอ็น | เท็จ |
showRowStripes | สลับแถวที่แสดงด้วยสีพื้นหลัง | เอ็น | เท็จ |
showColumnStripes | สลับแถวที่แสดงพร้อมสีพื้นหลัง | เอ็น | เท็จ |
ตารางต่อไปนี้กำหนดคุณสมบัติที่ได้รับการสนับสนุนภายในแต่ละคอลัมน์ของตาราง
คุณสมบัติคอลัมน์ | คำอธิบาย | ที่จำเป็น | ค่าเริ่มต้น |
---|---|---|---|
ชื่อ | ชื่อของคอลัมน์ ที่ใช้ในส่วนหัวด้วย | ย | |
ปุ่มกรอง | สลับการควบคุมตัวกรองในส่วนหัว | เอ็น | เท็จ |
ผลรวมRowLabel | ป้ายกำกับเพื่ออธิบายแถวผลรวม (คอลัมน์แรก) | เอ็น | 'ทั้งหมด' |
ผลรวมRowFunction | ชื่อของฟังก์ชันผลรวม | เอ็น | 'ไม่มี' |
สูตรรวมแถว | สูตรทางเลือกสำหรับฟังก์ชันแบบกำหนดเอง | เอ็น |
ตารางต่อไปนี้แสดงรายการค่าที่ถูกต้องสำหรับคุณสมบัติ TotalsRowFunction ที่กำหนดโดยคอลัมน์ หากใช้ค่าอื่นใดนอกเหนือจาก 'กำหนดเอง' ไม่จำเป็นต้องรวมสูตรที่เกี่ยวข้องเนื่องจากตารางจะแทรกค่านี้
ฟังก์ชันผลรวม | คำอธิบาย |
---|---|
ไม่มี | ไม่มีฟังก์ชันผลรวมสำหรับคอลัมน์นี้ |
เฉลี่ย | คำนวณค่าเฉลี่ยสำหรับคอลัมน์ |
นับตัวเลข | นับรายการที่เป็นตัวเลข |
นับ | จำนวนรายการ |
สูงสุด | ค่าสูงสุดในคอลัมน์นี้ |
นาที | ค่าต่ำสุดในคอลัมน์นี้ |
มาตรฐาน | ค่าเบี่ยงเบนมาตรฐานสำหรับคอลัมน์นี้ |
var | ความแปรปรวนสำหรับคอลัมน์นี้ |
ผลรวม | ผลรวมของรายการสำหรับคอลัมน์นี้ |
กำหนดเอง | สูตรที่กำหนดเอง จำเป็นต้องมีค่า 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 จากคอลัมน์
Caveat: คุณสมบัติทั้งหมดข้างต้น (ยกเว้น 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
คุณสมบัติแบบอักษร | คำอธิบาย | ค่าตัวอย่าง |
---|---|---|
ชื่อ | ชื่อแบบอักษร | 'อาเรียล', 'คาลิบรี' ฯลฯ |
ตระกูล | ตระกูลแบบอักษรสำหรับทางเลือก ค่าจำนวนเต็ม | 1 - Serif, 2 - Sans Serif, 3 - โมโน, อื่นๆ - ไม่ทราบ |
โครงการ | โครงร่างแบบอักษร | 'รอง', 'สำคัญ', 'ไม่มี' |
ชุดอักขระ | ชุดตัวอักษร ค่าจำนวนเต็ม | 1, 2 ฯลฯ |
ขนาด | ขนาดตัวอักษร ค่าจำนวนเต็ม | 9, 10, 12, 16 ฯลฯ |
สี | คำอธิบายสี วัตถุที่มีค่า ARGB | { argb: 'FFFF0000'} |
ตัวหนา | น้ำหนัก ตัวอักษร | จริงเท็จ |
ตัวเอียง | ความชัน ของแบบอักษร | จริงเท็จ |
ขีดเส้นใต้ | รูปแบบการขีดเส้นใต้แบบอักษร | จริง, เท็จ, 'ไม่มี', 'เดี่ยว', 'สองครั้ง', 'singleAccounting', 'doubleAccounting' |
โจมตี | | จริงเท็จ |
โครงร่าง | โครงร่างแบบอักษร | จริงเท็จ |
vertAlign | จัดแนวตั้ง | 'ตัวยก', 'ตัวห้อย' |
// 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' } ;
ค่าคุณสมบัติการจัดตำแหน่งที่ถูกต้อง
แนวนอน | แนวตั้ง | wrapText | ShrinkToFit | เยื้อง | การอ่านคำสั่งซื้อ | การหมุนข้อความ |
---|---|---|---|---|---|---|
ซ้าย | สูงสุด | จริง | จริง | จำนวนเต็ม | rtl | 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' } }
]
} ;
คุณสมบัติ | ที่จำเป็น | คำอธิบาย |
---|---|---|
พิมพ์ | ย | ค่า: 'รูปแบบ' ระบุรูปแบบการใช้การเติมนี้ |
ลวดลาย | ย | ระบุประเภทของรูปแบบ (ดูประเภทรูปแบบที่ถูกต้องด้านล่าง) |
fgColor | เอ็น | ระบุสีพื้นหน้าของรูปแบบ ค่าเริ่มต้นคือสีดำ |
บีจีคัลเลอร์ | เอ็น | ระบุสีพื้นหลังของลวดลาย ค่าเริ่มต้นคือสีขาว |
หมายเหตุ: หากคุณต้องการเติมเซลล์โดยใช้รูปแบบ solid
คุณไม่จำเป็นต้องระบุ bgColor
ดูตัวอย่างด้านบนสำหรับเซลล์ A3
ที่มีรูปแบบ solid
และปะการัง fgColor
ประเภทรูปแบบที่ถูกต้อง
คุณสมบัติ | ที่จำเป็น | คำอธิบาย |
---|---|---|
พิมพ์ | ย | ค่า: 'การไล่ระดับสี' ระบุว่าการเติมนี้ใช้การไล่ระดับสี |
การไล่ระดับสี | ย | ระบุประเภทการไล่ระดับสี หนึ่งใน ['มุม', 'เส้นทาง'] |
ระดับ | มุม | สำหรับการไล่ระดับสีแบบ 'มุม' ให้ระบุทิศทางของการไล่ระดับสี 0 คือจากซ้ายไปขวา ค่าตั้งแต่ 1 - 359 จะหมุนทิศทางตามเข็มนาฬิกา |
ศูนย์ | เส้นทาง | สำหรับการไล่ระดับสี 'เส้นทาง' ระบุพิกัดสัมพัทธ์สำหรับจุดเริ่มต้นของเส้นทาง ค่า 'left' และ 'top' มีตั้งแต่ 0 ถึง 1 |
หยุด | ย | ระบุลำดับการไล่ระดับสี เป็นอาร์เรย์ของวัตถุที่มีตำแหน่งและสีที่เริ่มต้นด้วยตำแหน่ง 0 และลงท้ายด้วยตำแหน่ง 1 ตำแหน่งตัวกลางอาจใช้เพื่อระบุสีอื่นบนเส้นทาง |
คำเตือน
การใช้อินเทอร์เฟซด้านบนอาจเป็นไปได้ที่จะสร้างเอฟเฟกต์การไล่ระดับสีที่ไม่สามารถทำได้โดยใช้โปรแกรมแก้ไข XLSX ตัวอย่างเช่น Excel รองรับเฉพาะการไล่ระดับสีมุม 0, 45, 90 และ 135 ในทำนองเดียวกัน ลำดับของการหยุดอาจถูกจำกัดโดย UI ด้วยตำแหน่ง [0,1] หรือ [0,0.5,1] เป็นตัวเลือกเดียว ดูแลการเติมนี้เพื่อให้แน่ใจว่าผู้ชม XLSX เป้าหมายรองรับ
ขณะนี้แต่ละเซลล์รองรับ Rich Text หรือการจัดรูปแบบในเซลล์ ค่า Rich Text สามารถควบคุมคุณสมบัติแบบอักษรของสตริงย่อยจำนวนเท่าใดก็ได้ภายในค่าข้อความ ดูแบบอักษรสำหรับรายการรายละเอียดทั้งหมดเกี่ยวกับคุณสมบัติแบบอักษรที่รองรับ
ws . getCell ( 'A1' ) . value = {
'richText' : [
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 0 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : 'This is ' } ,
{ 'font' : { 'italic' : true , 'size' : 12 , 'color' : { 'theme' : 0 } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'a' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' ' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'argb' : 'FFFF6600' } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'colorful' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' text ' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'argb' : 'FFCCFFCC' } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'with' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' in-cell ' } ,
{ 'font' : { 'bold' : true , 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : 'format' }
]
} ;
expect ( ws . getCell ( 'A1' ) . text ) . to . equal ( 'This is a colorful text with in-cell format' ) ;
expect ( ws . getCell ( 'A1' ) . type ) . to . equal ( Excel . ValueType . RichText ) ;
การป้องกันระดับเซลล์สามารถแก้ไขได้โดยใช้คุณสมบัติการป้องกัน
ws . getCell ( 'A1' ) . protection = {
locked : false ,
hidden : true ,
} ;
คุณสมบัติการป้องกันที่รองรับ
คุณสมบัติ | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|
ล็อค | จริง | ระบุว่าเซลล์จะถูกล็อคหรือไม่หากแผ่นงานได้รับการป้องกัน |
ที่ซ่อนอยู่ | เท็จ | ระบุว่าจะมองเห็นสูตรของเซลล์หรือไม่หากแผ่นงานได้รับการป้องกัน |
การจัดรูปแบบตามเงื่อนไขช่วยให้แผ่นงานแสดงสไตล์ ไอคอน ฯลฯ เฉพาะเจาะจง ขึ้นอยู่กับค่าของเซลล์หรือสูตรที่กำหนดเอง
กฎการจัดรูปแบบตามเงื่อนไขจะถูกเพิ่มที่ระดับแผ่นงาน และโดยทั่วไปจะครอบคลุมช่วงของเซลล์
สามารถใช้กฎหลายข้อกับช่วงเซลล์ที่ระบุได้ และแต่ละกฎจะใช้สไตล์ของตัวเอง
หากกฎหลายข้อส่งผลต่อเซลล์ที่กำหนด ค่าลำดับความสำคัญของกฎจะกำหนดว่ากฎใดจะชนะหากรูปแบบที่แข่งขันกันขัดแย้งกัน กฎที่มีค่าลำดับความสำคัญต่ำกว่าจะเป็นผู้ชนะ หากไม่ได้ระบุค่าลำดับความสำคัญสำหรับกฎที่กำหนด ExcelJS จะกำหนดค่าตามลำดับจากน้อยไปหามาก
หมายเหตุ: ปัจจุบันรองรับกฎการจัดรูปแบบตามเงื่อนไขเพียงชุดย่อยเท่านั้น โดยเฉพาะเฉพาะกฎการจัดรูปแบบที่ไม่จำเป็นต้องมีการแสดงผล XML ภายในองค์ประกอบ <extLst> ซึ่งหมายความว่าไม่รองรับชุดข้อมูลและชุดไอคอนเฉพาะสามชุด (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 รายการที่แสดงค่าจริง/เท็จ หากต้องการอ้างอิงค่าของเซลล์ ให้ใช้ที่อยู่เซลล์ด้านซ้ายบน | ||
สไตล์ | โครงสร้างลักษณะที่จะใช้หากสูตรคืนค่าเป็นจริง |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'เซลล์' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
ตัวดำเนินการ | วิธีเปรียบเทียบค่าเซลล์กับผลลัพธ์ของสูตร | ||
สูตร | อาร์เรย์ของสตริงสูตร 1 รายการที่จะคืนค่าเพื่อเปรียบเทียบกับแต่ละเซลล์ | ||
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
เซลล์เป็นตัวดำเนินการ
ผู้ดำเนินการ | คำอธิบาย |
---|---|
เท่ากัน | ใช้รูปแบบถ้าค่าของเซลล์เท่ากับค่าสูตร |
ยิ่งใหญ่กว่า | ใช้รูปแบบหากค่าของเซลล์มากกว่าค่าสูตร |
น้อยกว่า | ใช้รูปแบบหากค่าของเซลล์น้อยกว่าค่าสูตร |
ระหว่าง | ใช้รูปแบบถ้าค่าของเซลล์อยู่ระหว่างค่าสูตรสองค่า (รวม) |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'ท็อป 10' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
อันดับ | ย | 10 | ระบุจำนวนค่าบน (หรือล่าง) ที่รวมอยู่ในการจัดรูปแบบ |
เปอร์เซ็นต์ | ย | เท็จ | หากเป็นจริง ช่องอันดับจะเป็นเปอร์เซ็นต์ ไม่ใช่ค่าสัมบูรณ์ |
ด้านล่าง | ย | เท็จ | หากเป็นจริง ค่าด้านล่างจะรวมไว้แทนค่าด้านบน |
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'สูงกว่าค่าเฉลี่ย' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
สูงกว่าค่าเฉลี่ย | ย | เท็จ | หากเป็นจริง ช่องอันดับจะเป็นเปอร์เซ็นต์ ไม่ใช่ค่าสัมบูรณ์ |
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'ระดับสี' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
ซีเอฟโว | อาร์เรย์ของออบเจ็กต์ค่าการจัดรูปแบบตามเงื่อนไข 2 ถึง 5 รายการที่ระบุจุดทางในช่วงค่า | ||
สี | อาร์เรย์ของสีที่สอดคล้องกันเพื่อใช้ ณ จุดที่กำหนด | ||
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'ชุดไอคอน' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
ชุดไอคอน | ย | 3สัญญาณไฟจราจร | ชื่อของไอคอนที่ตั้งค่าให้ใช้ |
แสดงค่า | จริง | ระบุว่าเซลล์ในช่วงที่ใช้แสดงไอคอนและค่าของเซลล์ หรือเฉพาะไอคอนเท่านั้น | |
ย้อนกลับ | เท็จ | ระบุว่าไอคอนในชุดไอคอนที่ระบุใน iconSet จะแสดงตามลำดับการจองหรือไม่ หากกำหนดเองเท่ากับ "จริง" จะต้องละเว้นค่านี้ | |
กำหนดเอง | เท็จ | ระบุว่าจะใช้ชุดไอคอนแบบกำหนดเองหรือไม่ | |
ซีเอฟโว | อาร์เรย์ของออบเจ็กต์ค่าการจัดรูปแบบตามเงื่อนไข 2 ถึง 5 รายการที่ระบุจุดทางในช่วงค่า | ||
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'ดาต้าบาร์' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
นาทีความยาว | 0 | ระบุความยาวของแถบข้อมูลที่สั้นที่สุดในช่วงการจัดรูปแบบตามเงื่อนไขนี้ | |
ความยาวสูงสุด | 100 | ระบุความยาวของแถบข้อมูลที่ยาวที่สุดในช่วงการจัดรูปแบบตามเงื่อนไขนี้ | |
แสดงค่า | จริง | ระบุว่าเซลล์ในช่วงการจัดรูปแบบตามเงื่อนไขจะแสดงทั้งแถบข้อมูลและค่าตัวเลขหรือแถบข้อมูล | |
การไล่ระดับสี | จริง | ระบุว่าแถบข้อมูลมีการเติมแบบไล่ระดับสีหรือไม่ | |
ชายแดน | จริง | ระบุว่าแถบข้อมูลมีเส้นขอบหรือไม่ | |
ลบBarColorSameAsPositive | จริง | ระบุว่าแถบข้อมูลมีสีแถบลบที่แตกต่างจากสีแถบบวกหรือไม่ | |
ลบBarBorderColorSameAsPositive | จริง | ระบุว่าแถบข้อมูลมีสีเส้นขอบค่าลบที่แตกต่างจากสีเส้นขอบค่าบวกหรือไม่ | |
ตำแหน่งแกน | 'อัตโนมัติ' | ระบุตำแหน่งแกนสำหรับแถบข้อมูล | |
ทิศทาง | 'ซ้ายไปขวา' | ระบุทิศทางของแถบข้อมูล | |
ซีเอฟโว | อาร์เรย์ของออบเจ็กต์ค่าการจัดรูปแบบตามเงื่อนไข 2 ถึง 5 รายการที่ระบุจุดทางในช่วงค่า | ||
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'มีข้อความ' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
ตัวดำเนินการ | ประเภทของการเปรียบเทียบข้อความ | ||
ข้อความ | ข้อความที่จะค้นหา | ||
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
ประกอบด้วยตัวดำเนินการข้อความ
ผู้ดำเนินการ | คำอธิบาย |
---|---|
มีข้อความ | ใช้รูปแบบหากค่าในเซลล์มีค่าที่ระบุในช่อง "ข้อความ" |
มีช่องว่าง | ใช้รูปแบบหากค่าในเซลล์มีช่องว่าง |
ไม่ประกอบด้วยช่องว่าง | ใช้รูปแบบถ้าค่าของเซลล์ไม่มีช่องว่าง |
มีข้อผิดพลาด | ใช้รูปแบบหากค่าของเซลล์มีข้อผิดพลาด |
ไม่มีข้อผิดพลาด | ใช้รูปแบบหากค่าของเซลล์ไม่มีข้อผิดพลาด |
สนาม | ไม่จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|
พิมพ์ | 'ช่วงเวลา' | ||
ลำดับความสำคัญ | ย | <อัตโนมัติ> | กำหนดลำดับความสำคัญของสไตล์ |
เวลาช่วงเวลา | ช่วงเวลาใดที่จะเปรียบเทียบมูลค่าของเซลล์กับ | ||
สไตล์ | โครงสร้างลักษณะที่จะใช้หากการเปรียบเทียบส่งกลับค่าจริง |
ช่วงเวลา
ช่วงเวลา | คำอธิบาย |
---|---|
สัปดาห์ที่แล้ว | ใช้รูปแบบหากค่าของเซลล์อยู่ภายในสัปดาห์ที่ผ่านมา |
สัปดาห์นี้ | ใช้รูปแบบหากค่าเซลล์อยู่ในสัปดาห์นี้ |
สัปดาห์หน้า | ใช้รูปแบบหากค่าของเซลล์อยู่ในสัปดาห์หน้า |
เมื่อวาน | ใช้รูปแบบถ้าค่าของเซลล์เท่ากับเมื่อวาน |
วันนี้ | ใช้รูปแบบถ้าค่าของเซลล์เท่ากับวันนี้ |
พรุ่งนี้ | ใช้รูปแบบถ้าค่าของเซลล์เท่ากับพรุ่งนี้ |
7 วันที่ผ่านมา | ใช้รูปแบบหากค่าของเซลล์อยู่ภายใน 7 วันที่ผ่านมา |
เดือนที่แล้ว | ใช้รูปแบบหากค่าของเซลล์อยู่ในเดือนที่แล้ว |
เดือนนี้ | ใช้รูปแบบหากค่าเซลล์อยู่ในเดือนนี้ |
เดือนหน้า | ใช้รูปแบบหากค่าเซลล์อยู่ในเดือนถัดไป |
Excel รองรับการสรุป; โดยที่แถวหรือคอลัมน์สามารถขยายหรือยุบได้ ขึ้นอยู่กับระดับรายละเอียดที่ผู้ใช้ต้องการดู
ระดับเค้าร่างสามารถกำหนดได้ในการตั้งค่าคอลัมน์:
worksheet . columns = [
{ header : 'Id' , key : 'id' , width : 10 } ,
{ header : 'Name' , key : 'name' , width : 32 } ,
{ header : 'D.O.B.' , key : 'DOB' , width : 10 , outlineLevel : 1 }
] ;
หรือโดยตรงบนแถวหรือคอลัมน์
worksheet . getColumn ( 3 ) . outlineLevel = 1 ;
worksheet . getRow ( 3 ) . outlineLevel = 1 ;
สามารถตั้งค่าระดับเค้าร่างของแผ่นงานบนแผ่นงานได้
// set column outline level
worksheet . properties . outlineLevelCol = 1 ;
// set row outline level
worksheet . properties . outlineLevelRow = 1 ;
หมายเหตุ: การปรับระดับเค้าร่างบนแถวหรือคอลัมน์หรือระดับเค้าร่างบนเวิร์กชีตจะทำให้เกิดผลข้างเคียงจากการแก้ไขคุณสมบัติการยุบของแถวหรือคอลัมน์ทั้งหมดที่ได้รับผลกระทบจากการเปลี่ยนแปลงคุณสมบัติ เช่น:
worksheet . properties . outlineLevelCol = 1 ;
worksheet . getColumn ( 3 ) . outlineLevel = 1 ;
expect ( worksheet . getColumn ( 3 ) . collapsed ) . to . be . true ;
worksheet . properties . outlineLevelCol = 2 ;
expect ( worksheet . getColumn ( 3 ) . collapsed ) . to . be . false ;
คุณสามารถตั้งค่าคุณสมบัติเค้าร่างบนเวิร์กชีตได้
worksheet . properties . outlineProperties = {
summaryBelow : false ,
summaryRight : false ,
} ;
การเพิ่มรูปภาพลงในแผ่นงานเป็นกระบวนการสองขั้นตอน ขั้นแรก รูปภาพจะถูกเพิ่มลงในสมุดงานผ่านฟังก์ชัน addImage() ซึ่งจะส่งคืนค่า imageId ด้วย จากนั้น เมื่อใช้ imageId คุณสามารถเพิ่มรูปภาพลงในเวิร์กชีตเป็นพื้นหลังแบบเรียงต่อกันหรือครอบคลุมช่วงเซลล์ได้
หมายเหตุ: ในเวอร์ชันนี้ ไม่รองรับการปรับหรือแปลงรูปภาพ และไม่รองรับรูปภาพในโหมดสตรีมมิ่ง
ฟังก์ชัน Workbook.addImage รองรับการเพิ่มรูปภาพตามชื่อไฟล์หรือตามบัฟเฟอร์ โปรดทราบว่าในทั้งสองกรณี จะต้องระบุนามสกุล ค่าส่วนขยายที่ถูกต้อง ได้แก่ 'jpeg', 'png', 'gif'
// add image to workbook by filename
const imageId1 = workbook . addImage ( {
filename : 'path/to/image.jpg' ,
extension : 'jpeg' ,
} ) ;
// add image to workbook by buffer
const imageId2 = workbook . addImage ( {
buffer : fs . readFileSync ( 'path/to.image.png' ) ,
extension : 'png' ,
} ) ;
// add image to workbook by base64
const myBase64Image = "data:image/png;base64,iVBORw0KG..." ;
const imageId2 = workbook . addImage ( {
base64 : myBase64Image ,
extension : 'png' ,
} ) ;
การใช้รหัสรูปภาพจาก Workbook.addImage ทำให้สามารถตั้งค่าพื้นหลังของเวิร์กชีตได้โดยใช้ฟังก์ชัน addBackgroundImage
// set background
worksheet . addBackgroundImage ( imageId1 ) ;
การใช้รหัสรูปภาพจาก Workbook.addImage รูปภาพสามารถฝังภายในแผ่นงานเพื่อให้ครอบคลุมช่วงต่างๆ พิกัดที่คำนวณจากช่วงจะครอบคลุมตั้งแต่ด้านซ้ายบนของเซลล์แรกไปจนถึงมุมขวาล่างของเซลล์ที่สอง
// insert an image over B2:D6
worksheet . addImage ( imageId2 , 'B2:D6' ) ;
การใช้โครงสร้างแทนสตริงช่วงเป็นไปได้ที่จะครอบคลุมเซลล์บางส่วน
โปรดทราบว่าระบบพิกัดที่ใช้สำหรับสิ่งนี้เป็นไปตามศูนย์ดังนั้นด้านบนซ้ายของ A1 จะเป็น {col: 0, แถว: 0} เศษส่วนของเซลล์สามารถระบุได้โดยใช้หมายเลขจุดลอยตัวเช่นจุดกึ่งกลางของ A1 คือ {col: 0.5, แถว: 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' ซึ่งจะควบคุมวิธีที่ภาพถูกยึดติดกับเซลล์มันสามารถมีหนึ่งในค่าต่อไปนี้:
ค่า | คำอธิบาย |
---|---|
ไม่ได้กำหนด | มันระบุภาพจะถูกย้ายและปรับขนาดด้วยเซลล์ |
OneCell | นี่คือค่าเริ่มต้น ภาพจะถูกเคลื่อนย้ายด้วยเซลล์ แต่ไม่มีขนาด |
แน่นอน | ภาพจะไม่ถูกย้ายหรือปรับขนาดด้วยเซลล์ |
ws . addImage ( imageId , {
tl : { col : 0.1125 , row : 0.4 } ,
br : { col : 2.101046875 , row : 3.4 } ,
editAs : 'oneCell'
} ) ;
คุณสามารถเพิ่มภาพลงในเซลล์แล้วกำหนดความกว้างและความสูงเป็นพิกเซลที่ 96DPI
worksheet . addImage ( imageId2 , {
tl : { col : 0 , row : 0 } ,
ext : { width : 500 , height : 200 }
} ) ;
คุณสามารถเพิ่มภาพด้วยการเชื่อมโยงหลายมิติไปยังเซลล์และกำหนดไฮเปอร์ลิงก์ในช่วงภาพ
worksheet . addImage ( imageId2 , {
tl : { col : 0 , row : 0 } ,
ext : { width : 500 , height : 200 } ,
hyperlinks : {
hyperlink : 'http://www.somewhere.com' ,
tooltip : 'http://www.somewhere.com'
}
} ) ;
แผ่นงานสามารถป้องกันได้จากการปรับเปลี่ยนโดยการเพิ่มรหัสผ่าน
await worksheet . protect ( 'the-password' , options ) ;
การป้องกันแผ่นงานสามารถลบออกได้:
worksheet . unprotect ( ) ;
ดูการป้องกันเซลล์สำหรับรายละเอียดเกี่ยวกับวิธีการปรับเปลี่ยนการป้องกันเซลล์แต่ละรายการ
หมายเหตุ: ในขณะที่ฟังก์ชั่น Protect () ส่งคืนสัญญาที่ระบุว่าเป็น async การใช้งานปัจจุบันจะทำงานบนเธรดหลักและจะใช้ประมาณ 600ms ใน CPU เฉลี่ย สิ่งนี้สามารถปรับได้โดยการตั้งค่า spincount ซึ่งสามารถใช้เพื่อทำให้กระบวนการเร็วขึ้นหรือยืดหยุ่นมากขึ้น
สนาม | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|
SelectlockedCells | จริง | ให้ผู้ใช้เลือกเซลล์ล็อค |
SelectunLockedCells | จริง | ให้ผู้ใช้เลือกเซลล์ปลดล็อค |
formatcells | เท็จ | ให้เซลล์รูปแบบผู้ใช้ |
รูปแบบคอลัมน์ | เท็จ | ให้คอลัมน์รูปแบบผู้ใช้ |
รูปแบบ | เท็จ | ให้แถวรูปแบบผู้ใช้ |
การแทรก | เท็จ | ให้ผู้ใช้แทรกแถว |
หมกมุ่น | เท็จ | ให้คอลัมน์แทรกผู้ใช้ |
inserthyperlinks | เท็จ | ให้ผู้ใช้แทรกไฮเปอร์ลิงก์ |
การลบ | เท็จ | ให้ผู้ใช้ลบแถว |
deleteColumns | เท็จ | ให้ผู้ใช้ลบคอลัมน์ |
เรียงลำดับ | เท็จ | ให้ข้อมูลผู้ใช้เรียงลำดับ |
เครื่องกรองอัตโนมัติ | เท็จ | ให้ข้อมูลตัวกรองผู้ใช้ในตาราง |
pivottables | เท็จ | ให้ผู้ใช้ใช้ตารางเดือย |
สัดส่วน | 100000 | จำนวนการทำซ้ำแฮชที่ดำเนินการเมื่อปกป้องหรือไม่มีการป้องกัน |
ตัวเลือกที่รองรับเมื่ออ่านไฟล์ XLSX
สนาม | ที่จำเป็น | พิมพ์ | คำอธิบาย |
---|---|---|---|
ไม่รู้ | เอ็น | อาร์เรย์ | รายการชื่อโหนดที่จะละเว้นในขณะที่โหลดเอกสาร XLSX ปรับปรุงประสิทธิภาพในบางสถานการณ์ พร้อมใช้งาน: sheetPr , dimension , sheetViews , sheetFormatPr , cols , sheetData , autoFilter , mergeCells , rowBreaks extLst hyperlinks tableParts pageMargins conditionalFormatting dataValidations sheetProtection pageSetup , headerFooter , printOptions , picture , ภาพ drawing |
// 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 |
แผนที่ | เอ็น | การทำงาน | custom array.prototype.map () ฟังก์ชั่นการโทรกลับสำหรับการประมวลผลข้อมูล |
ชื่อแผ่น | เอ็น | สตริง | ระบุชื่อแผ่นงาน |
การแยกวิเคราะห์ | เอ็น | วัตถุ | ตัวเลือก 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 หากไม่ได้จัดเตรียมอาร์เรย์วันที่จะใช้วันที่ต่อไปนี้:
โปรดดูปลั๊กอิน DayJS CustomParseFormat สำหรับรายละเอียดเกี่ยวกับวิธีการจัดโครงสร้างวันที่
ตัวเลือกที่รองรับเมื่อเขียนไปยังไฟล์ CSV
สนาม | ที่จำเป็น | พิมพ์ | คำอธิบาย |
---|---|---|---|
วันที่ | เอ็น | สตริง | ระบุรูปแบบการเข้ารหัสวันที่ของ dayjs |
วันที่ | เอ็น | บูลีน | ระบุว่า Exceljs ใช้ dayjs.utc () เพื่อแปลงโซนเวลาสำหรับวันที่แยกวิเคราะห์หรือไม่ |
การเข้ารหัส | เอ็น | สตริง | ระบุรูปแบบการเข้ารหัสไฟล์ (ใช้กับ .writeFile เท่านั้น) |
รวม emptyrows | เอ็น | บูลีน | ระบุว่าสามารถเขียนแถวที่ว่างเปล่าได้หรือไม่ |
แผนที่ | เอ็น | การทำงาน | custom array.prototype.map () ฟังก์ชั่นการโทรกลับสำหรับการประมวลผลค่าแถว |
ชื่อแผ่น | เอ็น | สตริง | ระบุชื่อแผ่นงาน |
ผ้าปูที่นอน | เอ็น | ตัวเลข | ระบุรหัสแผ่นงาน |
ฟอร์เมกเตอร์ | เอ็น | วัตถุ | ตัวเลือก 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 หากไม่มีการจัดส่งวันที่จะใช้ dayjs.iso_8601 เมื่อเขียน CSV คุณสามารถจัดหา Boolean DateUTC เป็นจริงเพื่อให้ ExcelJS แยกวิเคราะห์วันที่โดยไม่ต้องแปลงเขตเวลาโดยอัตโนมัติโดยใช้ dayjs.utc()
โดยอัตโนมัติ
ไฟล์ I/O ที่บันทึกไว้ข้างต้นต้องการให้สมุดงานทั้งหมดถูกสร้างขึ้นในหน่วยความจำก่อนที่จะสามารถเขียนไฟล์ได้ ในขณะที่สะดวกสามารถ จำกัด ขนาดของเอกสารได้เนื่องจากจำนวนหน่วยความจำที่ต้องการ
ผู้เขียนสตรีมมิ่ง (หรือผู้อ่าน) ประมวลผลข้อมูลเวิร์กบุ๊กหรือแผ่นงานตามที่สร้างขึ้นโดยแปลงเป็นรูปแบบไฟล์ตามที่มันไป โดยทั่วไปแล้วสิ่งนี้จะมีประสิทธิภาพมากขึ้นในหน่วยความจำเนื่องจากรอยเท้าหน่วยความจำสุดท้ายและแม้แต่รอยเท้าหน่วยความจำระดับกลางนั้นมีขนาดกะทัดรัดมากกว่าเวอร์ชันเอกสารโดยเฉพาะอย่างยิ่งเมื่อคุณพิจารณาว่าการกำจัดแถวและเซลล์จะถูกกำจัดเมื่อมีการกระทำ
อินเทอร์เฟซไปยังเวิร์กบุ๊กสตรีมมิ่งและแผ่นงานนั้นเกือบจะเหมือนกับเวอร์ชันเอกสารที่มีความแตกต่างเล็กน้อยเล็กน้อย:
โปรดทราบว่าเป็นไปได้ที่จะสร้างสมุดงานทั้งหมดโดยไม่ต้องทำแถวใด ๆ เมื่อสมุดงานมีความมุ่งมั่นแผ่นงานที่เพิ่มเข้ามาทั้งหมด (รวมถึงแถวที่ไม่มีข้อผูกมัดทั้งหมด) จะมีการกระทำโดยอัตโนมัติ อย่างไรก็ตามในกรณีนี้จะได้รับน้อยกว่าเวอร์ชันเอกสาร
สตรีมมิ่ง XLSX Workbook Writer มีให้บริการในเนมสเปซ exceljs.stream.xlsx
ตัวสร้างใช้วัตถุตัวเลือกที่เป็นตัวเลือกพร้อมฟิลด์ต่อไปนี้:
สนาม | คำอธิบาย |
---|---|
ลำธาร | ระบุสตรีมที่เขียนได้เพื่อเขียนสมุดงาน XLSX ไปที่ |
ชื่อไฟล์ | หากไม่ได้ระบุสตรีมฟิลด์นี้จะระบุเส้นทางไปยังไฟล์เพื่อเขียนสมุดงาน XLSX ไปที่ |
usesharedstrings | ระบุว่าจะใช้สตริงที่ใช้ร่วมกันในสมุดงานหรือไม่ ค่าเริ่มต้นเป็น false |
USestyles | ระบุว่าจะเพิ่มข้อมูลสไตล์ลงในสมุดงานหรือไม่ สไตล์สามารถเพิ่มประสิทธิภาพการทำงานได้ ค่าเริ่มต้นเป็น false |
ซิป | ตัวเลือกซิปที่ Exceljs ส่งผ่านไปยัง Archiver ค่าเริ่มต้น undefined |
หากไม่มีการระบุชื่อสตรีมหรือชื่อไฟล์ในตัวเลือกนักเขียนสมุดงานจะสร้างวัตถุสตรีมบูฟที่จะเก็บเนื้อหาของสมุดงาน 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' |
ตัวเลือก | ระบุว่าจะแคชสตริงที่ใช้ร่วมกัน ( 'cache' ) ซึ่งแทรกเข้าไปในค่าเซลล์ที่เกี่ยวข้องหรือว่าจะปล่อยมัน ( 'emit' ) หรือไม่สนใจพวกเขา ( 'ignore' ) ในกรณีนี้ การอ้างอิงถึงดัชนีของสตริงที่ใช้ร่วมกัน ค่าเริ่มต้นคือ 'cache' |
ตัวเลือก hyperlinks | ระบุว่าจะแคชไฮเปอร์ลิงก์ ( 'cache' ) ซึ่งแทรกเข้าไปในเซลล์ที่เกี่ยวข้องไม่ว่าจะปล่อยพวกมัน ( 'emit' ) หรือไม่หรือไม่สนใจ ( 'ignore' ) ค่าเริ่มต้นคือ 'cache' |
ตัวเลือก Styles | ระบุว่าจะแคชสไตล์ ( 'cache' ) ซึ่งแทรกเข้าไปในแถวและเซลล์ที่เกี่ยวข้องหรือไม่หรือไม่สนใจ ( 'ignore' ) ค่าเริ่มต้นคือ 'cache' |
ตัวเลือก | ระบุว่าจะปล่อยแผ่นงาน ( 'emit' ) หรือไม่ ( 'ignore' ) ค่าเริ่มต้นคือ 'emit' |
const workbookReader = new ExcelJS . stream . xlsx . WorkbookReader ( './file.xlsx' ) ;
for await ( const worksheetReader of workbookReader ) {
for await ( const row of worksheetReader ) {
// ...
}
}
โปรดทราบว่า worksheetReader
ส่งคืนอาร์เรย์ของแถวแทนที่จะเป็นแต่ละแถวด้วยเหตุผลประสิทธิภาพ: nodejs/node#31979
กิจกรรมในเวิร์กบุ๊กคือ 'แผ่นงาน', 'Stared-Strings' และ 'Hyperlinks' กิจกรรมบนแผ่นงานคือ 'แถว' และ 'ไฮเปอร์ลิงก์'
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
}
}
ในขณะที่เราสนับสนุนให้ใช้การทำซ้ำแบบ async เรายังเปิดเผยอินเทอร์เฟซสตรีมมิ่งเพื่อความเข้ากันได้ย้อนหลัง
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 ในเบราว์เซอร์ดูที่โฟลเดอร์ Spec/Browser ใน GitHub Repo
ไฟล์ต่อไปนี้จะถูกรวมไว้ล่วงหน้าและรวมอยู่ในโฟลเดอร์ DIST
รองรับประเภทค่าต่อไปนี้
enum: excel.valuetype.null
ค่า NULL บ่งชี้ว่าไม่มีค่าและโดยทั่วไปจะไม่ถูกเก็บไว้เมื่อเขียนลงในไฟล์ (ยกเว้นเซลล์ที่ผสาน) สามารถใช้เพื่อลบค่าออกจากเซลล์
เช่น
worksheet . getCell ( 'A1' ) . value = null ;
enum: excel.valuetype.merge
เซลล์ผสานเป็นเซลล์ที่มีค่าผูกพันกับเซลล์ 'ต้นแบบ' อื่น การกำหนดให้กับเซลล์ผสานจะทำให้เซลล์ของอาจารย์ได้รับการแก้ไข
enum: excel.valuetype.number
ค่าตัวเลข
เช่น
worksheet . getCell ( 'A1' ) . value = 5 ;
worksheet . getCell ( 'A2' ) . value = 3.14159 ;
enum: excel.valueType.string
สตริงข้อความง่าย ๆ
เช่น
worksheet . getCell ( 'A1' ) . value = 'Hello, World!' ;
enum: excel.valueType.date
ค่าวันที่แสดงโดยประเภทวันที่ JavaScript
เช่น
worksheet . getCell ( 'A1' ) . value = new Date ( 2017 , 2 , 15 ) ;
enum: 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' } ;
enum: 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 } ;
เซลล์ยังรองรับความสะดวกสบายในการเข้าถึงสูตรและผลลัพธ์:
worksheet . getCell ( 'A3' ) . formula === 'A1+A2' ;
worksheet . getCell ( 'A3' ) . result === 7 ;
สูตรที่ใช้ร่วมกันช่วยเพิ่มการบีบอัดของเอกสาร XLSX โดยลดการทำซ้ำของข้อความภายในแผ่นงาน XML เซลล์ซ้ายบนในช่วงคือต้นแบบที่กำหนดและจะเก็บสูตรที่เซลล์อื่น ๆ ทั้งหมดในช่วงจะได้มาจาก เซลล์ 'ทาส' อื่น ๆ สามารถอ้างถึงเซลล์ต้นแบบนี้แทนที่จะนิยามใหม่สูตรทั้งหมดอีกครั้ง โปรดทราบว่าสูตรหลักจะถูกแปลไปยังเซลล์ทาสในแฟชั่น 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
Formula Convenience 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 ) ;
เพื่อแยกความแตกต่างระหว่างเซลล์สูตรจริงและที่แปลให้ใช้สูตร 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 พร้อมกับช่วงของเซลล์ที่ใช้กับและสูตรที่จะคัดลอก ส่วนที่เหลือของเซลล์เป็นเซลล์ปกติที่มีค่าปกติ
หมายเหตุ: สูตรอาร์เรย์ไม่ได้แปลในวิธีการใช้สูตรที่ใช้ร่วมกัน ดังนั้นหากเซลล์ต้นแบบ A2 หมายถึง A1 Slave Cell 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' ) ;
enum: excel.valuetype.richtext
ข้อความที่อุดมไปด้วยสไตล์
เช่น
worksheet . getCell ( 'A1' ) . value = {
richText : [
{ text : 'This is ' } ,
{ font : { italic : true } , text : 'italic' } ,
]
} ;
enum: excel.valuetype.boolean
เช่น
worksheet . getCell ( 'A1' ) . value = true ;
worksheet . getCell ( 'A2' ) . value = false ;
enum: excel.valuetype.error
เช่น
worksheet . getCell ( 'A1' ) . value = { error : '#N/A' } ;
worksheet . getCell ( 'A2' ) . value = { error : '#VALUE!' } ;
ค่าข้อความข้อผิดพลาดที่ถูกต้องปัจจุบันคือ:
ชื่อ | ค่า |
---|---|
excel.errorvalue.notapplicable | #ไม่มี |
excel.errorvalue.ref | #ref! |
excel.errorvalue.name | #ชื่อ? |
excel.errorvalue.divzero | #div/0! |
excel.errorvalue.null | #โมฆะ! |
excel.errorvalue.value | #ค่า! |
excel.errorvalue.num | #num |
ทุกความพยายามที่จะทำให้อินเทอร์เฟซที่สอดคล้องกันที่ดีซึ่งไม่ผ่านเวอร์ชัน แต่น่าเสียดายตอนนี้และบางสิ่งก็ต้องเปลี่ยนไปเพื่อประโยชน์ที่ดีกว่า
อาร์กิวเมนต์ในฟังก์ชั่นการโทรกลับไปยังเวิร์กชีทมีการสลับและเปลี่ยนไปแล้ว มันเป็นฟังก์ชั่น (Rownumber, Rowvalues) ตอนนี้มันเป็นฟังก์ชั่น (Row, Rownumber) ซึ่งทำให้มันดูและรู้สึกเหมือนฟังก์ชั่นขีดล่าง (_.each) และลำดับความสำคัญของวัตถุแถวเหนือหมายเลขแถว
ฟังก์ชั่นนี้เปลี่ยนไปจากการส่งคืนอาร์เรย์ของค่าเซลล์แบบเบาบางเป็นการส่งคืนวัตถุแถว สิ่งนี้ช่วยให้การเข้าถึงคุณสมบัติของแถวและจะอำนวยความสะดวกในการจัดการสไตล์แถวและอื่น ๆ
อาร์เรย์ที่กระจัดกระจายของค่าเซลล์ยังคงมีอยู่ผ่าน worksheet.getrow (Rownumber). ค่า;
cell.styles เปลี่ยนชื่อเป็น cell.style
สัญญาที่ส่งคืนจากฟังก์ชั่นเปลี่ยนจาก Bluebird เป็นสัญญาโหนดดั้งเดิมซึ่งสามารถทำลายรหัสการโทรได้หากพวกเขาพึ่งพาคุณสมบัติพิเศษของ Bluebird
เพื่อลดการเปลี่ยนแปลงสองครั้งต่อไปนี้ถูกเพิ่มเป็น 0.3.0:
ตอนนี้ Exceljs รองรับการฉีดพึ่งพาสำหรับห้องสมุดสัญญา คุณสามารถกู้คืนสัญญา Bluebird โดยรวมรหัสต่อไปนี้ในโมดูลของคุณ ...
ExcelJS . config . setValue ( 'promise' , require ( 'bluebird' ) ) ;
โปรดทราบ: ฉันได้ทดสอบ exceljs กับ Bluebird โดยเฉพาะ (ตั้งแต่จนถึงเมื่อเร็ว ๆ นี้นี่คือห้องสมุดที่ใช้) จากการทดสอบที่ฉันทำมันจะไม่ทำงานกับ Q
ก่อนที่จะเผยแพร่โมดูลนี้ซอร์สโค้ดจะถูก transpiled และประมวลผลเป็นอย่างอื่นก่อนที่จะถูกวางใน dist/ folder readme นี้ระบุสองไฟล์ - ชุดข้อมูลเบราว์เซอร์และรุ่นเล็ก ไม่มีการรับประกันเนื้อหาอื่น ๆ ของ Dist/ Folder ในทางใด ๆ นอกเหนือจากไฟล์ที่ระบุเป็น "หลัก" ใน package.json
ชุดทดสอบที่รวมอยู่ใน LIB นี้รวมถึงสคริปต์ขนาดเล็กที่ดำเนินการในเบราว์เซอร์แบบไม่มีหัวเพื่อตรวจสอบแพ็คเกจที่รวม ในช่วงเวลาของการเขียนนี้ปรากฏว่าการทดสอบนี้ไม่ได้เล่นอย่างดีในระบบย่อย Windows Linux
ด้วยเหตุนี้การทดสอบเบราว์เซอร์จึงสามารถปิดใช้งานได้โดยการดำรงอยู่ของไฟล์ชื่อ. disable-test-browser
sudo apt-get install libfontconfig
หากการดำเนินการ splice ใด ๆ ส่งผลกระทบต่อเซลล์ที่ผสานกลุ่ม MERGE จะไม่ถูกย้ายอย่างถูกต้อง
เวอร์ชัน | การเปลี่ยนแปลง |
---|---|
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. Changes
|
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 |
|