- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经将我的 php 配置设置设置为上传 12800M 文件、无限大小的文件和无限上传时间以进行测试,但我一直卡在这个常见的 PHPExcel 致命内存耗尽错误上。我收到以下常见错误消息:
fatal error :在第 1220 行的 .../Worksheet.php 中允许的 536870912 字节的内存大小已耗尽(试图分配 32 字节)。
当我使用 block 读取过滤器或迭代器时,随着 .xlsx 文件被进一步读取到行中,内存使用量会增加,而不是像我从 PHPExcel 开发人员那里读到的一些人所报告的那样保持不变。
我使用的是 PHPExcel 1.8.0。我可能会尝试旧版本,因为我读到读取大文件的性能更好。我从定期加载文件并将其读入数组开始,使用示例中的 block 读取过滤,以及此 URL 的迭代器:PHPExcel - memory leak when I go through all rows .我认为它是 1.8.0 或更早的版本并不重要。
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
date_default_timezone_set('America/Los_Angeles');
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
/** Include PHPExcel_IOFactory */
require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php';
if (!file_exists("Test.xlsx")) {
exit("Please check if Test.xlsx exists first.\n");
}
echo date('H:i:s') , " Load workbook from Excel5 file" , EOL;
$callStartTime = microtime(true);
$objPHPExcel = PHPExcel_IOFactory::load("Order_Short.xls");
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Call time to load Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
//http://runnable.com/Uot2A2l8VxsUAAAR/read-a-simple-2007-xlsx-excel-file-for-php
// Read your Excel workbook
$inputFileName="Drybar Client Data for Tableau Test.xlsx";
$table = "mt_company2_project2_table144_raw";
try {
echo date('H:i:s') , " Load workbook from Excel5 file" , EOL;
$callStartTime = microtime(true);
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Call time to load Workbook was ' , sprintf('%.4f',$callTime) , " seconds\r\n" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
} catch (Exception $e) {
die('Error loading file "' . pathinfo($inputFileName, PATHINFO_BASENAME)
. '": ' . $e->getMessage());
}
// Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
// http://asantillan.com/php-excel-import-to-mysql-using-phpexcel/
$worksheetTitle = $sheet->getTitle();
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
// Calculationg Columns
$nrColumns = ord($highestColumn) - 64;
echo "File ".$worksheetTitle." has ";
echo $nrColumns . ' columns';
echo ' x ' . $highestRow . ' rows.<br />';
// Loop through each row of the worksheet in turn
for ($row = 1; $row <= $highestRow; $row++) {
// Read a row of data into an array
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row,
NULL, FALSE, FALSE);
var_dump($rowData);
foreach ($rowData[0] as $k => $v) {
echo "Row: " . $row . "- Col: " . ($k + 1) . " = " . $v . "<br />";
}
}
我包括了从 PHPExcel Reader 示例 #12 修改的 block 读取过滤器,它仍然给我相同的致命内存耗尽,因为它的内存使用量仍在增加,因为它继续向下读取行?
<?php
error_reporting(E_ALL);
set_time_limit(0);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('America/Los_Angeles');
/** Set Include path to point at the PHPExcel Classes folder **/
set_include_path(get_include_path() . PATH_SEPARATOR . '../../../Classes/');
/** Include PHPExcel_IOFactory **/
include 'PHPExcel/IOFactory.php';
$inputFileName = 'Test.xlsx';
/** Define a Read Filter class implementing PHPExcel_Reader_IReadFilter */
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0;
private $_endRow = 0;
/** Set the list of rows that we want to read */
public function setRows($startRow, $chunkSize) {
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
}
public function readCell($column, $row, $worksheetName = '') {
// Only read the heading row, and the rows that are configured in $this->_startRow and $this->_endRow
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
return true;
}
return false;
}
}
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$callStartTime = microtime(true);
echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'<br />';
// Call time
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Call time to read Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
/** Create a new Reader of the type defined in $inputFileType **/
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
echo '<hr />';
/** Define how many rows we want to read for each "chunk" **/
$chunkSize = 100;
/** Create a new Instance of our Read Filter **/
$chunkFilter = new chunkReadFilter();
/** Tell the Reader that we want to use the Read Filter that we've Instantiated **/
$objReader->setReadFilter($chunkFilter);
/** Loop to read our worksheet in "chunk size" blocks **/
for ($startRow = 2; $startRow <= 26000; $startRow += $chunkSize) {
echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ',$startRow,' to ',($startRow+$chunkSize-1),'<br />';
/** Tell the Read Filter, the limits on which rows we want to read this iteration **/
$chunkFilter->setRows($startRow,$chunkSize);
/** Load only the rows that match our filter from $inputFileName to a PHPExcel Object **/
$objPHPExcel = $objReader->load($inputFileName);
// Do some processing here
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
echo '<br /><br />';
// Call time
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo 'Call time to read Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;
echo '<hr />';
}
?>
<body>
</html>
最佳答案
你这里确实有一个主要问题:
$sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
这将尝试为工作表的整个大小构建一个数组,无论您是否加载 block ...... toArray() 根据您正在加载的文件使用电子表格的预期大小,而不是您正在加载的过滤后的单元格集
尝试使用 rangeToArray() 仅获取您通过 block 加载的单元格范围
$sheetData = $objPHPExcel->getActiveSheet()
->rangeToArray(
'A'.$startRow.':'.$objPHPExcel->getActiveSheet()->getHighestColumn().($startRow+$chunkSize-1),
null,
true,
true,
true
);
即便如此,在内存中构建 PHP 数组也会占用大量内存;如果代码可以一次处理一行工作表数据而不是填充一个大数组,那么它对内存的需求就会少很多
关于PHPExcel 1.8.0 内存在加载、 block 读取和迭代器时耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30359130/
我已经完成了我的工作,直到在 excel 中获取 SQL 表数据,但我还想使用 PHPEXCEL 将数据转换为条形图。有人知道吗?怎么做?我的 PHPEXCEL 代码如下, $sql = "SELEC
我想阅读 Excel 工作表下拉列表中给出的选项列表。 例如: - 有一个单元格(86,G)没有尝试作为选项,但它是一个下拉列表。所以无论用户选择什么,我都想从下拉列表中读取最后一个选项。 如何实现这
我在使用 PHPExcel 设置自定义日期格式时遇到了一个奇怪的问题:我正在将一个 sql 格式的日期写入一个单元格,并使用 setFormatCode 将其格式设置为“d/m/y”。当我在 Exce
在 PHPExcel 中创建 XLS 文档时如何为事件单元格设置特定颜色? 最佳答案 $sheet->getStyle('A1')->applyFromArray( array(
我需要生成Excel文件,我进行了搜索,phpexcel似乎很好而且稳定。我想知道:* 鉴于它是一个 symfony2.0 项目,如何将它集成到我的项目中* 如果我可以通过这个 php 库完成我通常在
我在使用 PHPExcel 时遇到以下问题 function Test($a, $b) { // Create a new PHPExcel object with a single she
我想使用 PHPExcel 从 Excel 工作表中删除所有以“//”开头的行。我的代码: require '../Classes/PHPExcel.php'; require_once '../Cl
我的 EXCEL 到 CSV 转换代码正在运行...但对于特定的 Excel 文件,它出现错误 在第 950 行/var/www/portal/user/admin/pe/Classes/PHPExc
我正在使用 PHPExcel 库,我无法更改图表的颜色。 谁有解决办法,请告诉我? 检查这个屏幕我想改变蓝色、红色和绿色的颜色: 最佳答案 当前版本的 PHPExcel 不支持这样做。 在 this
我正在尝试将 PHPExcel 包含到 Silverstripe 3 站点以导出 Excel 工作表。现在我只是想测试,但在尝试时出现此错误: [Warning] require_once(/site
当我尝试从 excel 文件中提取信息时遇到了这个问题。这是我的情况,我从不同用户那里收到了 34 个 Excel 文件。 我正在使用 PHP 版本 5 从 Excel 文件中提取。我的脚本将循环每个
我有来自 phpExel 的这段代码。 $objPHPExcel->setActiveSheetIndex(1)->mergeCells('A1:I1'); 此代码在 A1 到 I1 列之间创建了一些
我正在使用 phpexcel 将我的查询导出到 excel 文件中;但是在我创建文件(xslx 格式)后,我无法在 excel 中打开我的文件。它给出了“文件格式或扩展名无效。验证文件没有损坏并且文件
我有以下代码: $vOffset = 2; $offset = 6; $formatRows = 100; $formatColumns = 100; //set conditional format
我正在尝试生成包含多个工作表的 Excel 文件,并且该文件正在使用正确的数据生成,但在打开它时出错。 错误是: 此外,当我尝试通过循环遍历工作表时,我无法访问除第一页外的工作表。 发生 PHP 错误
我在将 .xlsx 文件转换为 .csv 时遇到问题。当我尝试转换它时,会出现 csv 文件并激活 Text Wrap。问题是,我需要将该 csv 文件导入数据库,而当前格式不允许我这样做。我有一个问
这是我的电子表格中的内容: 12/04/2011 8:56:17 p.m. (xls dateserial = 40645.87242) 这是我用来提取日期并在 PHP 中转换为日期字符串的代码:
我正在使用 setReadDataOnly(true) 读取 XLS 文件。读取的对象将再次保存为新的 Excel 文件。不幸的是,某些单元格值计算不正确(这与使用小计公式的单元格的计算错误有关)。如
有谁知道用于将图案样式添加到单元格颜色的语法?我想添加一条细的反向斜条纹。 最佳答案 据我所知,这是不可能的。在 \Style\Fill.php ,这些似乎是唯一的选择,尽管可能会有更多选择的更新版本
我对拥有一些文件的PHPExcel的行为感到有些困惑。 这些文件包含大约。 3000行数据,但是根据PHPExcel,最后使用的行是65535。我尝试从文件中剪切几行并将其粘贴到新文件中,但无济于事。
我是一名优秀的程序员,十分优秀!