- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道 How to read large worksheets from large Excel files (27MB+) with PHPExcel?我已经尝试实现该问题中讨论的分 block 阅读,但是我仍然遇到 OOM 错误。文件本身不到 5Mb,有 9000 多行(是的,超过 9000 行!),范围从 A 到 V。
我不想让用户在上传和处理它之前对这个文件进行任何编辑,因为目前这都是一个手动过程,我想用一个自动化的过程来完全替换它。该文件为 xls 格式,通过 PHPExcel 识别为 Excel5。
我的 PHP 内存限制当前设置为 128M,在 Ubuntu Server 上运行。
无论我设置什么 block 大小,我最终都会 OOM'ing。对于较大的 block 大小,如果我将 block 大小设置为 200,它实际上运行得更好(因为我可以管理大约 7000 行),当设置为 1 时,它 OOM 在第 370 行左右。所以我相信正在存储“某些东西”,或在 block 读取的每次迭代中加载到内存中,然后不再丢弃,最终导致 OOM,但我看不到发生这种情况的位置。
我是一个非常业余的程序员,这只是我在工作中作为托管服务角色所做的事情,试图让我们的生活更轻松。
这段代码的重点是读取 excel 文件,过滤掉“废话”,然后将其保存为 CSV(现在我只是将其转储到屏幕而不是 CSV)。按照事情的发展速度,我很想通过 php 脚本调用 excel2csv,然后尝试清理 CSV……但是当我可能相当接近解决方案时,这感觉就像放弃了。
<?php
error_reporting(E_ALL);
set_time_limit(0);
date_default_timezone_set('Europe/London');
require_once 'Classes/PHPExcel/IOFactory.php';
class chunkReadFilter implements PHPExcel_Reader_IReadFilter
{
private $_startRow = 0;
private $_endRow = 0;
private $_columns = array();
/** Set the list of rows that we want to read */
public function setRows($startRow, $chunkSize, $columns) {
$this->_startRow = $startRow;
$this->_endRow = $startRow + $chunkSize;
$this->_columns = $columns;
}
public function readCell($column, $row, $worksheetName = '') {
// Only read the heading row, and the rows that are configured in $this->_startRow$
if ($row >= $this->_startRow && $row < $this->_endRow) {
if(in_array($column,$this->_columns)) {
return true;
}
}
return false;
}
}
$target_dir = "uploads/";
$file_name = $_POST["file_name"];
$full_path = $target_dir . $file_name;
echo "Processing ". $file_name . '; <br>';
ob_flush();
flush();
/** /** As files maybe large in memory, use a temp file to handle them
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
**/
$inputFileName = $full_path;
echo 'Excel reader started<br/>';
/** First we should get the type of file **/
$filetype = PHPExcel_IOFactory::identify($inputFileName);
echo 'File of type: ' . $filetype . ' found<br/>';
/** Load $inputFileName to a PHPExcel Object - https://github.com/PHPOffice/PHPExcel/blob/develop/$
/** Define how many rows we want to read for each "chunk" **/
$chunkSize = 1;
/** Create a new Instance of our Read Filter **/
$chunkFilter = new chunkReadFilter();
$objReader = PHPExcel_IOFactory::createReader($filetype);
/** 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 <= 65000; $startRow += $chunkSize) {
$endRow = $startRow+$chunkSize-1;
echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ',$startR$
/** Tell the Read Filter, the limits on which rows we want to read this iteration **/
$chunkFilter->setRows($startRow,$chunkSize,range('A','T'));
/** 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);
$sheetData = $objPHPExcel->getActiveSheet()->rangeToArray("A$startRow:T$endRow");
var_dump($sheetData);
// Clear the variable to not go over memory!
$objPHPExcel->disconnectWorksheets();
unset ($sheetData);
unset ($objPHPExcel);
ob_flush();
flush();
echo '<br /><br />';
}
/** This loads the entire file, crashing with OOM
try {
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
echo 'loaded sheet into memory<br>';
} catch(PHPExcel_Reader_Exception $e) {
die('Error loading file: '.$e->getMessage());
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');
echo 'Saving sheet as CSV<br>';
$objWriter->setSheetIndex(0);
$objWriter->save('./uploads/'.$file_name.'.csv');
echo 'Processed 1 sheet';
ob_flush();
flush();
**/
echo "<body><table>\n\n";
/**
$f = fopen($file_name, "r");
while (($line = fgetcsv($f)) !== false) {
echo "<tr>";
foreach ($line as $cell) {
echo "<td>" . htmlspecialchars($cell) . "</td>";
}
echo "</tr>\n";
}
fclose($f);
**/
echo "\n</table></body></html>";
?>
[Fri Mar 31 15:35:27.982697 2017] [:error] [pid 1059] [client 10.0.2.2:53866] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 45056 bytes) in /var/www/html/Classes/PHPExcel/Shared/OLERead.php on line 93, referer: http://localhost:8080/upload.php
最佳答案
unset ($objPHPExcel);
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
关于php - 使用 PHPExcel 处理 .xls 获取 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43142945/
我已经完成了我的工作,直到在 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。我尝试从文件中剪切几行并将其粘贴到新文件中,但无济于事。
我是一名优秀的程序员,十分优秀!