phpspreadsheet 中文文档(五)节约内存+PHPExcel迁移
2019年10月11日14:03:31
节省内存
PhpSpreadsheet在工作表中平均每个单元格使用约1k,因此大型工作簿可以迅速用尽可用内存。单元缓存提供了一种机制,使PhpSpreadsheet可以将单元对象维护在较小的内存或非内存中(例如:在磁盘上,在APCu中,内存缓存或Redis中)。这使您可以减少大型工作簿的内存使用量,尽管以访问单元数据的速度为代价。
默认情况下,PhpSpreadsheet将所有单元格对象保留在内存中,但是您可以通过提供自己的PSR-16实现来指定替代项 。PhpSpreadsheet密钥会自动命名,并在使用后清除,因此单个缓存实例可在PhpSpreadsheet的几种用法之间共享,甚至与其他缓存用法共享。
为了使细胞缓存,您必须提供自己的实现,像这样的缓存:
$cache = new MyCustomPsr16Implementation();
\PhpOffice\PhpSpreadsheet\Settings::setCache($cache);
将为每个单独的工作表维护一个单独的缓存,并在根据您配置的设置实例化工作表时自动创建该缓存。一旦开始阅读工作簿或创建第一个工作表,就无法更改配置设置。
当心TTL
与常见的缓存概念相反,PhpSpreadsheet数据无法从头开始重新生成。如果存储了某些数据,但以后无法检索,则PhpSpreadsheet将引发异常。
这意味着存储在缓存中的数据不得由第三方或通过TTL机制删除。
因此,请确保TTL已停用或足够长以覆盖PhpSpreadsheet的全部用法。
常见用例
PhpSpreadsheet不随备用缓存实现一起提供。您可以根据自己的环境选择最合适的实现。您可以从头开始实现PSR-16,也可以使用预先存在的库。
这样的库之一就是PHP Cache,它提供了多种选择。有关详细信息,请参阅他们的文档,但是这里有一些建议可以帮助您入门。
铜铜合金
要求将软件包放入您的项目中:
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);
从PHPExcel迁移
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' |
简化的IOFactory
下列方法:
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);
删除过时的东西
工作表:: duplicateStyleArray()
// Before
$worksheet->duplicateStyleArray($styles, $range, $advanced);
// After
$worksheet->getStyle($range)->applyFromArray($styles, $advanced);
DataType :: dataTypeForValue()
// Before
DataType::dataTypeForValue($value);
// After
DefaultValueBinder::dataTypeForValue($value);
有条件的:: getCondition()
// Before
$conditional->getCondition();
// After
$conditional->getConditions()[0];
有条件的:: setCondition()
// Before
$conditional->setCondition($value);
// After
$conditional->setConditions($value);
工作表:: getDefaultStyle()
// Before
$worksheet->getDefaultStyle();
// After
$worksheet->getParent()->getDefaultStyle();
工作表:: setDefaultStyle()
// Before
$worksheet->setDefaultStyle($value);
// After
$worksheet->getParent()->getDefaultStyle()->applyFromArray([
'font' => [
'name' => $pValue->getFont()->getName(),
'size' => $pValue->getFont()->getSize(),
],
]);
工作表:: setSharedStyle()
// Before
$worksheet->setSharedStyle($sharedStyle, $range);
// After
$worksheet->duplicateStyle($sharedStyle, $range);
工作表:: getSelectedCell()
// Before
$worksheet->getSelectedCell();
// After
$worksheet->getSelectedCells();
Writer \ Xls :: setTempDir()
// Before
$writer->setTempDir();
// After, there is no way to set temporary storage directory anymore
自动装带器
该类PHPExcel_Autoloader已被完全删除,并由作曲家自动加载机制取代。
撰写PDF
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和ZipArchive
放弃了对PclZip的支持,而支持更完整和现代的 PHP扩展ZipArchive。因此,以下内容被删除:
PclZipPHPExcel_Settings::setZipClass()PHPExcel_Settings::getZipClass()PHPExcel_Shared_ZipArchivePHPExcel_Shared_ZipStreamWrapper
单元缓存
单元缓存已大量重构以利用 PSR-16。这意味着与该功能相关的大多数类均已删除:
PHPExcel_CachedObjectStorage_APCPHPExcel_CachedObjectStorage_DiscISAMPHPExcel_CachedObjectStorage_ICachePHPExcel_CachedObjectStorage_IgbinaryPHPExcel_CachedObjectStorage_MemcachePHPExcel_CachedObjectStorage_MemoryPHPExcel_CachedObjectStorage_MemoryGZipPHPExcel_CachedObjectStorage_MemorySerializedPHPExcel_CachedObjectStorage_PHPTempPHPExcel_CachedObjectStorage_SQLitePHPExcel_CachedObjectStorage_SQLite3PHPExcel_CachedObjectStorage_Wincache
除此之外,\PhpOffice\PhpSpreadsheet::getCellCollection()更名为\PhpOffice\PhpSpreadsheet::getCoordinates()和 \PhpOffice\PhpSpreadsheet::getCellCacheController()到 \PhpOffice\PhpSpreadsheet::getCellCollection()了清晰度。
请参阅新文档,以了解如何迁移。
删除有条件返回的单元格
对于以下所有方法,将无法再更改返回值的类型。它总是返回工作表,而不返回单元格或规则:
- 工作表:: setCellValue()
- 工作表:: setCellValueByColumnAndRow()
- 工作表:: setCellValueExplicit()
- 工作表:: setCellValueExplicitByColumnAndRow()
- 工作表:: addRule()
迁移类似于:
// 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
列索引现在基于1。所以列A是index 1。这与从1开始的行和为column COLUMN()返回的Excel函数一致。因此,必须对代码进行如下修改:1A
// 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
phpspreadsheet 中文文档(五)节约内存+PHPExcel迁移的更多相关文章
- phpspreadsheet 中文文档 粗翻版
2019年10月11日09:32:33 官方使用文档 https://phpspreadsheet.readthedocs.io/en/stable/topics/accessing-cells/ ...
- phpspreadsheet 中文文档(七)技巧和诀窍
2019年10月11日14:08:35 以下页面为您提供了一些使用广泛的PhpSpreadsheet食谱.请注意,这些文件没有提供有关特定PhpSpreadsheet API函数的完整文档,而只是一个 ...
- phpspreadsheet 中文文档(三) 计算引擎
2019年10月11日13:59:52 使用PhpSpreadsheet计算引擎 执行公式计算 由于PhpSpreadsheet表示内存中的电子表格,因此它还提供公式计算功能.单元格可以是值类型(包含 ...
- phpspreadsheet 中文文档(二) 结构+自动筛选
2019年10月11日13:55:41 原理图 自动加载器 PhpSpreadsheet依赖于Composer自动加载器.因此,在独立使用PhpSpreadsheet之前,请确保先运行composer ...
- phpspreadsheet 中文文档(一) 访问单元格
2019年10月11日11:45:09 访问单元格 访问电子表格中的单元格应该非常简单.本主题列出了一些访问单元的选项. 通过坐标设置单元格值 可以使用工作表的setCellValue()方法来按坐标 ...
- phpspreadsheet 中文文档(八)读写文件+读取文件
2019年10月11日14:09:40 配置设定 将PhpSpreadsheet文件包含在脚本中之后,但是在实例化Spreadsheet对象或加载工作簿文件之前,可以设置许多配置选项,这些配置选项将影 ...
- phpspreadsheet 中文文档(六)读写文件+读取文件
2019年10月11日14:05:58 读写文件 从体系结构您已经知道,使用基本PhpSpreadsheet类无法对持久性存储进行读写.为此,PhpSpreadsheet提供读者和作家,这是实现\Ph ...
- phpspreadsheet 中文文档(四) 创建电子表格+档案格式
2019年10月11日14:01:48 该Spreadsheet班 该Spreadsheet班是PhpSpreadsheet的核心.它包含对所包含工作表,文档安全性设置和文档元数据的引用. 为了简化P ...
- Hadoop-2.2.0中文文档—— 从Hadoop 1.x 迁移至 Hadoop 2.x
简单介绍 本文档对从 Apache Hadoop 1.x 迁移他们的Apache Hadoop MapReduce 应用到 Apache Hadoop 2.x 的用户提供了一些信息. 在 Apache ...
随机推荐
- 项目Beta冲刺(5/7)(追光的人)(2019.5.27)
所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...
- Spring Boot 与 Spring Cloud 的版本对应
事项 列表 spring官方对应查看网址 https://start.spring.io/actuator/info spring-cloud-dependencies 版本列表 https://mv ...
- 20180606模拟赛T1——猫鼠游戏
题目描述: 猫和老鼠在10*10的方格中运动,例如: *...*..... ......*... ...*...*.. .......... ...*.C.... *.....*... ...*... ...
- 使用kubeadm 安装 kubernetes 1.15.1
简介: Kubernetes作为Google开源的容器运行平台,受到了大家的热捧.搭建一套完整的kubernetes平台,也成为试用这套平台必须迈过的坎儿.kubernetes1.5版本以及之前,安装 ...
- 事物分析、静态分析(结构分析)与UML
事物分析: 1)要素分析: 2)结构(组织.关系)分析: 符合软件中的数据库观点和UML观点: 符合数据结构的观点. 符合由点到面的观点. 将关系和元素提到了同等重要的地位. 符合哲学中普遍联系的观点 ...
- VisualStudio中集成扩展调试SOS
SOS扩展也是可以和VisualStudio进行集成的,这样真的方便了我们调试一些性能要求比较高的程序,当程序运行一段时间后我们用VS附加到进程,然后查看一些重要的对象数据,但是此时我们看不到.NET ...
- 20101010 exam
目录 2018 10.10 exam 解题报告 T1:LOJ #10078 新年好 题目描述(原题来自:CQOI 2005): 输入格式: 输出格式: 样例输入: 样例输出: 数据范围与提示: 思路: ...
- GitBook github
创建一个新的仓库 创建一个新文件,名为SUMMARY.md 创建一本书首先进入gitbook的官网:https://www.gitbook.com/ 创建账户https://github.com/ 在 ...
- x64汇编第四讲,c / C++中调用x64汇编
目录 x64汇编第四讲,c / C++中调用x64汇编 一丶简介 1.说明 二丶C/C++调用 asm64.asm函数. 1.配置asm参与生成 2.给Asm文件添加函数代码 3.C/C++调用asm ...
- zabbix监控nginx,mysql,java
zabbix 支持的主要监控方式(1)agent代理程序 在Agent监控方式下,zabbix-agent会主动收集本机的监控信息并通过TCP协议与zabbix-server传递信息.Agent 监控 ...