FastExcelReader ist Teil des FastExcelPhp-Projekts, das aus Folgendem besteht:
Diese Bibliothek ist leichtgewichtig, superschnell und erfordert nur minimalen Speicherverbrauch.
FastExcelReader kann Excel-kompatible Tabellenkalkulationen im XLSX-Format (Office 2007+) lesen. Es liest nur Daten, aber das sehr schnell und mit minimalem Speicherverbrauch.
Merkmale
Verwenden Sie composer
, um FastExcelReader in Ihrem Projekt zu installieren:
composer require avadim/fast-excel-reader
Springe zu:
Weitere Beispiele finden Sie im Ordner /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 ();
Sie erhalten dieses Array:
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 ();
Sie erhalten dieses Array:
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 ();
Sie erhalten dieses Array:
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' => ...]
// ...
}
Alternative Möglichkeit, Zeile für Zeile zu lesen
// 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 );
Sie erhalten dieses Ergebnis:
Array
(
[2] => Array
(
['col1'] => 111
['col2'] => 'aaa'
)
[3] => Array
(
['col1'] => 222
['col2'] => 'bbb'
)
)
Das optionale zweite Argument gibt die Ergebnis-Array-Schlüssel an
// Rows and cols start from zero
$ result = $ excel -> readRows ( false , Excel:: KEYS_ZERO_BASED );
Sie erhalten dieses Ergebnis:
Array
(
[0] => Array
(
[0] => 'col1'
[1] => 'col2'
)
[1] => Array
(
[0] => 111
[1] => 'aaa'
)
[2] => Array
(
[0] => 222
[1] => 'bbb'
)
)
Zulässige Werte des Ergebnismodus
Modusoptionen | Beschreibungen |
---|---|
KEYS_ORIGINAL | Zeilen ab „1“, Spalten ab „A“ (Standard) |
KEYS_ROW_ZERO_BASED | Zeilen ab 0 |
KEYS_COL_ZERO_BASED | Spalten von 0 |
KEYS_ZERO_BASED | Zeilen ab 0, Spalten ab 0 (dasselbe wie KEYS_ROW_ZERO_BASED + KEYS_COL_ZERO_BASED) |
KEYS_ROW_ONE_BASED | Reihen ab 1 |
KEYS_COL_ONE_BASED | Spalten ab 1 |
KEYS_ONE_BASED | Zeilen ab 1, Spalten ab 1 (dasselbe wie KEYS_ROW_ONE_BASED + KEYS_COL_ONE_BASED) |
Zusätzliche Optionen, die mit Ergebnismodi kombiniert werden können
Optionen | Beschreibungen |
---|---|
KEYS_FIRST_ROW | das Gleiche wie true im ersten Argument |
KEYS_RELATIVE | Index von der oberen linken Zelle des Bereichs (nicht Blatt) |
KEYS_SWAP | Zeilen und Spalten vertauschen |
Zum Beispiel
$ result = $ excel -> readRows ([ ' A ' => ' bee ' , ' B ' => ' honey ' ], Excel:: KEYS_FIRST_ROW | Excel:: KEYS_ROW_ZERO_BASED );
Sie erhalten dieses Ergebnis:
Array
(
[0] => Array
(
[bee] => 111
[honey] => 'aaa'
)
[1] => Array
(
[bee] => 222
[honey] => 'bbb'
)
)
Die Bibliothek überspringt bereits standardmäßig leere Zellen und leere Zeilen. Leere Zellen sind Zellen, in denen nichts geschrieben ist, und leere Zeilen sind Zeilen, in denen alle Zellen leer sind. Wenn eine Zelle eine leere Zeichenfolge enthält, gilt sie nicht als leer. Sie können dieses Verhalten jedoch ändern und Zellen mit leeren Zeichenfolgen überspringen.
$ 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
}
Anderer Weg
$ 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 );
Sie können den Lesebereich anhand definierter Namen in der Arbeitsmappe festlegen. Wenn die Arbeitsmappe beispielsweise Namensüberschriften mit dem Bereich Demo1!$B$4:$D$4 definiert hat, können Sie Zellen mit diesem Namen lesen
$ excel -> setReadArea ( ' Values ' );
$ cells = $ excel -> readCells ();
Beachten Sie, dass dieses Blatt zum Standardblatt wird, da der Wert den Blattnamen enthält.
Sie können den Lesebereich im Blatt festlegen
$ sheet = $ excel -> getSheet ( ' Demo1 ' )-> setReadArea ( ' Headers ' );
$ cells = $ sheet -> readCells ();
Wenn Sie jedoch versuchen, diesen Namen auf einem anderen Blatt zu verwenden, erhalten Sie eine Fehlermeldung
$ sheet = $ excel -> getSheet ( ' Demo2 ' )-> setReadArea ( ' Headers ' );
// Exception: Wrong address or range "Values"
Bei Bedarf können Sie den Lesevorgang über die Methode readSheetCallback()
mit Callback-Funktion vollständig steuern
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 );
Standardmäßig werden alle Datums-/Uhrzeitwerte als Zeitstempel zurückgegeben. Sie können dieses Verhalten jedoch mit dateFormatter()
ändern.
$ 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 ;
});
Wenn das Format einer Zelle als Datum angegeben ist, aber kein Datum enthält, kann es vorkommen, dass die Bibliothek diesen Wert falsch interpretiert. Um dies zu vermeiden, können Sie die Datumsformatierung deaktivieren
Hier enthält Zelle B1 die Zeichenfolge „3.2“ und Zelle B2 das Datum 2024-02-03, aber beide Zellen sind auf das Datumsformat eingestellt
$ 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 );
Die Bibliothek versucht, die Typen der Zellwerte zu bestimmen, und in den meisten Fällen gelingt ihr dies richtig. Daher erhalten Sie numerische Werte oder Zeichenfolgenwerte. Datumswerte werden standardmäßig als Zeitstempel zurückgegeben. Sie können dieses Verhalten jedoch ändern, indem Sie das Datumsformat festlegen (siehe Formatierungsoptionen für die PHP-Funktion date()).
$ excel = Excel:: open ( $ file );
$ result = $ excel -> readCells ();
print_r ( $ result );
Das obige Beispiel gibt Folgendes aus:
Array
(
[B2] => -2205187200
[B3] => 6614697600
[B4] => -6845212800
)
$ excel = Excel:: open ( $ file );
$ excel -> setDateFormat ( ' Y-m-d ' );
$ result = $ excel -> readCells ();
print_r ( $ result );
Das obige Beispiel gibt Folgendes aus:
Array
(
[B2] => '1900-02-14'
[B3] => '2179-08-12'
[B4] => '1753-01-31'
)
Normalerweise geben Lesefunktionen nur Zellwerte zurück, Sie können die Werte jedoch mit Stilen lesen. In diesem Fall wird für jede Zelle kein Skalarwert zurückgegeben, sondern ein Array wie ['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 ();
Oder Sie können nur Stile lesen (ohne Werte)
$ 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,
)
*/
Wir empfehlen jedoch nicht, diese Methoden bei großen Dateien zu verwenden
Jedes Blatt in Ihrer XLSX-Datei kann eine Reihe von Datenvalidierungsregeln enthalten. Um sie abzurufen, können Sie getDataValidations
auf Ihrem Blatt aufrufen
$ 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',
],
]
*/
Rufen Sie die Breite einer bestimmten Spalte in einem Blatt ab:
$ 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
Rufen Sie die Höhe einer bestimmten Zeile in einem Blatt ab:
$ excel = Excel:: open ( $ file );
$ sheet = $ excel -> selectSheet ( ' SheetName ' );
// Get the height of row 1
$ rowHeight = $ sheet -> getRowHeight ( 1 );
echo $ rowHeight ; // Example: 15
Rufen Sie die Informationen zum eingefrorenen Bereich für ein Blatt ab:
$ 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'
)
*/
Rufen Sie die Registerkartenfarbinformationen für ein Blatt ab:
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'
)
*/
Sie können die folgenden Methoden verwenden:
Sheet::getMergedCells()
– Gibt alle zusammengeführten Bereiche zurückSheet::isMerged(string $cellAddress)
– Prüft, ob eine Zelle zusammengeführt istSheet::mergedRange(string $cellAddress)
– Gibt den Zusammenführungsbereich der angegebenen Zelle zurückZum Beispiel
if ( $ sheet -> isMerged ( ' B3 ' )) {
$ range = $ sheet -> mergedRange ( ' B3 ' );
}
getSheetNames()
– Gibt das Namensarray aller Blätter zurücksheet(?string $name = null)
– Gibt das Standardblatt oder das angegebene Blatt zurückgetSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
– Blatt nach Namen abrufengetSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
– Blatt nach ID abrufengetFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
– Holen Sie sich das erste BlattselectSheet(string $name, ?string $areaRange = null, ?bool $firstRowKeys = false)
– Standardblatt nach Namen auswählen und zurückgebenselectSheetById(int $sheetId, ?string $areaRange = null, ?bool $firstRowKeys = false)
– Standardblatt anhand der ID auswählen und zurückgebenselectFirstSheet(?string $areaRange = null, ?bool $firstRowKeys = false)
– Wählt das erste Blatt als Standard aus und gibt es zurückgetDefinedNames()
– Gibt definierte Namen der Arbeitsmappe zurückname()
– Gibt den Namen der Zeichenfolge zurückisActive()
– Aktives ArbeitsblattisHidden()
– Wenn das Arbeitsblatt ausgeblendet istisVisible()
– Wenn das Arbeitsblatt sichtbar iststate()
– Gibt den String-Status des Arbeitsblatts zurück (verwendet in isHidden()
und isVisible()
)dimension()
– Gibt die Dimension des Standardarbeitsbereichs aus den Blatteigenschaften zurückcountRows()
– Zeilen aus der Dimension zählencountColumns()
– Spalten aus der Dimension zählenfirstRow()
– Die erste ZeilennummerfirstCol()
– Der erste SpaltenbuchstabereadFirstRow()
– Gibt Werte von Zellen der 1. Zeile als Array zurückreadFirstRowWithStyles()
– Gibt Werte und Stile von Zellen der 1. Zeile als Array zurückgetColumnWidth(int)
– Gibt die Breite einer bestimmten Spaltennummer zurückgetFreezePaneConfig()
– Gibt ein Array zurück, das die Konfiguration des eingefrorenen Bereichs enthältgetTabColorConfiguration()
– Gibt ein Array zurück, das die Tab-Farbkonfiguration enthält Wenn Sie dieses Paket nützlich finden, können Sie mir auf GitHub einen Stern geben.
Oder du kannst mir spenden :)