2019年10月11日14:03:31php
PhpSpreadsheet在工做表中平均每一個單元格使用約1k,所以大型工做簿能夠迅速用盡可用內存。單元緩存提供了一種機制,使PhpSpreadsheet能夠將單元對象維護在較小的內存或非內存中(例如:在磁盤上,在APCu中,內存緩存或Redis中)。這使您能夠減小大型工做簿的內存使用量,儘管以訪問單元數據的速度爲代價。git
默認狀況下,PhpSpreadsheet將全部單元格對象保留在內存中,可是您能夠經過提供本身的PSR-16實現來指定替代項 。PhpSpreadsheet密鑰會自動命名,並在使用後清除,所以單個緩存實例可在PhpSpreadsheet的幾種用法之間共享,甚至與其餘緩存用法共享。github
爲了使細胞緩存,您必須提供本身的實現,像這樣的緩存:redis
$cache = new MyCustomPsr16Implementation(); \PhpOffice\PhpSpreadsheet\Settings::setCache($cache);
將爲每一個單獨的工做表維護一個單獨的緩存,並在根據您配置的設置實例化工做表時自動建立該緩存。一旦開始閱讀工做簿或建立第一個工做表,就沒法更改配置設置。數組
與常見的緩存概念相反,PhpSpreadsheet數據沒法從頭開始從新生成。若是存儲了某些數據,但之後沒法檢索,則PhpSpreadsheet將引起異常。緩存
這意味着存儲在緩存中的數據不得由第三方或經過TTL機制刪除。bash
所以,請確保TTL已停用或足夠長以覆蓋PhpSpreadsheet的所有用法。app
PhpSpreadsheet不隨備用緩存實現一塊兒提供。您能夠根據本身的環境選擇最合適的實現。您能夠從頭開始實現PSR-16,也可使用預先存在的庫。composer
這樣的庫之一就是PHP Cache,它提供了多種選擇。有關詳細信息,請參閱他們的文檔,可是這裏有一些建議能夠幫助您入門。ide
要求將軟件包放入您的項目中:
composer require cache/simple-cache-bridge cache/apcu-adapter
用如下方式配置PhpSpreadsheet:
$pool = new \Cache\Adapter\Apcu\ApcuCachePool(); $simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool); \PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
要求將軟件包放入您的項目中:
composer require cache/simple-cache-bridge cache/redis-adapter
用如下方式配置PhpSpreadsheet:
$client = new \Redis(); $client->connect('127.0.0.1', 6379); $pool = new \Cache\Adapter\Redis\RedisCachePool($client); $simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool); \PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
要求將軟件包放入您的項目中:
composer require cache/simple-cache-bridge cache/memcache-adapter
用如下方式配置PhpSpreadsheet:
$client = new \Memcache(); $client->connect('localhost', 11211); $pool = new \Cache\Adapter\Memcache\MemcacheCachePool($client); $simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool); \PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
PhpSpreadsheet經過引入名稱空間和重命名某些類而引入了許多重大更改。爲了幫助您遷移現有項目,編寫了一個工具,將對PHPExcel類的全部引用替換爲它們的新名稱。可是,還須要進行手動更改。
該工具包含在PhpSpreadsheet中。它從當前目錄開始遞歸掃描全部文件和目錄。假設它是用composer安裝的,則能夠這樣運行:
cd /project/to/migrate/src /project/to/migrate/vendor/phpoffice/phpspreadsheet/bin/migrate-from-phpexcel
重要說明該工具將不可逆轉地修改您的源代碼,確保備份全部內容,並在提交前仔細檢查結果。
除了自動更改以外,還須要手動遷移一些內容。
當使用IOFactory::createReader()
,IOFactory::createWriter()
而且 IOFactory::identify()
,使用的讀/寫短名稱。更改了它們以及它們相應的類,以消除歧義:
以前 | 後 |
---|---|
'CSV' |
'Csv' |
'Excel2003XML' |
'Xml' |
'Excel2007' |
'Xlsx' |
'Excel5' |
'Xls' |
'Gnumeric' |
'Gnumeric' |
'HTML' |
'Html' |
'OOCalc' |
'Ods' |
'OpenDocument' |
'Ods' |
'PDF' |
'Pdf' |
'SYLK' |
'Slk' |
下列方法:
PHPExcel_IOFactory::getSearchLocations()
PHPExcel_IOFactory::setSearchLocations()
PHPExcel_IOFactory::addSearchLocation()
被IOFactory::registerReader()
和取代IOFactory::registerWriter()
。這意味着IOFactory如今依賴於類的自動加載。
以前:
\PHPExcel_IOFactory::addSearchLocation($type, $location, $classname);
後:
\PhpOffice\PhpSpreadsheet\IOFactory::registerReader($type, $classname);
// Before $worksheet->duplicateStyleArray($styles, $range, $advanced); // After $worksheet->getStyle($range)->applyFromArray($styles, $advanced);
// Before DataType::dataTypeForValue($value); // After DefaultValueBinder::dataTypeForValue($value);
// Before $conditional->getCondition(); // After $conditional->getConditions()[0];
// Before $conditional->setCondition($value); // After $conditional->setConditions($value);
// Before $worksheet->getDefaultStyle(); // After $worksheet->getParent()->getDefaultStyle();
// Before $worksheet->setDefaultStyle($value); // After $worksheet->getParent()->getDefaultStyle()->applyFromArray([ 'font' => [ 'name' => $pValue->getFont()->getName(), 'size' => $pValue->getFont()->getSize(), ], ]);
// Before $worksheet->setSharedStyle($sharedStyle, $range); // After $worksheet->duplicateStyle($sharedStyle, $range);
// Before $worksheet->getSelectedCell(); // After $worksheet->getSelectedCells();
// Before $writer->setTempDir(); // After, there is no way to set temporary storage directory anymore
該類PHPExcel_Autoloader
已被徹底刪除,並由做曲家自動加載機制取代。
PDF庫必須經過composer安裝。而且如下方法已被刪除並被替換爲IOFactory::registerWriter()
:
PHPExcel_Settings::getPdfRenderer()
PHPExcel_Settings::setPdfRenderer()
PHPExcel_Settings::getPdfRendererName()
PHPExcel_Settings::setPdfRendererName()
以前:
\PHPExcel_Settings::setPdfRendererName(PHPExcel_Settings::PDF_RENDERER_MPDF);
\PHPExcel_Settings::setPdfRenderer($somePath); $writer = \PHPExcel_IOFactory::createWriter($spreadsheet, 'PDF');
後:
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Mpdf'); // Or alternatively \PhpOffice\PhpSpreadsheet\IOFactory::registerWriter('Pdf', \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf::class); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Pdf'); // Or alternatively $writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet);
爲HTML或PDF輸出呈現圖表時,該過程也獲得了簡化。而且,儘管仍然提供JpGraph支持,但遺憾的是它不是最新的PHP版本的最新內容,而且會生成各類警告。
若是您依賴此功能,請考慮爲JpGraph或其餘IRenderer
實現提供補丁(一個不錯的選擇多是CpChart)。
以前:
$rendererName = \PHPExcel_Settings::CHART_RENDERER_JPGRAPH; $rendererLibrary = 'jpgraph3.5.0b1/src/'; $rendererLibraryPath = '/php/libraries/Charts/' . $rendererLibrary; \PHPExcel_Settings::setChartRenderer($rendererName, $rendererLibraryPath);
後:
經過composer要求依賴:
composer require jpgraph/jpgraph
接着:
Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class);
放棄了對PclZip的支持,而支持更完整和現代的 PHP擴展ZipArchive。所以,如下內容被刪除:
PclZip
PHPExcel_Settings::setZipClass()
PHPExcel_Settings::getZipClass()
PHPExcel_Shared_ZipArchive
PHPExcel_Shared_ZipStreamWrapper
單元緩存已大量重構以利用 PSR-16。這意味着與該功能相關的大多數類均已刪除:
PHPExcel_CachedObjectStorage_APC
PHPExcel_CachedObjectStorage_DiscISAM
PHPExcel_CachedObjectStorage_ICache
PHPExcel_CachedObjectStorage_Igbinary
PHPExcel_CachedObjectStorage_Memcache
PHPExcel_CachedObjectStorage_Memory
PHPExcel_CachedObjectStorage_MemoryGZip
PHPExcel_CachedObjectStorage_MemorySerialized
PHPExcel_CachedObjectStorage_PHPTemp
PHPExcel_CachedObjectStorage_SQLite
PHPExcel_CachedObjectStorage_SQLite3
PHPExcel_CachedObjectStorage_Wincache
除此以外,\PhpOffice\PhpSpreadsheet::getCellCollection()
改名爲\PhpOffice\PhpSpreadsheet::getCoordinates()
和 \PhpOffice\PhpSpreadsheet::getCellCacheController()
到 \PhpOffice\PhpSpreadsheet::getCellCollection()
了清晰度。
請參閱新文檔,以瞭解如何遷移。
對於如下全部方法,將沒法再更改返回值的類型。它老是返回工做表,而不返回單元格或規則:
遷移相似於:
// Before $cell = $worksheet->setCellValue('A1', 'value', true); // After $cell = $worksheet->getCell('A1')->setValue('value');
用於樣式的數組鍵已通過標準化,以得到更連貫的體驗。如今,它使用與getter和setter相同的措辭和大小寫:
// Before $style = [ 'numberformat' => [ 'code' => NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE, ], 'font' => [ 'strike' => true, 'superScript' => true, 'subScript' => true, ], 'alignment' => [ 'rotation' => 90, 'readorder' => Alignment::READORDER_RTL, 'wrap' => true, ], 'borders' => [ 'diagonaldirection' => Borders::DIAGONAL_BOTH, 'allborders' => [ 'style' => Border::BORDER_THIN, ], ], 'fill' => [ 'type' => Fill::FILL_GRADIENT_LINEAR, 'startcolor' => [ 'argb' => 'FFA0A0A0', ], 'endcolor' => [ 'argb' => 'FFFFFFFF', ], ], ]; // After $style = [ 'numberFormat' => [ 'formatCode' => NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE, ], 'font' => [ 'strikethrough' => true, 'superscript' => true, 'subscript' => true, ], 'alignment' => [ 'textRotation' => 90, 'readOrder' => Alignment::READORDER_RTL, 'wrapText' => true, ], 'borders' => [ 'diagonalDirection' => Borders::DIAGONAL_BOTH, 'allBorders' => [ 'borderStyle' => Border::BORDER_THIN, ], ], 'fill' => [ 'fillType' => Fill::FILL_GRADIENT_LINEAR, 'startColor' => [ 'argb' => 'FFA0A0A0', ], 'endColor' => [ 'argb' => 'FFFFFFFF', ], ], ];
曾經存在於PHPExcel_Cell
其中的座標處理方法被提取到一個專用的新類中\PhpOffice\PhpSpreadsheet\Cell\Coordinate
。方法是:
absoluteCoordinate()
absoluteReference()
buildRange()
columnIndexFromString()
coordinateFromString()
extractAllCellReferencesInRange()
getRangeBoundaries()
mergeRangesInCollection()
rangeBoundaries()
rangeDimension()
splitRange()
stringFromColumnIndex()
列索引如今基於1。因此列A
是index 1
。這與從1開始的行和爲column COLUMN()
返回的Excel函數一致。所以,必須對代碼進行以下修改:1
A
// Before $cell = $worksheet->getCellByColumnAndRow($column, $row); for ($column = 0; $column < $max; $column++) { $worksheet->setCellValueByColumnAndRow($column, $row, 'value ' . $column); } // After $cell = $worksheet->getCellByColumnAndRow($column + 1, $row); for ($column = 1; $column <= $max; $column++) { $worksheet->setCellValueByColumnAndRow($column, $row, 'value ' . $column); }
如下全部方法均會受到影響:
PHPExcel_Worksheet::cellExistsByColumnAndRow()
PHPExcel_Worksheet::freezePaneByColumnAndRow()
PHPExcel_Worksheet::getCellByColumnAndRow()
PHPExcel_Worksheet::getColumnDimensionByColumn()
PHPExcel_Worksheet::getCommentByColumnAndRow()
PHPExcel_Worksheet::getStyleByColumnAndRow()
PHPExcel_Worksheet::insertNewColumnBeforeByIndex()
PHPExcel_Worksheet::mergeCellsByColumnAndRow()
PHPExcel_Worksheet::protectCellsByColumnAndRow()
PHPExcel_Worksheet::removeColumnByIndex()
PHPExcel_Worksheet::setAutoFilterByColumnAndRow()
PHPExcel_Worksheet::setBreakByColumnAndRow()
PHPExcel_Worksheet::setCellValueByColumnAndRow()
PHPExcel_Worksheet::setCellValueExplicitByColumnAndRow()
PHPExcel_Worksheet::setSelectedCellByColumnAndRow()
PHPExcel_Worksheet::stringFromColumnIndex()
PHPExcel_Worksheet::unmergeCellsByColumnAndRow()
PHPExcel_Worksheet::unprotectCellsByColumnAndRow()
PHPExcel_Worksheet_PageSetup::addPrintAreaByColumnAndRow()
PHPExcel_Worksheet_PageSetup::setPrintAreaByColumnAndRow()
許多方法的默認值在沒有意義時被刪除。一般,setter方法不該具備默認值。有關方法及其原始默認值的完整列表,請參見commit