قراءة بيانات وأنماط جداول البيانات ومعالجتها وكتابتها إلى XLSX وJSON.
تم إجراء هندسة عكسية من ملفات جداول بيانات Excel كمشروع.
npm install exceljs
المساهمات هي موضع ترحيب كبير! إنه يساعدني في معرفة الميزات المطلوبة أو الأخطاء التي تسبب أكبر قدر من الألم.
لدي طلب واحد فقط؛ إذا قمت بإرسال طلب سحب لإصلاح الأخطاء، فيرجى إضافة اختبار الوحدة أو اختبار التكامل (في مجلد المواصفات) الذي يكتشف المشكلة. حتى العلاقات العامة التي لديها اختبار فاشل لا بأس بها - يمكنني تحليل ما يفعله الاختبار وإصلاح الكود من ذلك.
ملحوظة: يرجى محاولة تجنب تعديل إصدار الحزمة في العلاقات العامة. يتم تحديث الإصدارات عند الإصدار وأي تغيير سيؤدي على الأرجح إلى حدوث تصادمات مدمجة.
للتوضيح، سيتم تضمين جميع المساهمات المضافة إلى هذه المكتبة في ترخيص MIT الخاص بالمكتبة.
const ExcelJS = require ( 'exceljs' ) ;
لاستخدام كود ES5 المنقول، على سبيل المثال، لإصدارات Node.js الأقدم من 10، استخدم المسار dist/es5.
const ExcelJS = require ( 'exceljs/dist/es5' ) ;
ملاحظة: يحتوي إصدار ES5 على تبعية ضمنية لعدد من عمليات polyfills التي لم تعد تتم إضافتها بشكل صريح بواسطة 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 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/:
واحد مع تبعيات ضمنية على polyfills core-js ...
< 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 ;
الخصائص المدعومة
اسم | تقصير | وصف |
---|---|---|
tabColor | غير محدد | لون علامات التبويب |
مخطط تفصيليLevelCol | 0 | مستوى المخطط التفصيلي لعمود ورقة العمل |
outlineLevelRow | 0 | مستوى المخطط التفصيلي لصف ورقة العمل |
defaultRowHeight | 15 | ارتفاع الصف الافتراضي |
defaultColWidth | (خياري) | عرض العمود الافتراضي |
dyDescent | 55 | سيتم تحديده لاحقًا |
تمت إضافة بعض المقاييس الجديدة إلى ورقة العمل...
اسم | وصف |
---|---|
عدد الصفوف | الحجم الإجمالي لصف المستند. يساوي رقم الصف في الصف الأخير الذي يحتوي على قيم. |
actualRowCount | حساب عدد الصفوف التي تحتوي على قيم. إذا كان صف منتصف المستند فارغًا، فلن يتم تضمينه في العدد. |
عدد الأعمدة | إجمالي حجم العمود للمستند. يساوي الحد الأقصى لعدد الخلايا من كافة الصفوف |
actualColumnCount | حساب عدد الأعمدة التي تحتوي على قيم. |
يتم الاحتفاظ بجميع الخصائص التي يمكن أن تؤثر على طباعة الورقة في كائن 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' ;
إعدادات إعداد الصفحة المدعومة
اسم | تقصير | وصف |
---|---|---|
الهوامش | مسافة بيضاء على حدود الصفحة. الوحدات هي بوصة. | |
توجيه | 'لَوحَة' | اتجاه الصفحة - أي أطول (عمودي) أو أوسع (أفقي) |
HorizontalDpi | 4294967295 | النقاط الأفقية لكل بوصة. القيمة الافتراضية هي -1 |
VerticalDpi | 4294967295 | النقاط العمودية لكل بوصة. القيمة الافتراضية هي -1 |
com.fitToPage | سواء كنت تريد استخدام fitToWidth وfitToHeight أو إعدادات القياس. يعتمد الإعداد الافتراضي على وجود هذه الإعدادات في كائن pageSetup - إذا كان كلاهما موجودًا، فسيفوز المقياس (أي سيكون الإعداد الافتراضي خطأ) | |
pageOrder | "أسفل ثم فوق" | أي ترتيب لطباعة الصفحات - أحد ['downThenOver'، 'overThenDown'] |
blackAndWhite | خطأ شنيع | طباعة بدون لون |
مسودة | خطأ شنيع | الطباعة بجودة أقل (وحبر) |
تعليقات الخلية | 'لا أحد' | مكان وضع التعليقات - أحد ['atEnd'، 'asDisplayed'، 'None'] |
أخطاء | "معروض" | مكان إظهار الأخطاء - واحدة من ['شرطة'، 'فارغة'، 'غير متوفر'، 'معروض'] |
حجم | 100 | قيمة النسبة المئوية لزيادة أو تقليل حجم الطباعة. نشط عندما يكون fitToPage خطأ |
com.fitToWidth | 1 | كم عدد الصفحات التي يجب طباعة الورقة عليها؟ نشط عندما يكون fitToPage صحيحًا |
com.fitToHeight | 1 | كم عدد الصفحات التي يجب طباعة الورقة عليها؟ نشط عندما يكون fitToPage صحيحًا |
حجم الورق | ما حجم الورق الذي يجب استخدامه (انظر أدناه) | |
showRowColHeaders | خطأ شنيع | ما إذا كان سيتم إظهار أرقام الصفوف وأحرف الأعمدة |
showGridLines | خطأ شنيع | ما إذا كان سيتم إظهار خطوط الشبكة |
رقم الصفحة الأولى | ما هو الرقم الذي يجب استخدامه للصفحة الأولى | |
HorizontalCentered | خطأ شنيع | ما إذا كان سيتم توسيط بيانات الورقة أفقيًا |
VerticalCentered | خطأ شنيع | ما إذا كان سيتم توسيط بيانات الورقة عموديًا |
أحجام الورق سبيل المثال
اسم | قيمة |
---|---|
خطاب | غير محدد |
قانوني | 5 |
تنفيذي | 7 |
أ3 | 8 |
A4 | 9 |
أ5 | 11 |
B5 (جيس) | 13 |
المغلف رقم 10 | 20 |
المغلف DL | 27 |
المغلف C5 | 28 |
المغلف B5 | 34 |
مغلف العاهل | 37 |
تم تدوير البطاقة البريدية اليابانية المزدوجة | 82 |
16 كيلو 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، مما يشير إلى أن رؤوس/تذييلات الصفحة الأولى تختلف عن الصفحات الأخرى |
مختلفةOddEven | خطأ شنيع | قم بتعيين قيمة DifferentOddEven على أنها true، مما يشير إلى أن الرؤوس/التذييلات للصفحات الفردية والزوجية مختلفة |
com.oddHeader | باطل | تعيين سلسلة رأس للصفحات الفردية (الافتراضية)، ويمكن تنسيق السلسلة |
com.oddFooter | باطل | تعيين سلسلة تذييل للصفحات الفردية (الافتراضية)، ويمكن تنسيق السلسلة |
EvenHeader | باطل | تعيين سلسلة الرأس للصفحات الزوجية، يمكن تنسيق السلسلة |
EvenFooter | باطل | تعيين سلسلة تذييل للصفحات الزوجية، يمكن تنسيق السلسلة |
firstHeader | باطل | تعيين سلسلة رأس للصفحة الأولى، يمكن تنسيق السلسلة |
firstFooter | باطل | تعيين سلسلة تذييل للصفحة الأولى، يمكن تنسيق السلسلة |
أوامر البرنامج النصي
الأوامر | وصف |
---|---|
&ل | ضبط الموقف على اليسار |
&ج | تعيين الموقف إلى المركز |
& ر | تعيين الموقف إلى اليمين |
&ص | رقم الصفحة الحالية |
& ن | إجمالي عدد الصفحات |
&د | التاريخ الحالي |
&ت | الوقت الحالي |
&ز | صورة |
&أ | اسم ورقة العمل |
&F | اسم الملف |
&ب | جعل النص غامقًا |
&أنا | جعل النص مائلًا |
&U | تسطير النص |
&"اسم الخط" | اسم الخط، على سبيل المثال &"Aril" |
&حجم الخط | حجم الخط مثلا 12 |
&KHEXCode | لون الخط، على سبيل المثال &KCCCCCC |
تدعم أوراق العمل الآن قائمة طرق العرض التي تتحكم في كيفية عرض Excel للورقة:
يدعم كل عرض أيضًا خصائص مختلفة:
اسم | تقصير | وصف |
---|---|---|
ولاية | 'طبيعي' | يتحكم في حالة العرض - عادية أو مجمدة أو منقسمة |
rightToLeft | خطأ شنيع | يضبط اتجاه عرض ورقة العمل من اليمين إلى اليسار |
activeCell | غير محدد | الخلية المحددة حاليًا |
showRuler | حقيقي | إظهار المسطرة أو إخفاؤها في تخطيط الصفحة |
showRowColHeaders | حقيقي | إظهار أو إخفاء رؤوس الصفوف والأعمدة (على سبيل المثال A1، B1 في الأعلى و1،2،3 على اليسار) |
showGridLines | حقيقي | إظهار خطوط الشبكة أو إخفاؤها (تظهر للخلايا التي لم يتم تعريف حدودها) |
ZoomScale | 100 | النسبة المئوية للتكبير/التصغير المستخدمة للعرض |
ZoomScaleNormal | 100 | تكبير عادي للعرض |
أسلوب | غير محدد | نمط العرض التقديمي - أحد أساليب pageBreakPreview أو pageLayout. ملاحظة: pageLayout غير متوافق مع طرق العرض المجمدة |
تدعم طرق العرض المجمدة الخصائص الإضافية التالية:
اسم | تقصير | وصف |
---|---|---|
xSplit | 0 | كم عدد الأعمدة للتجميد. لتجميد الصفوف فقط، اضبط هذا على 0 أو غير محدد |
ySplit | 0 | كم عدد الصفوف للتجميد. لتجميد الأعمدة فقط، اضبط هذا على 0 أو غير محدد |
topLeftCell | خاص | ما هي الخلية التي ستكون في أعلى اليسار في الجزء السفلي الأيمن؟ ملحوظة: لا يمكن أن تكون خلية مجمدة. الإعدادات الافتراضية للخلية غير المجمدة الأولى |
worksheet . views = [
{ state : 'frozen' , xSplit : 2 , ySplit : 3 , topLeftCell : 'G10' , activeCell : 'A1' }
] ;
تدعم طرق العرض المقسمة الخصائص الإضافية التالية:
اسم | تقصير | وصف |
---|---|---|
xSplit | 0 | كم نقطة من اليسار لوضع الخائن. للتقسيم عموديًا، اضبط هذا على 0 أو غير محدد |
ySplit | 0 | كم نقطة من الأعلى لوضع الخائن. للتقسيم أفقيًا، اضبط هذا على 0 أو غير محدد |
topLeftCell | غير محدد | ما هي الخلية التي ستكون في أعلى اليسار في الجزء السفلي الأيمن؟ |
activePane | غير محدد | أي جزء سيكون نشطًا - أحد الأجزاء من أعلى اليسار، وأعلى اليمين، وأسفل اليسار، وأسفل اليمين |
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" لـ لا شيء | 'ن' |
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" لـ لا شيء | 'ن' |
// 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 هذه العناصر في قائمة منسدلة لسهولة الدخول |
جميع | يجب أن تكون القيمة عددًا صحيحًا |
عشري | يجب أن تكون القيمة رقمًا عشريًا |
طول النص | قد تكون القيمة نصًا ولكن يتم التحكم في الطول |
مخصص | تتحكم الصيغة المخصصة في القيم الصالحة |
بالنسبة للأنواع الأخرى غير القائمة أو المخصصة، تؤثر عوامل التشغيل التالية على التحقق من الصحة:
المشغل | وصف |
---|---|
بين | يجب أن تقع القيم بين نتائج الصيغة |
ليس بين | يجب ألا تقع القيم بين نتائج الصيغة |
متساوي | يجب أن تساوي القيمة نتيجة الصيغة |
notEqual | يجب ألا تساوي القيمة نتيجة الصيغة |
أكبر من | يجب أن تكون القيمة أكبر من نتيجة الصيغة |
lessThan | يجب أن تكون القيمة أقل من نتيجة الصيغة |
أكبر من يساوي | يجب أن تكون القيمة أكبر من أو تساوي نتيجة الصيغة |
lessThanOrEqual | يجب أن تكون القيمة أقل من أو تساوي نتيجة الصيغة |
// 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 ]
}
ملكية | مطلوب | القيمة الافتراضية | وصف |
---|---|---|---|
insetmode | ن | 'آلي' | تحديد ما إذا كان سيتم تعيين هوامش التعليق تلقائيًا وتكون القيمة "تلقائية" أو "مخصصة" |
أقحم | ن | [0.13، 0.13، 0.25، 0.25] | مسافة بيضاء على حدود التعليق. الوحدات هي سنتيمتر. الاتجاه هو اليسار، أعلى، يمين، أسفل |
ملاحظة: يصبح هذا الإعداد inset
ساري المفعول فقط عندما تكون قيمة insetmode
"مخصصة".
تحديد حالة قفل الكائنات ونص الكائن باستخدام سمات الحماية.
ws . getCell ( 'B1' ) . note . protection = {
locked : 'False' ,
lockText : 'False' ,
} ;
ملكية | مطلوب | القيمة الافتراضية | وصف |
---|---|---|---|
مغلق | ن | 'حقيقي' | يحدد هذا العنصر أن الكائن مقفل عندما تكون الورقة محمية |
lockText | ن | 'حقيقي' | يحدد هذا العنصر أن نص الكائن مقفل |
ملاحظة: تكون الكائنات المؤمنة صالحة فقط عندما تكون ورقة العمل محمية.
يمكن أن تحتوي تعليقات الخلية أيضًا على الخاصية "editAs" والتي ستتحكم في كيفية ربط التعليقات بالخلية (الخلايا). يمكن أن تحتوي على إحدى القيم التالية:
ws . getCell ( 'B1' ) . note . editAs = 'twoCells' ;
قيمة | وصف |
---|---|
twoCells | ويحدد أن حجم الملاحظة وموضعها يختلف باختلاف الخلايا |
oneCells | وهو يحدد أن حجم الملاحظة ثابت وأن الموضع يتغير مع الخلية |
مطلق | هذا هو الافتراضي. لن يتم نقل التعليقات أو تغيير حجمها بالخلايا |
تسمح الجداول بمعالجة البيانات الجدولية داخل الورقة.
لإضافة جدول إلى ورقة عمل، حدد نموذج جدول واستدعاء 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 | إظهار الرؤوس في أعلى الجدول | ن | حقيقي |
TotalsRow | إظهار الإجماليات في أسفل الجدول | ن | خطأ شنيع |
أسلوب | خصائص النمط الإضافية | ن | {} |
أعمدة | تعريفات العمود | ي | |
صفوف | صفوف من البيانات | ي |
يحدد الجدول التالي الخصائص المدعومة ضمن خاصية نمط الجدول.
خاصية النمط | وصف | مطلوب | القيمة الافتراضية |
---|---|---|---|
سمة | موضوع اللون من الجدول | ن | "تابل ستايلميديوم 2" |
showFirstColumn | قم بتمييز العمود الأول (غامق) | ن | خطأ شنيع |
showLastColumn | قم بتمييز العمود الأخير (غامق) | ن | خطأ شنيع |
showRowStripes | تظهر الصفوف البديلة مع لون الخلفية | ن | خطأ شنيع |
showColumnStripes | تظهر الصفوف البديلة مع لون الخلفية | ن | خطأ شنيع |
يحدد الجدول التالي الخصائص المدعومة داخل كل عمود في الجدول.
خاصية العمود | وصف | مطلوب | القيمة الافتراضية |
---|---|---|---|
اسم | اسم العمود، يستخدم أيضًا في الرأس | ي | |
filterButton | يقوم بتبديل عنصر التحكم في التصفية في الرأس | ن | خطأ شنيع |
TotalsRowLabel | تسمية لوصف صف الإجماليات (العمود الأول) | ن | 'المجموع' |
TotalsRowFunction | اسم الدالة الإجماليات | ن | 'لا أحد' |
TotalsRowFormula | صيغة اختيارية للوظائف المخصصة | ن |
يسرد الجدول التالي القيم الصالحة لخاصية TotalsRowFunction المحددة بواسطة الأعمدة. إذا تم استخدام أي قيمة غير "مخصص"، فليس من الضروري تضمين الصيغة المرتبطة حيث سيتم إدراجها بواسطة الجدول.
وظائف الإجماليات | وصف |
---|---|
لا أحد | لا توجد دالة إجماليات لهذا العمود |
متوسط | حساب المتوسط للعمود |
countNums | عد الإدخالات التي هي أرقام |
عدد | عدد الإدخالات |
الأعلى | الحد الأقصى للقيمة في هذا العمود |
دقيقة | الحد الأدنى للقيمة في هذا العمود |
com.stdDev | الانحراف المعياري لهذا العمود |
فار | التباين لهذا العمود |
مجموع | مجموع الإدخالات لهذا العمود |
مخصص | صيغة مخصصة. يتطلب قيمة 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
خاصية الخط | وصف | مثال على القيمة (القيم) |
---|---|---|
اسم | اسم الخط. | "أريال" و"كاليبر" وما إلى ذلك. |
عائلة | عائلة الخطوط الاحتياطية. قيمة عددية. | 1 - شريف، 2 - بلا شريف، 3 - مونو، أخرى - غير معروف |
مخطط | مخطط الخطوط. | "ثانوي"، "رئيسي"، "لا شيء" |
مجموعة محارف | مجموعة محارف الخط. قيمة عددية. | 1، 2، الخ. |
مقاس | حجم الخط. قيمة عددية. | 9، 10، 12، 16، الخ. |
لون | وصف اللون، كائن يحتوي على قيمة ARGB. | {أرجب: 'FFFF0000'} |
عريض | وزن الخط | صحيح، كاذب |
مائل | منحدر الخط | صحيح، كاذب |
تسطير | نمط تسطير الخط | صحيح، خطأ، "لا شيء"، "مفرد"، "مزدوج"، "حساب فردي"، "حساب مزدوج" |
يضرب | خط | صحيح، كاذب |
الخطوط العريضة | مخطط الخط | صحيح، كاذب |
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' } ;
قيم خاصية المحاذاة الصالحة
أفقي | رَأسِيّ | التفاف النص | com.shrinkToFit | مسافة بادئة | readOrder | textRotation |
---|---|---|---|---|---|---|
غادر | قمة | حقيقي | حقيقي | عدد صحيح | rtl | 0 إلى 90 |
مركز | وسط | خطأ شنيع | خطأ شنيع | لتر | -1 إلى -90 | |
يمين | قاع | رَأسِيّ | ||||
يملأ | موزعة | |||||
يبرر | يبرر | |||||
centerContinous | ||||||
موزعة |
// 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 | ن | يحدد اللون الأمامي للنمط. الافتراضي أسود. |
bgColor | ن | يحدد لون خلفية النمط. الافتراضي هو الأبيض. |
ملاحظة: إذا كنت تريد ملء خلية باستخدام النمط solid
، فلن تحتاج إلى تحديد bgColor
. انظر المثال أعلاه للخلية A3
ذات النمط solid
والمرجاني fgColor
.
أنواع الأنماط الصالحة
ملكية | مطلوب | وصف |
---|---|---|
يكتب | ي | القيمة: "التدرج" يحدد أن هذا التعبئة يستخدم التدرجات |
التدرج | ي | يحدد نوع التدرج. أحد ['الزاوية'، 'المسار'] |
درجة | زاوية | بالنسبة للتدرج "الزاوي"، يحدد اتجاه التدرج. 0 من اليسار إلى اليمين. القيم من 1 - 359 تدور في اتجاه عقارب الساعة |
مركز | طريق | للتدرج "المسار". يحدد الإحداثيات النسبية لبداية المسار. تتراوح القيم "اليسار" و"الأعلى" من 0 إلى 1 |
توقف | ي | يحدد تسلسل الألوان المتدرج. عبارة عن مصفوفة من الكائنات التي تحتوي على موضع ولون تبدأ بالموضع 0 وتنتهي بالموضع 1. ويمكن استخدام المواضع الوسيطة لتحديد ألوان أخرى على المسار. |
المحاذير
باستخدام الواجهة أعلاه، قد يكون من الممكن إنشاء تأثيرات تعبئة متدرجة غير ممكنة باستخدام برنامج محرر XLSX. على سبيل المثال، يدعم Excel فقط تدرجات الزوايا 0 و45 و90 و135. وبالمثل، قد يكون تسلسل التوقفات محدودًا أيضًا بواسطة واجهة المستخدم مع المواضع [0,1] أو [0,0.5,1] كخيارات فقط. انتبه لهذه التعبئة للتأكد من أنها مدعومة من قبل مشاهدي XLSX المستهدفين.
تدعم الخلايا الفردية الآن النص المنسق أو التنسيق داخل الخلية. يمكن لقيم النص المنسق التحكم في خصائص الخط لأي عدد من السلاسل الفرعية داخل قيمة النص. راجع الخطوط للحصول على قائمة كاملة بالتفاصيل حول خصائص الخطوط المدعومة.
ws . getCell ( 'A1' ) . value = {
'richText' : [
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 0 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : 'This is ' } ,
{ 'font' : { 'italic' : true , 'size' : 12 , 'color' : { 'theme' : 0 } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'a' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' ' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'argb' : 'FFFF6600' } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'colorful' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' text ' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'argb' : 'FFCCFFCC' } , 'name' : 'Calibri' , 'scheme' : 'minor' } , 'text' : 'with' } ,
{ 'font' : { 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : ' in-cell ' } ,
{ 'font' : { 'bold' : true , 'size' : 12 , 'color' : { 'theme' : 1 } , 'name' : 'Calibri' , 'family' : 2 , 'scheme' : 'minor' } , 'text' : 'format' }
]
} ;
expect ( ws . getCell ( 'A1' ) . text ) . to . equal ( 'This is a colorful text with in-cell format' ) ;
expect ( ws . getCell ( 'A1' ) . type ) . to . equal ( Excel . ValueType . RichText ) ;
يمكن تعديل الحماية على مستوى الخلية باستخدام خاصية الحماية.
ws . getCell ( 'A1' ) . protection = {
locked : false ,
hidden : true ,
} ;
خصائص الحماية المدعومة
ملكية | تقصير | وصف |
---|---|---|
مغلق | حقيقي | يحدد ما إذا كان سيتم تأمين الخلية إذا كانت الورقة محمية. |
مختفي | خطأ شنيع | يحدد ما إذا كانت صيغة الخلية ستكون مرئية إذا كانت الورقة محمية. |
يسمح التنسيق الشرطي للورقة بإظهار أنماط وأيقونات محددة وما إلى ذلك اعتمادًا على قيم الخلية أو أي صيغة عشوائية.
تتم إضافة قواعد التنسيق الشرطي على مستوى الورقة وستغطي عادةً نطاقًا من الخلايا.
يمكن تطبيق قواعد متعددة على نطاق خلايا معين وستطبق كل قاعدة نمطها الخاص.
إذا أثرت قواعد متعددة على خلية معينة، فستحدد قيمة أولوية القاعدة القاعدة التي ستفوز في حالة تصادم الأنماط المتنافسة. القاعدة ذات الأولوية الأقل تفوز. إذا لم يتم تحديد قيم الأولوية لقاعدة معينة، فسيقوم ExcelJS بتعيينها بترتيب تصاعدي.
ملاحظة: في الوقت الحالي، يتم دعم مجموعة فرعية فقط من قواعد التنسيق الشرطي. على وجه التحديد، فقط قواعد التنسيق التي لا تتطلب عرض XML داخل عنصر <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' } } } ,
}
]
} )
أنواع قواعد التنسيق الشرطي المدعومة
يكتب | وصف |
---|---|
تعبير | يمكن استخدام أي وظيفة مخصصة لتنشيط القاعدة. |
cellIs | يقارن قيمة الخلية مع الصيغة المتوفرة باستخدام عامل التشغيل المحدد |
top10 | يطبق التنسيق على الخلايا ذات القيم الموجودة في النطاقات العلوية (أو السفلية). |
فوق المتوسط | يطبق التنسيق على الخلايا ذات القيم أعلى (أو أقل) من المتوسط |
colorScale | يطبق خلفية ملونة على الخلايا بناءً على مكان وجود قيمها في النطاق |
IconSet | يضيف أحد نطاقات الرموز إلى الخلايا بناءً على القيمة |
يحتوي على نص | يطبق التنسيق بناءً على ما إذا كانت الخلية عبارة عن نص معين |
فترة زمنية | يطبق التنسيق بناءً على ما إذا كانت قيمة تاريخ الخلية تقع ضمن نطاق محدد |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | 'تعبير' | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
الصيغ | صفيف من سلسلة صيغة واحدة تُرجع قيمة صحيحة/خطأ. للإشارة إلى قيمة الخلية، استخدم عنوان الخلية العلوي الأيسر | ||
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت الصيغة صحيحة |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "الخلية" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
مشغل | كيفية مقارنة قيمة الخلية بنتيجة الصيغة | ||
الصيغ | صفيف من سلسلة صيغة واحدة تُرجع القيمة المراد مقارنتها بكل خلية | ||
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
الخلية هي المشغلين
المشغل | وصف |
---|---|
متساوي | قم بتطبيق التنسيق إذا كانت قيمة الخلية تساوي قيمة الصيغة |
أكبر من | قم بتطبيق التنسيق إذا كانت قيمة الخلية أكبر من قيمة الصيغة |
lessThan | قم بتطبيق التنسيق إذا كانت قيمة الخلية أقل من قيمة الصيغة |
بين | تطبيق التنسيق إذا كانت قيمة الخلية تقع بين قيمتين للصيغة (ضمناً) |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "أعلى 10" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
رتبة | ي | 10 | يحدد عدد القيم العليا (أو السفلية) المضمنة في التنسيق |
بالمائة | ي | خطأ شنيع | إذا كان هذا صحيحًا، فإن حقل التصنيف يمثل نسبة مئوية، وليس مطلقًا |
قاع | ي | خطأ شنيع | إذا كان صحيحاً، فسيتم تضمين القيم السفلية بدلاً من الأعلى |
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "فوق المتوسط" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
فوق المتوسط | ي | خطأ شنيع | إذا كان هذا صحيحًا، فإن حقل التصنيف يمثل نسبة مئوية، وليس مطلقًا |
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "مقياس الألوان" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
com.cfvo | مجموعة من 2 إلى 5 كائنات قيمة تنسيق شرطي تحدد نقاط الطريق في نطاق القيمة | ||
لون | مجموعة الألوان المقابلة لاستخدامها في نقاط الطريق المحددة | ||
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "مجموعة الأيقونات" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
IconSet | ي | 3 إشارات المرور | اسم الأيقونة التي تم تعيينها للاستخدام |
showValue | حقيقي | يحدد ما إذا كانت الخلايا الموجودة في النطاق المطبق تعرض الأيقونة وقيمة الخلية، أو الأيقونة فقط | |
يعكس | خطأ شنيع | يحدد ما إذا كانت الأيقونات الموجودة في مجموعة الأيقونات المحددة في مجموعة الأيقونات سيتم عرضها بترتيب احتياطي. إذا كانت القيمة المخصصة تساوي "صحيح"، فيجب تجاهل هذه القيمة | |
مخصص | خطأ شنيع | يحدد ما إذا كان سيتم استخدام مجموعة مخصصة من الرموز | |
com.cfvo | مجموعة من 2 إلى 5 كائنات قيمة تنسيق شرطي تحدد نقاط الطريق في نطاق القيمة | ||
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "شريط البيانات" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
minLength | 0 | يحدد طول أقصر شريط بيانات في نطاق التنسيق الشرطي هذا | |
أقصى طول | 100 | يحدد طول أطول شريط بيانات في نطاق التنسيق الشرطي هذا | |
showValue | حقيقي | يحدد ما إذا كانت الخلايا الموجودة في نطاق التنسيق الشرطي تعرض كلاً من شريط البيانات والقيمة الرقمية أو شريط البيانات | |
التدرج | حقيقي | يحدد ما إذا كان شريط البيانات يحتوي على تعبئة متدرجة | |
حدود | حقيقي | يحدد ما إذا كان شريط البيانات له حدود | |
NegativeBarColorSameAsPositive | حقيقي | يحدد ما إذا كان شريط البيانات يحتوي على لون شريط سلبي يختلف عن لون الشريط الموجب | |
NegativeBarBorderColorSameAsPositive | حقيقي | تحديد ما إذا كان شريط البيانات يحتوي على لون حدود سلبي يختلف عن لون الحدود الإيجابي | |
axisPosition | 'آلي' | يحدد موضع المحور لشريط البيانات | |
اتجاه | "من اليسار إلى اليمين" | يحدد اتجاه شريط البيانات | |
com.cfvo | مجموعة من 2 إلى 5 كائنات قيمة تنسيق شرطي تحدد نقاط الطريق في نطاق القيمة | ||
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "يحتوي على نص" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
مشغل | نوع مقارنة النص | ||
نص | النص للبحث عنه | ||
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
يحتوي على عوامل تشغيل النص
المشغل | وصف |
---|---|
يحتوي على نص | قم بتطبيق التنسيق إذا كانت قيمة الخلية تحتوي على القيمة المحددة في حقل "النص". |
يحتوي على الفراغات | قم بتطبيق التنسيق إذا كانت قيمة الخلية تحتوي على فراغات |
لا يحتوي على الفراغات | قم بتطبيق التنسيق إذا كانت قيمة الخلية لا تحتوي على فراغات |
يحتوي على أخطاء | قم بتطبيق التنسيق إذا كانت قيمة الخلية تحتوي على أخطاء |
لا يحتوي على أخطاء | قم بتطبيق التنسيق إذا كانت قيمة الخلية لا تحتوي على أخطاء |
مجال | خياري | تقصير | وصف |
---|---|---|---|
يكتب | "الفترة الزمنية" | ||
أولوية | ي | <تلقائي> | يحدد ترتيب الأولوية للأنماط |
فترة زمنية | ما هي الفترة الزمنية لمقارنة قيمة الخلية | ||
أسلوب | بنية النمط التي سيتم تطبيقها إذا كانت المقارنة صحيحة |
الفترات الزمنية
الفترة الزمنية | وصف |
---|---|
الأسبوع الماضي | قم بتطبيق التنسيق إذا كانت قيمة الخلية تقع خلال الأسبوع الماضي |
هذا الاسبوع | قم بتطبيق التنسيق إذا انخفضت قيمة الخلية في هذا الأسبوع |
الأسبوع المقبل | قم بتطبيق التنسيق إذا انخفضت قيمة الخلية في الأسبوع التالي |
أمس | قم بتطبيق التنسيق إذا كانت قيمة الخلية تساوي الأمس |
اليوم | قم بتطبيق التنسيق إذا كانت قيمة الخلية تساوي اليوم |
غداً | قم بتطبيق التنسيق إذا كانت قيمة الخلية تساوي الغد |
last7Days | قم بتطبيق التنسيق إذا كانت قيمة الخلية تقع خلال آخر 7 أيام |
lastMonth | قم بتطبيق التنسيق إذا انخفضت قيمة الخلية في الشهر الماضي |
thisMonth | قم بتطبيق التنسيق إذا انخفضت قيمة الخلية في هذا الشهر |
nextMonth | قم بتطبيق التنسيق إذا انخفضت قيمة الخلية في الشهر التالي |
يدعم برنامج 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، يمكن تعيين الخلفية لورقة العمل باستخدام وظيفة addBackgroundImage
// set background
worksheet . addBackgroundImage ( imageId1 ) ;
باستخدام معرف الصورة من Workbook.addImage، يمكن تضمين صورة داخل ورقة العمل لتغطية نطاق ما. ستغطي الإحداثيات المحسوبة من النطاق من أعلى يسار الخلية الأولى إلى أسفل يمين الخلية الثانية.
// insert an image over B2:D6
worksheet . addImage ( imageId2 , 'B2:D6' ) ;
باستخدام بنية بدلاً من سلسلة نطاق، من الممكن تغطية الخلايا جزئيًا.
لاحظ أن نظام الإحداثيات المستخدم لهذا يعتمد على الصفر، وبالتالي فإن الجزء العلوي الأيسر من A1 سيكون { col: 0, Row: 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 () تُرجع وعدًا يشير إلى أنه غير متزامن ، فإن التنفيذ الحالي يعمل على الخيط الرئيسي وسيستخدم حوالي 600 مللي ثانية على وحدة المعالجة المركزية المتوسطة. يمكن تعديل ذلك عن طريق ضبط spincount ، والذي يمكن استخدامه لجعل العملية إما أسرع أو أكثر مرونة.
مجال | تقصير | وصف |
---|---|---|
SelectOckedCells | حقيقي | يتيح للمستخدم تحديد الخلايا المقفلة |
SelectUnlockedCells | حقيقي | يتيح للمستخدم تحديد الخلايا غير المؤمنة |
formatcells | خطأ شنيع | يتيح لخلايا تنسيق المستخدم |
FormatColumns | خطأ شنيع | يتيح لأعمدة تنسيق المستخدم |
الأشكال | خطأ شنيع | يتيح صفوف تنسيق المستخدم |
insertrows | خطأ شنيع | يتيح للمستخدم إدراج صفوف |
insertColumns | خطأ شنيع | يتيح للمستخدم إدراج أعمدة |
inserthyperlinks | خطأ شنيع | يتيح للمستخدم إدخال الارتباطات التشعبية |
DELETEROWS | خطأ شنيع | يتيح للمستخدم حذف صفوف |
حذف | خطأ شنيع | يتيح للمستخدم حذف الأعمدة |
نوع | خطأ شنيع | يتيح لمستخدم بيانات فرز المستخدم |
المرشح التلقائي | خطأ شنيع | يتيح لبيانات تصفية المستخدم في الجداول |
Pivottables | خطأ شنيع | يتيح للمستخدم استخدام الجداول المحورية |
Spincount | 100000 | عدد تكرارات التجزئة التي يتم تنفيذها عند الحماية أو دون الإحصاء |
الخيارات المدعومة عند قراءة ملفات XLSX.
مجال | مطلوب | يكتب | وصف |
---|---|---|---|
الجهل | ن | صفيف | قائمة بأسماء العقدة لتجاهلها أثناء تحميل مستند XLSX. يحسن الأداء في بعض الحالات. متاح sheetProtection sheetPr extLst dimension ، sheetViews ، sheetFormatPr conditionalFormatting cols picture sheetData printOptions autoFilter drawing mergeCells tableParts rowBreaks ، hyperlinks headerFooter pageMargins pageSetup dataValidations , |
// 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. |
رسم خريطة | ن | وظيفة | custom array.prototype.map () وظيفة رد الاتصال لمعالجة البيانات. |
SheetName | ن | خيط | حدد اسم ورقة العمل. |
parseroptions | ن | هدف | خيارات ParseOptions @FAST-CSV/FORMAT MODULE لكتابة بيانات 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. سيتم تمرير التنسيقات في الخيارات التي تم تمريرها إلى وظيفة الكتابة أعلاه إلى وحدة @csv/format لكتابة بيانات CSV. يرجى الرجوع إلى fast-csv readme.md للحصول على التفاصيل.
يتم تحليل التواريخ باستخدام NPM Module Dayjs. إذا لم يتم توفير مجموعة DateFormats ، يتم استخدام Sathformats التالية:
يرجى الرجوع إلى البرنامج المساعد CustomParseformat DayJS للحصول على تفاصيل حول كيفية هيكلة DateFormat.
الخيارات المدعومة عند الكتابة إلى ملف CSV.
مجال | مطلوب | يكتب | وصف |
---|---|---|---|
DateFormat | ن | خيط | حدد تنسيق ترميز التاريخ من Dayjs. |
DateUtc | ن | منطقية | حدد ما إذا كان exceljs يستخدم dayjs.utc () لتحويل المنطقة الزمنية لتحليل التواريخ. |
ترميز | ن | خيط | حدد تنسيق ترميز الملف. (ينطبق فقط على .writeFile .) |
تشمل emptyrows | ن | منطقية | يحدد ما إذا كان يمكن كتابة الصفوف الفارغة. |
رسم خريطة | ن | وظيفة | custom array.prototype.map () وظيفة رد الاتصال لمعالجة قيم صف. |
SheetName | ن | خيط | حدد اسم ورقة العمل. |
ورقة | ن | رقم | حدد معرف ورقة العمل. |
التنسيق | ن | هدف | خيارات FormatterOptions @Fast-CSV/Format Module لكتابة بيانات 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. سيتم تمرير التنسيقات في الخيارات التي تم تمريرها إلى وظيفة الكتابة أعلاه إلى وحدة @csv/format لكتابة بيانات CSV. يرجى الرجوع إلى fast-csv readme.md للحصول على التفاصيل.
يتم تنسيق التواريخ باستخدام NPM Module Dayjs. إذا لم يتم توفير DateFormat ، يتم استخدام Dayjs.iso_8601. عند كتابة CSV ، يمكنك تزويد DateUtc Boolean باعتباره صحيحًا أن يكون ذلك Exceljs تحليلًا دون تحويل المنطقة الزمنية تلقائيًا باستخدام dayjs.utc()
.
يتطلب الملف الذي تم توثيقه أعلاه أن يتم بناء مصنف كامل في الذاكرة قبل كتابة الملف. على الرغم من مريحة ، يمكن أن يحد من حجم المستند بسبب مقدار الذاكرة المطلوبة.
يقوم كاتب البث (أو القارئ) بمعالجة بيانات المصنف أو ورقة العمل عند إنشاؤه ، وتحويله إلى نموذج ملف كما هو الحال. عادةً ما يكون هذا أكثر فاعلية على الذاكرة حيث تكون بصمة الذاكرة النهائية وحتى آثار أقدام الذاكرة المتوسطة أكثر إحكاما من إصدار المستند ، خاصة عندما تفكر في أن كائنات الصف والخلايا يتم التخلص منها بمجرد ارتكابها.
الواجهة إلى مصنف البث وورقة العمل هي نفسها تقريبًا مثل إصدارات المستندات مع بعض الاختلافات العملية البسيطة:
لاحظ أنه من الممكن إنشاء المصنف بأكمله دون ارتكاب أي صفوف. عندما يتم ارتكاب المصنف ، سيتم ارتكاب جميع أوراق العمل المضافة (بما في ذلك جميع الصفوف غير الملتزمة) تلقائيًا. ولكن في هذه الحالة ، سيتم الحصول على القليل على إصدار المستند.
يتوفر كاتب Preaming XLSX Workbook في مساحة الاسم Exceljs.stream.xlsx.
يأخذ المنشئ كائن خيارات اختيارية مع الحقول التالية:
مجال | وصف |
---|---|
تدفق | يحدد دفقًا قابلًا للكتابة لكتابة مصنف XLSX إلى. |
اسم الملف | إذا لم يتم تحديد الدفق ، فإن هذا الحقل يحدد المسار إلى ملف لكتابة مصنف XLSX إليه. |
usesharedstrings | يحدد ما إذا كنت تريد استخدام السلاسل المشتركة في المصنف. الافتراضي false . |
الولايات المتحدة | يحدد ما إذا كنت تريد إضافة معلومات النمط إلى المصنف. أنماط يمكن أن تضيف بعض الأداء النفقات العامة. الافتراضي false . |
أَزِيز | خيارات الرمز البريدي التي تمر داخليًا إلى أرشيف. الافتراضي undefined . |
إذا لم يتم تحديد دفق أو اسم الملف في الخيارات ، فسيقوم كاتب المصنف بإنشاء كائن Streambuf الذي سيخزن محتويات كتاب XLSX في الذاكرة. يمكن استخدام كائن Streambuf ، الذي يمكن الوصول إليه عبر مصنف العقار.
// 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
يتوفر قارئ Dreaming XLSX Workbook في مساحة الاسم Exceljs.stream.xlsx.
يأخذ المنشئ وسيطة إدخال مطلوبة وحجة خيارات اختيارية:
دعوى | وصف |
---|---|
المدخلات (مطلوب) | يحدد اسم الملف أو الدفق القابل للقراءة لقراءة مصنف XLSX. |
الخيارات (اختيارية) | يحدد كيفية التعامل مع أنواع الأحداث التي تحدث أثناء التحليل القراءة. |
الخيارات | يحدد ما إذا كان يجب انبعاث الإدخالات ( 'emit' ) أم لا ( 'ignore' ). الافتراضي هو 'emit' . |
Options.SharedStrings | يحدد ما إذا كنت تريد ذاكرة التخزين المؤقت للسلاسل المشتركة ( 'cache' ) ، والتي تدخلها في قيم الخلايا المعنية ، أو ما إذا كان يجب أن تنبعث منها ( 'emit' ) أو تجاهلها ( 'ignore' ) ، في كلتا الحالتين ستكون قيمة الخلية إشارة إلى فهرس السلسلة المشتركة. الافتراضي هو 'cache' . |
Options.hyperlinks | يحدد ما إذا كنت تريد ارتباطات مخبأ ( 'cache' ) ، والتي تدرجها في خلايا كل منها ، سواء أكانها تنبعث منها ( 'emit' ) أو ما إذا كان لتجاهلها ( 'ignore' ). الافتراضي هو 'cache' . |
الخيارات | يحدد ما إذا كنت تريد أنماط ذاكرة التخزين المؤقت ( 'cache' ) ، والتي تدرجها في صفوفهم وخلاياها ، أو ما إذا كان يجب تجاهلها ( 'ignore' ). الافتراضي هو 'cache' . |
الخيارات | يحدد ما إذا كان يجب انبعاث أوراق العمل ( 'emit' ) أم لا ( 'ignore' ). الافتراضي هو 'emit' . |
const workbookReader = new ExcelJS . stream . xlsx . WorkbookReader ( './file.xlsx' ) ;
for await ( const worksheetReader of workbookReader ) {
for await ( const row of worksheetReader ) {
// ...
}
}
يرجى ملاحظة أن worksheetReader
لإرجاع مجموعة من الصفوف بدلاً من كل صف بشكل فردي لأسباب الأداء: Nodejs/Node#31979
الأحداث على المصنف هي "ورقة العمل" و "السلاسل المشتركة" و "الارتباطات التشعبية". الأحداث في ورقة العمل هي "ROW" و "الارتباطات التشعبية".
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 في المتصفح ، ألقِ نظرة على مجلد المواصفات/المتصفح في Github Repo.
الملفات التالية تتراكم مسبقًا وتضمينها داخل مجلد DIST.
يتم دعم أنواع القيمة التالية.
enum: excel.valuetype.null
تشير القيمة الخالية إلى عدم وجود قيمة ولن يتم تخزينها عادة عند كتابتها إلى ملف (باستثناء الخلايا المدمجة). يمكن استخدامه لإزالة القيمة من الخلية.
على سبيل المثال
worksheet . getCell ( 'A1' ) . value = null ;
التعداد: excel.valuetype.merge
خلية دمج هي خلية لها قيمتها المرتبطة بخلية "سيد" أخرى. سيؤدي تعيين خلية دمج إلى تعديل خلية الماجستير.
enum: 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 ) ;
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 لحساب القيم أثناء الطيران. لاحظ أنه على الرغم من أن نوع الخلية سيكون صيغة ، فقد يكون للخلية قيمة تأثير مستمدة من قيمة النتيجة.
لاحظ أن exceljs لا يمكن معالجة الصيغة لإنشاء نتيجة ، يجب توفيرها.
لاحظ أن الأسماء الدلالية للوظيفة يجب أن تكون باللغة الإنجليزية ويجب أن يكون الفاصل فاصلة.
على سبيل المثال
worksheet . getCell ( 'A3' ) . value = { formula : 'A1+A2' , result : 7 } ;
worksheet . getCell ( 'A3' ) . value = { formula : 'SUM(A1,A2)' , result : 7 } ;
تدعم الخلايا أيضًا getters الراحة للوصول إلى الصيغة والنتيجة:
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.
ستترجم Getter Formula Formula الصيغة في A2 إلى ما يجب أن يكون في B2:
expect ( worksheet . getCell ( 'B2' ) . formula ) . to . equal ( 'B1' ) ;
يمكن تعيين الصيغ المشتركة في ورقة باستخدام وظيفة "flowformula":
// set A1 to starting number
worksheet . getCell ( 'A1' ) . value = 1 ;
// fill A2 to A10 with ascending count starting from A1
worksheet . fillFormula ( 'A2:A10' , 'A1+1' , [ 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ) ;
يمكن لـ FillFormula أيضًا استخدام وظيفة رد الاتصال لحساب القيمة في كل خلية
// fill A2 to A100 with ascending count starting from A1
worksheet . fillFormula ( 'A2:A100' , 'A1+1' , ( row , col ) => row ) ;
للتمييز بين خلايا الصيغة الحقيقية والمترجمة ، استخدم formulatype getter:
worksheet . getCell ( 'A3' ) . formulaType === Enums . FormulaType . Master ;
worksheet . getCell ( 'B3' ) . formulaType === Enums . FormulaType . Shared ;
نوع الصيغة له القيم التالية:
اسم | قيمة |
---|---|
Enums.formulatype.none | 0 |
Enums.formulatype.master | 1 |
enums.formulatype.shared | 2 |
طريقة جديدة للتعبير عن الصيغ المشتركة في Excel هي صيغة المصفوفة. في هذا النموذج ، تكون الخلية الرئيسية هي الخلية الوحيدة التي تحتوي على أي معلومات تتعلق بالصيغة. أنه يحتوي على "صفيف" sharetype جنبا إلى جنب مع نطاق الخلايا التي تنطبق عليها والصيغة التي سيتم نسخها. بقية الخلايا هي خلايا منتظمة ذات قيم منتظمة.
ملاحظة: لا تترجم صيغ الصفيف بالطريقة التي توجد بها الصيغ المشتركة. لذلك إذا كانت الخلايا الرئيسية 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' ) ;
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.notable | #غير متاح |
excel.errorvalue.ref | #المرجع! |
excel.errorvalue.name | #اسم؟ |
excel.errorvalue.divzero | #div/0! |
excel.errorvalue.null | #باطل! |
excel.errorvalue.value | #قيمة! |
excel.errorvalue.num | #نوم! |
بذل كل جهد ممكن لإنشاء واجهة ثابتة لا تخترق الإصدارات ولكن للأسف ، بين الحين والآخر يجب أن تتغير بعض الأشياء من أجل الصالح الأكبر.
تم تبديل الوسيطات الواردة في وظيفة رد الاتصال إلى ورقة العمل. تم تبديلها وتغييرها ؛ كانت الوظيفة (Rownumber ، Rolvalues) ، والآن هي الوظيفة (الصف ، والركوب) والتي تمنحها نظرة وتشعر بمزيد من الدالة السفلية (_.each) وأولويات كائن الصف فوق رقم الصف.
لقد تغيرت هذه الوظيفة من إرجاع مجموعة متفرق من قيم الخلايا إلى إرجاع كائن صف. يتيح ذلك الوصول إلى خصائص الصف وسيسهل إدارة أنماط الصف وما إلى ذلك.
لا تزال المجموعة المتفرقة من قيم الخلايا متوفرة عبر ورقة العمل.
cell.styles أعيدت تسميتها إلى cell.style
تم تحويل الوعود التي تم إرجاعها من وظائف من Bluebird إلى وعد العقدة الأصلية التي يمكن أن تكسر رمز الاتصال إذا كانت تعتمد على ميزات Bluebird الإضافية.
للتخفيف من هذا ، تمت إضافة تغييرتين التاليتين إلى 0.3.0:
يدعم Exceljs الآن حقن التبعية لمكتبة الوعد. يمكنك استعادة وعود Bluebird من خلال تضمين الكود التالي في الوحدة النمطية الخاصة بك ...
ExcelJS . config . setValue ( 'promise' , require ( 'bluebird' ) ) ;
يرجى ملاحظة: لقد اختبرت exceljs مع Bluebird على وجه التحديد (منذ ما يصل حتى وقت قريب كانت هذه المكتبة التي استخدمتها). من الاختبارات التي قمت بها ، لن تعمل مع Q.
قبل نشر هذه الوحدة ، يتم نقل التعليمات البرمجية المصدر ومعالجتها بطريقة أخرى قبل وضعها في مجلد DIST/ Folder. يحدد هذا ReadMe ملفين - حزمة متصفح ونسخة مصغرة. لا يتم ضمان أي محتويات أخرى من DIST/ المجلد بأي طريقة أخرى غير الملف المحدد على أنه "رئيسي" في الحزمة. json
يتضمن جناح الاختبار المدرج في هذا LIB نصًا صغيرًا تم تنفيذه في متصفح مقطوع الرأس للتحقق من صحة الحزم المجمعة. في وقت كتابة هذا التقرير ، يبدو أن هذا الاختبار لا يلعب بشكل جيد في نظام Windows Linux الفرعي.
لهذا السبب ، يمكن تعطيل اختبار المتصفح من خلال وجود ملف يسمى.
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 |
|