I wrote a function which reads large Excel(.xls or .xlsx) or CSV files with php libraries. The function uses following libraries.
| phpoffice/phpspreadsheet | 1.21.0 |
| box/spout | v3.3.0 |
1. Procedure to install php libraries
1.1. Install Composer (a tool for dependency management in php)
$ mkdir composer $ cd composer/ $ curl -sS https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer $ sudo chmod +x /usr/local/bin/composer
1.2. Install PhpSpreadsheet (a library for reading and writing spreadsheets such as xlsx, xls, ods and csv)
$ composer require phpoffice/phpspreadsheet
1.3. Install Spout (a library for reading and writing 3 types of spreadsheets xlsx, ods and csv)
$ composer require "box/spout"
2. A function which reads large Excel(.xls or .xlsx) or CSV files
The function below reads spreadsheet data from large Excel(.xls or .xlsx) or CSV files and store them in a 2 dimensional array. It takes following 2 arguments.
| $targetFileName | an input file name with full path |
| $fileType | a file extension of an input file |
require_once('/path-to-composer/composer/vendor/autoload.php');
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Reader\Csv as CsvReader;
use PhpOffice\PhpSpreadsheet\Reader\Xls as XlsReader;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory as SpoutReaderEntityFactory;
function getExcelSheetData($targetFileName, $fileType) {
$sheetData = "";
if ($fileType == "csv" || $fileType == "xls") {
$sheetData = getExcelSheetDataWithPhpSpreadsheet($targetFileName, $fileType);
} else if ($fileType == "xlsx") {
$sheetData = getExcelSheetDataWithSpout($targetFileName, $fileType);
} else {
// Error Handling
}
return $sheetData;
}
function getExcelSheetDataWithPhpSpreadsheet($targetFileName, $fileType) {
$reader = null;
if ($fileType == "csv") {
$reader = new CsvReader();
} else if ($fileType == "xls") {
$reader = new XlsReader();
} else {
// Error Handling
}
$reader->setReadDataOnly(TRUE);
try {
$spreadSheet = $reader->load($targetFileName);
} catch (Error | Exception $ex) {
// Error Handling
}
// get data from active sheet
$sheet = $spreadSheet->getActiveSheet();
$row = 1;
foreach ($sheet->getRowIterator() as $eachRow) {
foreach($sheet->getColumnIterator() as $column) {
$sheetData[$row - 1][]
= $sheet->getCell($column->getColumnIndex() . $row)->getValue();
}
$row++;
}
$spreadSheet->disconnectWorksheets();
return $sheetData;
}
function getExcelSheetDataWithSpout($targetFileName, $fileType) {
if ($fileType != "xlsx") {
// Error Handling
}
$reader = SpoutReaderEntityFactory::createXLSXReader();
try {
$reader->open($targetFileName);
} catch (Error | Exception $ex) {
// Error Handling
}
// read data from "active" sheet
foreach ($reader->getSheetIterator() as $sheet) {
if ($sheet->isActive()) {
$row = 1;
foreach ($sheet->getRowIterator() as $eachRow) {
$column = 1;
foreach ($eachRow->getCells() as $cell) {
$sheetData[$row - 1][] = $cell->getValue();
$column++;
}
$row++;
}
break; // no need to read more sheets
}
}
$reader->close();
return $sheetData;
}