FastExcelReader เป็นส่วนหนึ่งของโครงการ FastExcelPhp ซึ่งประกอบด้วย
ไลบรารีนี้ได้รับการออกแบบมาให้มีน้ำหนักเบา รวดเร็วเป็นพิเศษ และต้องใช้หน่วยความจำน้อยที่สุด
FastExcelReader สามารถอ่านสเปรดชีตที่เข้ากันได้กับ Excel ในรูปแบบ XLSX (Office 2007+) มันอ่านเพียงข้อมูล แต่ทำได้อย่างรวดเร็วและใช้หน่วยความจำน้อยที่สุด
คุณสมบัติ
ใช้ composer
เพื่อติดตั้ง FastExcelReader ในโครงการของคุณ:
composer require avadim/fast-excel-reader
ข้ามไปที่:
คุณสามารถค้นหาตัวอย่างเพิ่มเติมได้ในโฟลเดอร์ /demo
use avadim FastExcelReader Excel ;
$ file = __DIR__ . ' /files/demo-00-simple.xlsx ' ;
// Open XLSX-file
$ excel = Excel:: open ( $ file );
// Read all values as a flat array from current sheet
$ result = $ excel -> readCells ();
คุณจะได้รับอาร์เรย์นี้:
Array
(
[A1] => 'col1'
[B1] => 'col2'
[A2] => 111
[B2] => 'aaa'
[A3] => 222
[B3] => 'bbb'
)
// Read all rows in two-dimensional array (ROW x COL)
$ result = $ excel -> readRows ();
คุณจะได้รับอาร์เรย์นี้:
Array
(
[1] => Array
(
['A'] => 'col1'
['B'] => 'col2'
)
[2] => Array
(
['A'] => 111
['B'] => 'aaa'
)
[3] => Array
(
['A'] => 222
['B'] => 'bbb'
)
)
// Read all columns in two-dimensional array (COL x ROW)
$ result = $ excel -> readColumns ();
คุณจะได้รับอาร์เรย์นี้:
Array
(
[A] => Array
(
[1] => 'col1'
[2] => 111
[3] => 222
)
[B] => Array
(
[1] => 'col2'
[2] => 'aaa'
[3] => 'bbb'
)
)
$ sheet = $ excel -> sheet ();
foreach ( $ sheet -> nextRow () as $ rowNum => $ rowData ) {
// $rowData is array ['A' => ..., 'B' => ...]
$ addr = ' C ' . $ rowNum ;
if ( $ sheet -> hasImage ( $ addr )) {
$ sheet -> saveImageTo ( $ addr , $ fullDirectoryPath );
}
// handling of $rowData here
// ...
}
// OR
foreach ( $ sheet -> nextRow () as $ rowNum => $ rowData ) {
// handling of $rowData here
// ...
// get image list from current row
$ imageList = $ sheet -> getImageListByRow ();
foreach ( $ imageList as $ imageInfo ) {
$ imageBlob = $ sheet -> getImageBlob ( $ imageInfo [ ' address ' ]);
}
}
// OR
foreach ( $ sheet -> nextRow ([ ' A ' => ' One ' , ' B ' => ' Two ' ], Excel:: KEYS_FIRST_ROW ) as $ rowNum => $ rowData ) {
// $rowData is array ['One' => ..., 'Two' => ...]
// ...
}
ทางเลือกอื่นในการอ่านทีละแถว
// Init internal read generator
$ sheet -> reset ([ ' A ' => ' One ' , ' B ' => ' Two ' ], Excel:: KEYS_FIRST_ROW );
// read the first row
$ rowData = $ sheet -> readNextRow ();
var_dump ( $ rowData );
// read the next 3 rows
for ( $ i = 0 ; $ i < 3 ; $ i ++) {
$ rowData = $ sheet -> readNextRow ();
var_dump ( $ rowData );
}
// Reset internal generator and read all rows
$ sheet -> reset ([ ' A ' => ' One ' , ' B ' => ' Two ' ], Excel:: KEYS_FIRST_ROW );
$ result = [];
while ( $ rowData = $ sheet -> readNextRow ()) {
$ result [] = $ rowData ;
}
var_dump ( $ result );
// Read rows and use the first row as column keys
$ result = $ excel -> readRows ( true );
คุณจะได้รับผลลัพธ์นี้:
Array
(
[2] => Array
(
['col1'] => 111
['col2'] => 'aaa'
)
[3] => Array
(
['col1'] => 222
['col2'] => 'bbb'
)
)
อาร์กิวเมนต์ที่สองที่เป็นทางเลือกระบุคีย์อาร์เรย์ผลลัพธ์
// Rows and cols start from zero
$ result = $ excel -> readRows ( false , Excel:: KEYS_ZERO_BASED );
คุณจะได้รับผลลัพธ์นี้:
Array
(
[0] => Array
(
[0] => 'col1'
[1] => 'col2'
)
[1] => Array
(
[0] => 111
[1] => 'aaa'
)
[2] => Array
(
[0] => 222
[1] => 'bbb'
)
)
ค่าที่อนุญาตของโหมดผลลัพธ์
ตัวเลือกโหมด | คำอธิบาย |
---|---|
คีย์_ต้นฉบับ | แถวจาก '1', คอลัมน์จาก 'A' (ค่าเริ่มต้น) |
KEYS_ROW_ZERO_BASED | แถวตั้งแต่ 0 |
KEYS_COL_ZERO_BASED | คอลัมน์จาก 0 |
KEYS_ZERO_BASED | แถวจาก 0, คอลัมน์จาก 0 (เหมือนกับ KEYS_ROW_ZERO_BASED + KEYS_COL_ZERO_BASED) |
KEYS_ROW_ONE_BASED | แถวจาก 1 |
KEYS_COL_ONE_BASED | คอลัมน์จาก 1 |
KEYS_ONE_BASED | แถวจาก 1 คอลัมน์จาก 1 (เหมือนกับ KEYS_ROW_ONE_BASED + KEYS_COL_ONE_BASED) |
ตัวเลือกเพิ่มเติมที่สามารถใช้ร่วมกับโหมดผลลัพธ์ได้
ตัวเลือก | คำอธิบาย |
---|---|
KEYS_FIRST_ROW | เช่นเดียวกับ ความจริง ในการโต้แย้งแรก |
KEYS_RELATIVE | ดัชนีจากเซลล์ด้านซ้ายบนของพื้นที่ (ไม่ใช่แผ่นงาน) |
KEYS_SWAP | สลับแถวและคอลัมน์ |
ตัวอย่างเช่น
$ result = $ excel -> readRows ([ ' A ' => ' bee ' , ' B ' => ' honey ' ], Excel:: KEYS_FIRST_ROW | Excel:: KEYS_ROW_ZERO_BASED );
คุณจะได้รับผลลัพธ์นี้:
Array
(
[0] => Array
(
[bee] => 111
[honey] => 'aaa'
)
[1] => Array
(
[bee] => 222
[honey] => 'bbb'
)
)
ไลบรารีจะข้ามเซลล์ว่างและแถวว่างตามค่าเริ่มต้นแล้ว เซลล์ว่างคือเซลล์ที่ไม่มีการเขียนใดๆ และแถวว่างคือแถวที่เซลล์ทั้งหมดว่างเปล่า หากเซลล์มีสตริงว่าง จะไม่ถือว่าว่างเปล่า แต่คุณสามารถเปลี่ยนลักษณะการทำงานนี้และข้ามเซลล์ที่มีสตริงว่างได้
$ sheet = $ excel -> sheet ();
// Skip empty cells and empty rows
foreach ( $ sheet -> nextRow () as $ rowNum => $ rowData ) {
// handle $rowData
}
// Skip empty cells and cells with empty strings
foreach ( $ sheet -> nextRow ([], Excel:: TREAT_EMPTY_STRING_AS_EMPTY_CELL ) as $ rowNum => $ rowData ) {
// handle $rowData
}
// Skip empty cells and empty rows (rows containing only whitespace characters are also considered empty)
foreach ( $ sheet -> nextRow ([], Excel:: TRIM_STRINGS | Excel:: TREAT_EMPTY_STRING_AS_EMPTY_CELL ) as $ rowNum => $ rowData ) {
// handle $rowData
}
วิธีอื่น
$ sheet -> reset ([], Excel:: TRIM_STRINGS | Excel:: TREAT_EMPTY_STRING_AS_EMPTY_CELL );
$ rowData = $ sheet -> readNextRow ();
// do something
$ rowData = $ sheet -> readNextRow ();
// handle next row
// ...
use avadim FastExcelReader Excel ;
$ file = __DIR__ . ' /files/demo-02-advanced.xlsx ' ;
$ excel = Excel:: open ( $ file );
$ result = [
' sheets ' => $ excel -> getSheetNames () // get all sheet names
];
$ result [ ' #1 ' ] = $ excel
// select sheet by name
-> selectSheet ( ' Demo1 ' )
// select area with data where the first row contains column keys
-> setReadArea ( ' B4:D11 ' , true )
// set date format
-> setDateFormat ( ' Y-m-d ' )
// set key for column 'C' to 'Birthday'
-> readRows ([ ' C ' => ' Birthday ' ]);
// read other arrays with custom column keys
// and in this case we define range by columns only
$ columnKeys = [ ' B ' => ' year ' , ' C ' => ' value1 ' , ' D ' => ' value2 ' ];
$ result [ ' #2 ' ] = $ excel
-> selectSheet ( ' Demo2 ' , ' B:D ' )
-> readRows ( $ columnKeys );
$ result [ ' #3 ' ] = $ excel
-> setReadArea ( ' F5:H13 ' )
-> readRows ( $ columnKeys );
คุณสามารถตั้งค่าพื้นที่อ่านตามชื่อที่กำหนดในสมุดงาน ตัวอย่างเช่น ถ้าสมุดงานได้กำหนดชื่อ ส่วนหัว ด้วยช่วง Demo1!$B$4:$D$4 คุณสามารถอ่านเซลล์ตามชื่อนี้ได้
$ excel -> setReadArea ( ' Values ' );
$ cells = $ excel -> readCells ();
โปรดทราบว่าเนื่องจากค่ามีชื่อแผ่นงาน แผ่นงานนี้จึงกลายเป็นแผ่นงานเริ่มต้น
คุณสามารถตั้งค่าพื้นที่การอ่านในแผ่นงานได้
$ sheet = $ excel -> getSheet ( ' Demo1 ' )-> setReadArea ( ' Headers ' );
$ cells = $ sheet -> readCells ();
แต่ถ้าคุณพยายามใช้ชื่อนี้บนแผ่นงานอื่น คุณจะได้รับข้อผิดพลาด
$ sheet = $ excel -> getSheet ( ' Demo2 ' )-> setReadArea ( ' Headers ' );
// Exception: Wrong address or range "Values"
หากจำเป็น คุณสามารถควบคุมกระบวนการอ่านได้อย่างสมบูรณ์โดยใช้เมธอด readSheetCallback()
พร้อมฟังก์ชัน callback
use avadim FastExcelReader Excel ;
$ excel = Excel:: open ( $ file );
$ result = [];
$ excel -> readCallback ( function ( $ row , $ col , $ val ) use (& $ result ) {
// Any manipulation here
$ result [ $ row ][ $ col ] = ( string ) $ val ;
// if the function returns true then data reading is interrupted
return false ;
});
var_dump ( $ result );
ตามค่าเริ่มต้น ค่าวันที่เวลาทั้งหมดจะส่งกลับเป็นการประทับเวลา แต่คุณสามารถเปลี่ยนพฤติกรรมนี้ได้โดยใช้ dateFormatter()
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> sheet ()-> setReadArea ( ' B5:D7 ' );
$ cells = $ sheet -> readCells ();
echo $ cells [ ' C5 ' ]; // -2205187200
// If argument TRUE is passed, then all dates will be formatted as specified in cell styles
// IMPORTANT! The datetime format depends on the locale
$ excel -> dateFormatter ( true );
$ cells = $ sheet -> readCells ();
echo $ cells [ ' C5 ' ]; // '14.02.1900'
// You can specify date format pattern
$ excel -> dateFormatter ( ' Y-m-d ' );
$ cells = $ sheet -> readCells ();
echo $ cells [ ' C5 ' ]; // '1900-02-14'
// set date formatter function
$ excel -> dateFormatter ( fn ( $ value ) => gmdate ( ' m/d/Y ' , $ value ));
$ cells = $ sheet -> readCells ();
echo $ cells [ ' C5 ' ]; // '02/14/1900'
// returns DateTime instance
$ excel -> dateFormatter ( fn ( $ value ) => ( new DateTime ())-> setTimestamp ( $ value ));
$ cells = $ sheet -> readCells ();
echo get_class ( $ cells [ ' C5 ' ]); // 'DateTime'
// custom manipulations with datetime values
$ excel -> dateFormatter ( function ( $ value , $ format , $ styleIdx ) use ( $ excel ) {
// get Excel format of the cell, e.g. '[$-F400]h:mm:ss AM/PM'
$ excelFormat = $ excel -> getFormatPattern ( $ styleIdx );
// get format converted for use in php functions date(), gmdate(), etc
// for example the Excel pattern above would be converted to 'g:i:s A'
$ phpFormat = $ excel -> getDateFormatPattern ( $ styleIdx );
// and if you need you can get value of numFmtId for this cell
$ style = $ excel -> getCompleteStyleByIdx ( $ styleIdx , true );
$ numFmtId = $ style [ ' format-num-id ' ];
// do something and write to $result
$ result = gmdate ( $ phpFormat , $ value );
return $ result ;
});
บางครั้ง หากรูปแบบของเซลล์ระบุเป็นวันที่ แต่ไม่มีวันที่ ไลบรารีอาจตีความค่านี้ผิด เพื่อหลีกเลี่ยงปัญหานี้ คุณสามารถปิดใช้งานการจัดรูปแบบวันที่ได้
ในที่นี้ เซลล์ B1 มีสตริง "3.2" และเซลล์ B2 มีวันที่ 2024-02-03 แต่ทั้งสองเซลล์ได้รับการตั้งค่าเป็นรูปแบบวันที่
$ excel = Excel:: open ( $ file );
// default mode
$ cells = $ sheet -> readCells ();
echo $ cell [ ' B1 ' ]; // -2208798720 - the library tries to interpret the number 3.2 as a timestamp
echo $ cell [ ' B2 ' ]; // 1706918400 - timestamp of 2024-02-03
// date formatter is on
$ excel -> dateFormatter ( true );
$ cells = $ sheet -> readCells ();
echo $ cell [ ' B1 ' ]; // '03.01.1900'
echo $ cell [ ' B2 ' ]; // '3.2'
// date formatter is off
$ excel -> dateFormatter ( false );
$ cells = $ sheet -> readCells ();
echo $ cell [ ' B1 ' ]; // '3.2'
echo $ cell [ ' B2 ' ]; // 1706918400 - timestamp of 2024-02-03
// Returns count images on all sheets
$ excel -> countImages ();
// Returns count images on sheet
$ sheet -> countImages ();
// Returns image list of sheet
$ sheet -> getImageList ();
// Returns image list of specified row
$ sheet -> getImageListByRow ( $ rowNumber );
// Returns TRUE if the specified cell has an image
$ sheet -> hasImage ( $ cellAddress );
// Returns mime type of image in the specified cell (or NULL)
$ sheet -> getImageMimeType ( $ cellAddress );
// Returns inner name of image in the specified cell (or NULL)
$ sheet -> getImageName ( $ cellAddress );
// Returns an image from the cell as a blob (if exists) or NULL
$ sheet -> getImageBlob ( $ cellAddress );
// Writes an image from the cell to the specified filename
$ sheet -> saveImage ( $ cellAddress , $ fullFilenamePath );
// Writes an image from the cell to the specified directory
$ sheet -> saveImageTo ( $ cellAddress , $ fullDirectoryPath );
ไลบรารีพยายามระบุชนิดของค่าของเซลล์ และในกรณีส่วนใหญ่ ไลบรารีจะทำได้อย่างถูกต้อง ดังนั้น คุณจะได้รับค่าตัวเลขหรือสตริง ค่าวันที่จะถูกส่งกลับเป็นการประทับเวลาตามค่าเริ่มต้น แต่คุณสามารถเปลี่ยนพฤติกรรมนี้ได้โดยตั้งค่ารูปแบบวันที่ (ดูตัวเลือกการจัดรูปแบบสำหรับฟังก์ชัน date() php)
$ excel = Excel:: open ( $ file );
$ result = $ excel -> readCells ();
print_r ( $ result );
ตัวอย่างข้างต้นจะแสดงผล:
Array
(
[B2] => -2205187200
[B3] => 6614697600
[B4] => -6845212800
)
$ excel = Excel:: open ( $ file );
$ excel -> setDateFormat ( ' Y-m-d ' );
$ result = $ excel -> readCells ();
print_r ( $ result );
ตัวอย่างข้างต้นจะแสดงผล:
Array
(
[B2] => '1900-02-14'
[B3] => '2179-08-12'
[B4] => '1753-01-31'
)
โดยปกติแล้วฟังก์ชันการอ่านจะส่งกลับเฉพาะค่าของเซลล์ แต่คุณสามารถอ่านค่าด้วยสไตล์ได้ ในกรณีนี้ สำหรับแต่ละเซลล์ จะไม่ส่งคืนค่าสเกลาร์ แต่จะส่งคืนอาร์เรย์ เช่น ['v' => scalar_value , 's' => style_array , 'f' => Formula ]
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> sheet ();
$ rows = $ sheet -> readRowsWithStyles ();
$ columns = $ sheet -> readColumnsWithStyles ();
$ cells = $ sheet -> readCellsWithStyles ();
$ cells = $ sheet -> readCellsWithStyles ();
หรือคุณสามารถอ่านสไตล์เท่านั้น (ไม่มีค่า)
$ cells = $ sheet -> readCellStyles ();
/*
array (
'format' =>
array (
'format-num-id' => 0,
'format-pattern' => 'General',
),
'font' =>
array (
'font-size' => '10',
'font-name' => 'Arial',
'font-family' => '2',
'font-charset' => '1',
),
'fill' =>
array (
'fill-pattern' => 'solid',
'fill-color' => '#9FC63C',
),
'border' =>
array (
'border-left-style' => NULL,
'border-right-style' => NULL,
'border-top-style' => NULL,
'border-bottom-style' => NULL,
'border-diagonal-style' => NULL,
),
)
*/
$ cells = $ sheet -> readCellStyles ( true );
/*
array (
'format-num-id' => 0,
'format-pattern' => 'General',
'font-size' => '10',
'font-name' => 'Arial',
'font-family' => '2',
'font-charset' => '1',
'fill-pattern' => 'solid',
'fill-color' => '#9FC63C',
'border-left-style' => NULL,
'border-right-style' => NULL,
'border-top-style' => NULL,
'border-bottom-style' => NULL,
'border-diagonal-style' => NULL,
)
*/
แต่เราไม่แนะนำให้ใช้วิธีการเหล่านี้กับไฟล์ขนาดใหญ่
ทุกชีตในไฟล์ XLSX สามารถมีชุดกฎการตรวจสอบข้อมูลได้ หากต้องการดึงข้อมูล คุณสามารถเรียก getDataValidations
บนชีตของคุณได้
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> sheet ();
$ validations = $ sheet -> getDataValidations ();
/*
[
[
'type' => 'list',
'sqref' => 'E2:E527',
'formula1' => '"Berlin,Cape Town,Mexico City,Moscow,Sydney,Tokyo"',
'formula2' => null,
], [
'type' => 'decimal',
'sqref' => 'G2:G527',
'formula1' => '0.0',
'formula2' => '999999.0',
],
]
*/
ดึงข้อมูลความกว้างของคอลัมน์เฉพาะในแผ่นงาน:
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the width of column 1 (column 'A')
$ columnWidth = $ sheet -> getColumnWidth ( 1 );
echo $ columnWidth ; // Example: 11.85
ดึงความสูงของแถวที่ระบุในแผ่นงาน:
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the height of row 1
$ rowHeight = $ sheet -> getRowHeight ( 1 );
echo $ rowHeight ; // Example: 15
ดึงข้อมูลบานหน้าต่างตรึงสำหรับแผ่นงาน:
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the freeze pane configuration
$ freezePaneConfig = $ sheet -> getFreezePaneInfo ();
print_r ( $ freezePaneConfig );
/*
Example Output:
Array
(
[xSplit] => 0
[ySplit] => 1
[topLeftCell] => 'A2'
)
*/
ดึงข้อมูลสีแท็บสำหรับแผ่นงาน:
Copy code
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the tab color configuration
$ tabColorConfig = $ sheet -> getTabColorInfo ();
print_r ( $ tabColorConfig );
/*
Example Output:
Array
(
[theme] => '2'
[tint] => '-0.499984740745262'
)
*/
คุณสามารถใช้วิธีการต่อไปนี้:
Sheet::getMergedCells()
-- ส่งคืนช่วงที่ผสานทั้งหมดSheet::isMerged(string $cellAddress)
-- ตรวจสอบว่าเซลล์ถูกผสานหรือไม่Sheet::mergedRange(string $cellAddress)
-- ส่งคืนช่วงการผสานของเซลล์ที่ระบุตัวอย่างเช่น
if ( $ sheet -> isMerged ( ' B3 ' )) {
$ range = $ sheet -> mergedRange ( ' B3 ' );
}
getSheetNames()
-- ส่งคืนอาร์เรย์ชื่อของชีตทั้งหมดsheet(?string $name = null)
-- ส่งคืนชีตเริ่มต้นหรือชีตที่ระบุgetSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- รับชีตตามชื่อgetSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- รับชีตตาม idgetFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
-- รับชีตแรกselectSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- เลือกแผ่นงานเริ่มต้นตามชื่อและส่งกลับselectSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- เลือกแผ่นงานเริ่มต้นตาม id แล้วส่งคืนselectFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
-- เลือกชีตแรกเป็นค่าเริ่มต้นและส่งกลับgetDefinedNames()
-- ส่งคืนชื่อที่กำหนดของสมุดงานname()
-- ส่งกลับชื่อของสตริงisActive()
-- แผ่นงานที่ใช้งานอยู่isHidden()
-- ถ้าแผ่นงานถูกซ่อนอยู่isVisible()
-- หากมองเห็นเวิร์กชีทstate()
-- ส่งคืนสถานะสตริงของเวิร์กชีต (ใช้ใน isHidden()
และ isVisible()
)dimension()
-- ส่งกลับขนาดของพื้นที่ทำงานเริ่มต้นจากคุณสมบัติของแผ่นงานcountRows()
-- นับแถวจากมิติcountColumns()
-- นับคอลัมน์จากมิติfirstRow()
-- หมายเลขแถวแรกfirstCol()
-- ตัวอักษรคอลัมน์แรกreadFirstRow()
-- ส่งกลับค่าของเซลล์ของแถวที่ 1 เป็นอาร์เรย์readFirstRowWithStyles()
-- ส่งกลับค่าและสไตล์ของเซลล์ของแถวที่ 1 เป็นอาร์เรย์getColumnWidth(int)
-- ส่งกลับความกว้างของหมายเลขคอลัมน์ที่กำหนดgetFreezePaneConfig()
-- ส่งคืนอาร์เรย์ที่มีการกำหนดค่าช่องแช่แข็งgetTabColorConfiguration()
-- ส่งคืนอาร์เรย์ที่มีการกำหนดค่าสีของแท็บ หากคุณพบว่าแพ็คเกจนี้มีประโยชน์ คุณสามารถมอบดาวให้ฉันบน GitHub ได้
หรือจะ Donate ก็ได้ครับ :)