FastExcelReader fait partie du projet FastExcelPhp qui comprend
Cette bibliothèque est conçue pour être légère, ultra-rapide et nécessite une utilisation minimale de la mémoire.
FastExcelReader peut lire des feuilles de calcul compatibles Excel au format XLSX (Office 2007+). Il lit uniquement les données, mais il le fait très rapidement et avec une utilisation minimale de la mémoire.
Caractéristiques
Utilisez composer
pour installer FastExcelReader dans votre projet :
composer require avadim/fast-excel-reader
Aller à :
Vous pouvez trouver plus d'exemples dans le dossier /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 ();
Vous obtiendrez ce tableau :
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 ();
Vous obtiendrez ce tableau :
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 ();
Vous obtiendrez ce tableau :
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' => ...]
// ...
}
Autre façon de lire ligne par ligne
// 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 );
Vous obtiendrez ce résultat :
Array
(
[2] => Array
(
['col1'] => 111
['col2'] => 'aaa'
)
[3] => Array
(
['col1'] => 222
['col2'] => 'bbb'
)
)
Le deuxième argument facultatif spécifie les clés du tableau de résultats
// Rows and cols start from zero
$ result = $ excel -> readRows ( false , Excel:: KEYS_ZERO_BASED );
Vous obtiendrez ce résultat :
Array
(
[0] => Array
(
[0] => 'col1'
[1] => 'col2'
)
[1] => Array
(
[0] => 111
[1] => 'aaa'
)
[2] => Array
(
[0] => 222
[1] => 'bbb'
)
)
Valeurs autorisées du mode résultat
options de mode | description |
---|---|
CLÉS_ORIGINAL | lignes de « 1 », colonnes de « A » (par défaut) |
KEYS_ROW_ZERO_BASED | lignes à partir de 0 |
KEYS_COL_ZERO_BASED | colonnes de 0 |
KEYS_ZERO_BASED | lignes à partir de 0, colonnes à partir de 0 (identique à KEYS_ROW_ZERO_BASED + KEYS_COL_ZERO_BASED) |
KEYS_ROW_ONE_BASED | lignes à partir de 1 |
KEYS_COL_ONE_BASED | colonnes de 1 |
KEYS_ONE_BASED | lignes à partir de 1, colonnes à partir de 1 (identique à KEYS_ROW_ONE_BASED + KEYS_COL_ONE_BASED) |
Options supplémentaires pouvant être combinées avec les modes de résultat
choix | description |
---|---|
KEYS_FIRST_ROW | la même chose que vrai dans le premier argument |
KEYS_RELATIVE | index de la cellule supérieure gauche de la zone (pas de la feuille) |
KEYS_SWAP | échanger des lignes et des colonnes |
Par exemple
$ result = $ excel -> readRows ([ ' A ' => ' bee ' , ' B ' => ' honey ' ], Excel:: KEYS_FIRST_ROW | Excel:: KEYS_ROW_ZERO_BASED );
Vous obtiendrez ce résultat :
Array
(
[0] => Array
(
[bee] => 111
[honey] => 'aaa'
)
[1] => Array
(
[bee] => 222
[honey] => 'bbb'
)
)
La bibliothèque ignore déjà les cellules vides et les lignes vides par défaut. Les cellules vides sont des cellules dans lesquelles rien n'est écrit et les lignes vides sont des lignes dans lesquelles toutes les cellules sont vides. Si une cellule contient une chaîne vide, elle n'est pas considérée comme vide. Mais vous pouvez modifier ce comportement et ignorer les cellules contenant des chaînes vides.
$ 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
}
Autre manière
$ 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 );
Vous pouvez définir la zone de lecture par des noms définis dans le classeur. Par exemple, si le classeur a défini le nom Headers avec la plage Demo1!$B$4:$D$4 , vous pouvez lire les cellules portant ce nom.
$ excel -> setReadArea ( ' Values ' );
$ cells = $ excel -> readCells ();
Notez que puisque la valeur contient le nom de la feuille, cette feuille devient la feuille par défaut.
Vous pouvez définir la zone de lecture dans la feuille
$ sheet = $ excel -> getSheet ( ' Demo1 ' )-> setReadArea ( ' Headers ' );
$ cells = $ sheet -> readCells ();
Mais si vous essayez d'utiliser ce nom sur une autre feuille, vous obtiendrez une erreur
$ sheet = $ excel -> getSheet ( ' Demo2 ' )-> setReadArea ( ' Headers ' );
// Exception: Wrong address or range "Values"
Si nécessaire, vous pouvez contrôler entièrement le processus de lecture en utilisant la méthode readSheetCallback()
avec la fonction de rappel
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 );
Par défaut, toutes les valeurs datetime sont renvoyées sous forme d'horodatage. Mais vous pouvez modifier ce comportement en utilisant 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 ;
});
Parfois, si le format d'une cellule est spécifié comme date mais ne contient pas de date, la bibliothèque peut mal interpréter cette valeur. Pour éviter cela, vous pouvez désactiver le formatage de la date
Ici, la cellule B1 contient la chaîne "3.2" et la cellule B2 contient la date 2024-02-03, mais les deux cellules sont définies au format de date.
$ 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 );
La bibliothèque essaie de déterminer les types de valeurs de cellule et, dans la plupart des cas, elle le fait correctement. Par conséquent, vous obtenez des valeurs numériques ou de chaîne. Les valeurs de date sont renvoyées sous forme d'horodatage par défaut. Mais vous pouvez modifier ce comportement en définissant le format de date (voir les options de formatage de la fonction php date()).
$ excel = Excel:: open ( $ file );
$ result = $ excel -> readCells ();
print_r ( $ result );
L'exemple ci-dessus affichera :
Array
(
[B2] => -2205187200
[B3] => 6614697600
[B4] => -6845212800
)
$ excel = Excel:: open ( $ file );
$ excel -> setDateFormat ( ' Y-m-d ' );
$ result = $ excel -> readCells ();
print_r ( $ result );
L'exemple ci-dessus affichera :
Array
(
[B2] => '1900-02-14'
[B3] => '2179-08-12'
[B4] => '1753-01-31'
)
Habituellement, les fonctions de lecture renvoient uniquement les valeurs de cellule, mais vous pouvez lire les valeurs avec des styles. Dans ce cas, pour chaque cellule, ce n'est pas une valeur scalaire qui sera renvoyée, mais un tableau comme ['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 ();
Ou vous pouvez lire uniquement les styles (sans valeurs)
$ 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,
)
*/
Mais nous vous déconseillons d'utiliser ces méthodes avec des fichiers volumineux
Chaque feuille de votre fichier XLSX peut contenir un ensemble de règles de validation des données. Pour les récupérer, vous pouvez implicitement appeler getDataValidations
sur votre feuille
$ 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',
],
]
*/
Récupérer la largeur d'une colonne spécifique dans une feuille :
$ 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
Récupérer la hauteur d'une ligne spécifique dans une feuille :
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the height of row 1
$ rowHeight = $ sheet -> getRowHeight ( 1 );
echo $ rowHeight ; // Example: 15
Récupérez les informations du volet figé pour une feuille :
$ 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'
)
*/
Récupérez les informations sur la couleur des onglets d'une feuille :
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'
)
*/
Vous pouvez utiliser les méthodes suivantes :
Sheet::getMergedCells()
-- Renvoie toutes les plages fusionnéesSheet::isMerged(string $cellAddress)
-- Vérifie si une cellule est fusionnéeSheet::mergedRange(string $cellAddress)
-- Renvoie la plage de fusion de la cellule spécifiéePar exemple
if ( $ sheet -> isMerged ( ' B3 ' )) {
$ range = $ sheet -> mergedRange ( ' B3 ' );
}
getSheetNames()
-- Renvoie le tableau des noms de toutes les feuillessheet(?string $name = null)
-- Renvoie la feuille par défaut ou spécifiéegetSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Récupère la feuille par son nomgetSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Récupère la feuille par identifiantgetFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
-- Récupère la première feuilleselectSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Sélectionne la feuille par défaut par son nom et la renvoieselectSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
-- Sélectionne la feuille par défaut par identifiant et la renvoieselectFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
-- Sélectionne la première feuille par défaut et la renvoiegetDefinedNames()
-- Renvoie les noms définis du classeurname()
-- Renvoie le nom de la chaîneisActive()
-- Feuille de calcul activeisHidden()
-- Si la feuille de calcul est masquéeisVisible()
-- Si la feuille de calcul est visiblestate()
-- Renvoie l'état de la chaîne de la feuille de calcul (utilisé dans isHidden()
et isVisible()
)dimension()
-- Renvoie la dimension de la zone de travail par défaut à partir des propriétés de la feuillecountRows()
-- Compte les lignes à partir de la dimensioncountColumns()
-- Compter les colonnes à partir de la dimensionfirstRow()
-- Le numéro de la première lignefirstCol()
-- La lettre de la première colonnereadFirstRow()
-- Renvoie les valeurs des cellules de la 1ère ligne sous forme de tableaureadFirstRowWithStyles()
-- Renvoie les valeurs et les styles des cellules de la 1ère ligne sous forme de tableaugetColumnWidth(int)
-- Renvoie la largeur d'un numéro de colonne donnégetFreezePaneConfig()
-- Renvoie un tableau contenant la configuration du volet figégetTabColorConfiguration()
-- Renvoie un tableau contenant la configuration des couleurs des onglets si vous trouvez ce package utile, vous pouvez me donner une étoile sur GitHub.
Ou vous pouvez me faire un don :)