FastExcelReader adalah bagian dari Proyek FastExcelPhp yang terdiri dari
Pustaka ini didesain ringan, super cepat, dan memerlukan penggunaan memori minimal.
FastExcelReader dapat membaca spreadsheet yang kompatibel dengan Excel dalam format XLSX (Office 2007+). Ia hanya membaca data, namun melakukannya dengan sangat cepat dan dengan penggunaan memori minimal.
Fitur
Gunakan composer
untuk menginstal FastExcelReader ke dalam proyek Anda:
composer require avadim/fast-excel-reader
Langsung ke:
Anda dapat menemukan lebih banyak contoh di folder /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 ();
Anda akan mendapatkan susunan ini:
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 ();
Anda akan mendapatkan susunan ini:
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 ();
Anda akan mendapatkan susunan ini:
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' => ...]
// ...
}
Cara alternatif untuk membaca baris demi baris
// 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 );
Anda akan mendapatkan hasil ini:
Array
(
[2] => Array
(
['col1'] => 111
['col2'] => 'aaa'
)
[3] => Array
(
['col1'] => 222
['col2'] => 'bbb'
)
)
Argumen opsional kedua menentukan kunci array hasil
// Rows and cols start from zero
$ result = $ excel -> readRows ( false , Excel:: KEYS_ZERO_BASED );
Anda akan mendapatkan hasil ini:
Array
(
[0] => Array
(
[0] => 'col1'
[1] => 'col2'
)
[1] => Array
(
[0] => 111
[1] => 'aaa'
)
[2] => Array
(
[0] => 222
[1] => 'bbb'
)
)
Nilai mode hasil yang diperbolehkan
pilihan modus | deskripsi |
---|---|
KUNCI_ASLI | baris dari '1', kolom dari 'A' (default) |
KEYS_ROW_ZERO_BASED | baris dari 0 |
KUNCI_COL_ZERO_BASED | kolom dari 0 |
KUNCI_ZERO_BASED | baris dari 0, kolom dari 0 (sama seperti KEYS_ROW_ZERO_BASED + KEYS_COL_ZERO_BASED) |
KUNCI_ROW_ONE_BASED | baris dari 1 |
KUNCI_COL_ONE_BASED | kolom dari 1 |
KUNCI_ONE_BASED | baris dari 1, kolom dari 1 (sama seperti KEYS_ROW_ONE_BASED + KEYS_COL_ONE_BASED) |
Opsi tambahan yang dapat digabungkan dengan mode hasil
pilihan | deskripsi |
---|---|
KUNCI_FIRST_ROW | sama dengan benar pada argumen pertama |
KUNCI_RELATIVE | indeks dari sel kiri atas area (bukan lembar) |
KUNCI_TUKAR | menukar baris dan kolom |
Misalnya
$ result = $ excel -> readRows ([ ' A ' => ' bee ' , ' B ' => ' honey ' ], Excel:: KEYS_FIRST_ROW | Excel:: KEYS_ROW_ZERO_BASED );
Anda akan mendapatkan hasil ini:
Array
(
[0] => Array
(
[bee] => 111
[honey] => 'aaa'
)
[1] => Array
(
[bee] => 222
[honey] => 'bbb'
)
)
Perpustakaan sudah melewatkan sel kosong dan baris kosong secara default. Sel kosong adalah sel yang tidak ada tulisannya, dan baris kosong adalah baris yang semua selnya kosong. Jika sel berisi string kosong, maka sel tersebut tidak dianggap kosong. Namun Anda dapat mengubah perilaku ini dan melewati sel dengan string kosong.
$ 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
}
Cara lain
$ 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 );
Anda dapat mengatur area baca dengan nama yang ditentukan di buku kerja. Misalnya jika buku kerja telah menentukan nama Header dengan rentang Demo1!$B$4:$D$4 maka Anda dapat membaca sel dengan nama ini
$ excel -> setReadArea ( ' Values ' );
$ cells = $ excel -> readCells ();
Perhatikan bahwa karena nilainya berisi nama sheet, sheet ini menjadi sheet default.
Anda dapat mengatur area baca di lembar
$ sheet = $ excel -> getSheet ( ' Demo1 ' )-> setReadArea ( ' Headers ' );
$ cells = $ sheet -> readCells ();
Namun jika Anda mencoba menggunakan nama ini di lembar lain, Anda akan mendapatkan kesalahan
$ sheet = $ excel -> getSheet ( ' Demo2 ' )-> setReadArea ( ' Headers ' );
// Exception: Wrong address or range "Values"
Jika perlu, Anda dapat sepenuhnya mengontrol proses membaca menggunakan metode readSheetCallback()
dengan fungsi panggilan balik
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 );
Secara default, semua nilai tanggal dan waktu dikembalikan sebagai stempel waktu. Namun Anda dapat mengubah perilaku ini menggunakan 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 ;
});
Terkadang, jika format sel ditentukan sebagai tanggal tetapi tidak berisi tanggal, perpustakaan mungkin salah menafsirkan nilai ini. Untuk menghindari hal ini, Anda dapat menonaktifkan pemformatan tanggal
Di sini, sel B1 berisi string "3.2" dan sel B2 berisi tanggal 03-02-2024, tetapi kedua sel disetel ke format tanggal
$ 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 );
Perpustakaan mencoba menentukan tipe nilai sel, dan dalam banyak kasus ia melakukannya dengan benar. Oleh karena itu, Anda mendapatkan nilai numerik atau string. Nilai tanggal dikembalikan sebagai stempel waktu secara default. Namun Anda dapat mengubah perilaku ini dengan mengatur format tanggal (lihat opsi pemformatan untuk fungsi date() php).
$ excel = Excel:: open ( $ file );
$ result = $ excel -> readCells ();
print_r ( $ result );
Contoh di atas akan menampilkan:
Array
(
[B2] => -2205187200
[B3] => 6614697600
[B4] => -6845212800
)
$ excel = Excel:: open ( $ file );
$ excel -> setDateFormat ( ' Y-m-d ' );
$ result = $ excel -> readCells ();
print_r ( $ result );
Contoh di atas akan menampilkan:
Array
(
[B2] => '1900-02-14'
[B3] => '2179-08-12'
[B4] => '1753-01-31'
)
Biasanya fungsi baca hanya mengembalikan nilai sel, namun Anda bisa membaca nilai dengan gaya. Dalam hal ini, untuk setiap sel, bukan nilai skalar yang akan dikembalikan, tetapi array seperti ['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 ();
Atau Anda dapat membaca gaya saja (tanpa nilai)
$ 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,
)
*/
Namun kami tidak menyarankan penggunaan metode ini dengan file berukuran besar
Setiap lembar dalam file XLSX Anda dapat berisi serangkaian aturan validasi data. Untuk mengambilnya, Anda dapat memanggil getDataValidations
di lembar Anda
$ 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',
],
]
*/
Ambil lebar kolom tertentu dalam sebuah lembar:
$ 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
Ambil tinggi baris tertentu dalam satu lembar:
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the height of row 1
$ rowHeight = $ sheet -> getRowHeight ( 1 );
echo $ rowHeight ; // Example: 15
Mengambil info panel beku untuk sebuah sheet:
$ 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'
)
*/
Mengambil info warna tab untuk sebuah sheet:
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'
)
*/
Anda dapat menggunakan metode berikut:
Sheet::getMergedCells()
-- Mengembalikan semua rentang yang digabungkanSheet::isMerged(string $cellAddress)
-- Memeriksa apakah sel digabungkanSheet::mergedRange(string $cellAddress)
-- Mengembalikan rentang gabungan sel tertentuMisalnya
if ( $ sheet -> isMerged ( ' B3 ' )) {
$ range = $ sheet -> mergedRange ( ' B3 ' );
}
getSheetNames()
-- Mengembalikan array nama semua sheetsheet(?string $name = null)
-- Mengembalikan sheet default atau yang ditentukangetSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Dapatkan sheet berdasarkan namagetSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Dapatkan sheet berdasarkan idgetFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
-- Dapatkan lembar pertamaselectSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Pilih sheet default berdasarkan nama dan kembalikanselectSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Pilih sheet default berdasarkan id dan kembalikanselectFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
-- Pilih sheet pertama sebagai default dan kembalikangetDefinedNames()
-- Mengembalikan nama buku kerja yang ditentukanname()
-- Mengembalikan nama stringisActive()
-- Lembar kerja aktifisHidden()
-- Jika lembar kerja disembunyikanisVisible()
-- Jika lembar kerja terlihatstate()
-- Mengembalikan status string lembar kerja (digunakan dalam isHidden()
dan isVisible()
)dimension()
-- Mengembalikan dimensi area kerja default dari properti lembarcountRows()
-- Menghitung baris dari dimensicountColumns()
-- Menghitung kolom dari dimensifirstRow()
-- Nomor baris pertamafirstCol()
-- Huruf kolom pertamareadFirstRow()
-- Mengembalikan nilai sel baris pertama sebagai arrayreadFirstRowWithStyles()
-- Mengembalikan nilai dan gaya sel baris pertama sebagai arraygetColumnWidth(int)
-- Mengembalikan lebar nomor kolom tertentugetFreezePaneConfig()
-- Mengembalikan array yang berisi konfigurasi panel bekugetTabColorConfiguration()
-- Mengembalikan array yang berisi konfigurasi warna tab jika menurut Anda paket ini berguna, Anda dapat memberi saya bintang di GitHub.
Atau Anda dapat menyumbangkan saya :)