我正在尝试遍历一个3mb的Excel文档,以获取我将必须插入数据库的所有数据。我正在使用的工作表有6500行,但将来可能会有所不同。我注意到即使我使用推荐的内存保存技术,它仍然会跳过
$reader = PHPExcel_IOFactory::createReaderForFile($file_path);
$reader->setReadDataOnly(true);
//$sheets = $this->getWorksheetNames($file['tmp_name'], 0);
$reader->setLoadSheetsOnly('spreadsheetname');
$chunkFilter = new IPO_Reader();
$reader->setReadFilter($chunkFilter);
$highestRow = 10000; //$this->objWorksheet->getHighestRow();
$chunkSize = 1;
$highestColumn = "Y";
for ($startRow = 2; $startRow <= $highestRow; $startRow += $chunkSize)
{
$chunkFilter->setRows($startRow, $chunkSize);
$objPHPExcel = $reader->load($file_path);
for($row = $startRow ; $row <= $startRow + $chunkSize; $row++)
{
$this->read_row = $objPHPExcel->getActiveSheet()->rangeToArray('A'.$row.':'.$highestColumn.$row, null, true, true, true);
$this->read_row = end($this->read_row);
foreach($this->read_row as $column => $value)
{
$db_column_name = $this->_getDbColumnMap($column);
if(!empty($db_column_name))
{
$this->new_data_row[$db_column_name] = $this->_getRowData($value, $column);
}
}
$this->read_row = null;
$this->new_data_row['date_uploaded'] = date("Y-m-d H:i:s");
$this->new_data_row['source_file_name'] = $file_name;
$ipo_row = new Model_UploadData_IPO();
$ipo_row->create($this->new_data_row);
$this->new_data_row = null;
unset($ipo_row);
gc_collect_cycles();
}
$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);
gc_collect_cycles();
当我在取消设置objPHPExcel之前测试内存使用量之后,没有内存增益,我真的很困惑,因为拆分成块似乎不允许我在每个块之后清除内存,并且使用率逐渐上升,并且限制设置为250MB,它只允许我添加~500条记录
答案 0 :(得分:3)
PHP excel库is known to have these memory issues,我也遇到了问题。对我有用的是这个建议(从上面的链接,尝试它,有很好的建议如何减少内存使用):
$objReader = new PHPExcel_Reader_Excel5();
$objReader->setReadDataOnly(true); /* this */
但是无论如何内存要求都很大,因为它们为每个单元分配了大量内存(用于格式化等,即使不需要)。在发布新版本的库之前,我担心我们无能为力。
答案 1 :(得分:0)
好的,大家都知道trwtf是Excel,所以我想问你是否可以将它转换为CSV?
我在PHP中拥有自己的CSV表功能,用于导入非常大的文件,CSV往往处理起来要轻得多,而且更容易出现随机库问题。
如果你确实需要这个一次性过程,或者可以很容易地从XLS到CSV,请这样做,因为它会让你的生活更轻松(因为每次你坚持使用更简单,更标准的替代方案;))。
对于一个能够翻译恶劣且可怕的XLS格式的API,您可以使用以下o / s转换器之一 - 我每次都推荐python但是嘿,您的选择:
http://www.oooninja.com/2008/02/batch-command-line-file-conversion-with.html
http://code.google.com/p/jodconverter/wiki/FAQ
基本上这个想法是一样的,你使用外部工具来获得可用的文件格式,然后你去那里。
我不认为我的csvtotable.php脚本在这里,但它很容易复制,你只需要一些基本的工具,比如csvtoarray,然后是arraytoinsertstatements。
GL;)