FastExcelReader es parte del proyecto FastExcelPhp que consta de
Esta biblioteca está diseñada para ser liviana, súper rápida y requiere un uso mínimo de memoria.
FastExcelReader puede leer hojas de cálculo compatibles con Excel en formato XLSX (Office 2007+). Sólo lee datos, pero lo hace muy rápido y con un uso mínimo de memoria.
Características
Utilice composer
para instalar FastExcelReader en su proyecto:
composer require avadim/fast-excel-reader
Saltar a:
Puede encontrar más ejemplos en la carpeta /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 ();
Obtendrá esta matriz:
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 ();
Obtendrá esta matriz:
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 ();
Obtendrá esta matriz:
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' => ...]
// ...
}
Forma alternativa de leer fila por fila
// 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 );
Obtendrás este resultado:
Array
(
[2] => Array
(
['col1'] => 111
['col2'] => 'aaa'
)
[3] => Array
(
['col1'] => 222
['col2'] => 'bbb'
)
)
El segundo argumento opcional especifica las claves de la matriz de resultados.
// Rows and cols start from zero
$ result = $ excel -> readRows ( false , Excel:: KEYS_ZERO_BASED );
Obtendrás este resultado:
Array
(
[0] => Array
(
[0] => 'col1'
[1] => 'col2'
)
[1] => Array
(
[0] => 111
[1] => 'aaa'
)
[2] => Array
(
[0] => 222
[1] => 'bbb'
)
)
Valores permitidos del modo de resultado
opciones de modo | descripciones |
---|---|
LLAVES_ORIGINAL | filas de '1', columnas de 'A' (predeterminado) |
KEYS_ROW_ZERO_BASED | filas desde 0 |
KEYS_COL_ZERO_BASED | columnas desde 0 |
KEYS_ZERO_BASED | filas desde 0, columnas desde 0 (igual que KEYS_ROW_ZERO_BASED + KEYS_COL_ZERO_BASED) |
KEYS_ROW_ONE_BASED | filas de 1 |
KEYS_COL_ONE_BASED | columnas de 1 |
KEYS_ONE_BASED | filas de 1, columnas de 1 (igual que KEYS_ROW_ONE_BASED + KEYS_COL_ONE_BASED) |
Opciones adicionales que se pueden combinar con modos de resultados.
opciones | descripciones |
---|---|
KEYS_FIRST_ROW | Lo mismo que cierto en el primer argumento. |
LLAVES_RELATIVAS | índice de la celda superior izquierda del área (no de la hoja) |
LLAVES_SWAP | intercambiar filas y columnas |
Por ejemplo
$ result = $ excel -> readRows ([ ' A ' => ' bee ' , ' B ' => ' honey ' ], Excel:: KEYS_FIRST_ROW | Excel:: KEYS_ROW_ZERO_BASED );
Obtendrás este resultado:
Array
(
[0] => Array
(
[bee] => 111
[honey] => 'aaa'
)
[1] => Array
(
[bee] => 222
[honey] => 'bbb'
)
)
La biblioteca ya omite celdas y filas vacías de forma predeterminada. Las celdas vacías son celdas donde no está escrito nada y las filas vacías son filas donde todas las celdas están vacías. Si una celda contiene una cadena vacía, no se considera vacía. Pero puedes cambiar este comportamiento y omitir celdas con cadenas vacías.
$ 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
}
De otra manera
$ 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 );
Puede configurar el área de lectura mediante nombres definidos en el libro de trabajo. Por ejemplo, si el libro de trabajo tiene un nombre definido, Encabezados con rango Demo1!$B$4:$D$4 , entonces puede leer las celdas con este nombre.
$ excel -> setReadArea ( ' Values ' );
$ cells = $ excel -> readCells ();
Tenga en cuenta que, dado que el valor contiene el nombre de la hoja, esta hoja se convierte en la hoja predeterminada.
Puede configurar el área de lectura en la hoja
$ sheet = $ excel -> getSheet ( ' Demo1 ' )-> setReadArea ( ' Headers ' );
$ cells = $ sheet -> readCells ();
Pero si intentas usar este nombre en otra hoja, obtendrás un error.
$ sheet = $ excel -> getSheet ( ' Demo2 ' )-> setReadArea ( ' Headers ' );
// Exception: Wrong address or range "Values"
Si es necesario, puede controlar completamente el proceso de lectura utilizando el método readSheetCallback()
con la función de devolución de llamada.
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 );
De forma predeterminada, todos los valores de fecha y hora se devuelven como marca de tiempo. Pero puedes cambiar este comportamiento usando 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 ;
});
A veces, si el formato de una celda se especifica como una fecha pero no contiene una fecha, la biblioteca puede malinterpretar este valor. Para evitar esto, puede desactivar el formato de fecha.
Aquí, la celda B1 contiene la cadena "3.2" y la celda B2 contiene la fecha 2024-02-03, pero ambas celdas están configuradas en el formato de fecha.
$ 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 biblioteca intenta determinar los tipos de valores de celda y en la mayoría de los casos lo hace bien. Por lo tanto, obtienes valores numéricos o de cadena. Los valores de fecha se devuelven como una marca de tiempo de forma predeterminada. Pero puede cambiar este comportamiento configurando el formato de fecha (consulte las opciones de formato para la función PHP date()).
$ excel = Excel:: open ( $ file );
$ result = $ excel -> readCells ();
print_r ( $ result );
El ejemplo anterior generará:
Array
(
[B2] => -2205187200
[B3] => 6614697600
[B4] => -6845212800
)
$ excel = Excel:: open ( $ file );
$ excel -> setDateFormat ( ' Y-m-d ' );
$ result = $ excel -> readCells ();
print_r ( $ result );
El ejemplo anterior generará:
Array
(
[B2] => '1900-02-14'
[B3] => '2179-08-12'
[B4] => '1753-01-31'
)
Por lo general, las funciones de lectura devuelven solo valores de celda, pero puedes leer los valores con estilos. En este caso, para cada celda, no se devolverá un valor escalar, sino una matriz como ['v' => valor_escalar , 's' => matriz_estilo , 'f' => fórmula ]
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> sheet ();
$ rows = $ sheet -> readRowsWithStyles ();
$ columns = $ sheet -> readColumnsWithStyles ();
$ cells = $ sheet -> readCellsWithStyles ();
$ cells = $ sheet -> readCellsWithStyles ();
O puedes leer solo estilos (sin valores)
$ 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,
)
*/
Pero no recomendamos utilizar estos métodos con archivos grandes.
Cada hoja de su archivo XLSX puede contener un conjunto de reglas de validación de datos. Para recuperarlos, puede implicar llamar getDataValidations
en su hoja
$ 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',
],
]
*/
Recupera el ancho de una columna específica en una hoja:
$ 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
Recuperar la altura de una fila específica en una hoja:
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the height of row 1
$ rowHeight = $ sheet -> getRowHeight ( 1 );
echo $ rowHeight ; // Example: 15
Recupere la información del panel congelado de una hoja:
$ 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'
)
*/
Recupera la información del color de la pestaña de una hoja:
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'
)
*/
Puede utilizar los siguientes métodos:
Sheet::getMergedCells()
-- Devuelve todos los rangos combinadosSheet::isMerged(string $cellAddress)
- Comprueba si una celda está fusionadaSheet::mergedRange(string $cellAddress)
-- Devuelve el rango de combinación de la celda especificadaPor ejemplo
if ( $ sheet -> isMerged ( ' B3 ' )) {
$ range = $ sheet -> mergedRange ( ' B3 ' );
}
getSheetNames()
: devuelve una matriz de nombres de todas las hojas.sheet(?string $name = null)
- Devuelve la hoja predeterminada o especificadagetSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
- Obtener hoja por nombregetSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
- Obtener hoja por idgetFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
- Obtener la primera hojaselectSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
- Selecciona la hoja predeterminada por nombre y la devuelveselectSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
- Selecciona la hoja predeterminada por id y la devuelveselectFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
-- Selecciona la primera hoja como predeterminada y la devuelvegetDefinedNames()
: devuelve los nombres definidos del libro de trabajo.name()
- Devuelve el nombre de la cadenaisActive()
- Hoja de trabajo activaisHidden()
: si la hoja de trabajo está ocultaisVisible()
: si la hoja de trabajo es visiblestate()
- Devuelve el estado de la cadena de la hoja de trabajo (usado en isHidden()
y isVisible()
)dimension()
: devuelve la dimensión del área de trabajo predeterminada de las propiedades de la hojacountRows()
- Cuenta filas de la dimensióncountColumns()
- Cuenta columnas de la dimensiónfirstRow()
: el número de la primera fila.firstCol()
: la letra de la primera columna.readFirstRow()
: devuelve los valores de las celdas de la primera fila como matrizreadFirstRowWithStyles()
: devuelve valores y estilos de celdas de la primera fila como matrizgetColumnWidth(int)
: devuelve el ancho de un número de columna determinadogetFreezePaneConfig()
: devuelve una matriz que contiene la configuración del panel congeladogetTabColorConfiguration()
: devuelve una matriz que contiene la configuración del color de la pestaña. Si encuentra útil este paquete, puede darme una estrella en GitHub.
O puedes donarme :)