我正在尝试读取大约 20mb 的大 excel 文件以导入 mysql。
我已经在互联网上搜索并找到了“块阅读”解决方案,但是它不起作用......或者对我来说太慢了,我不知道为什么。
这就是我正在做的事情:
// .....
// into MyReadFilter class.. this is the most important function:
public function readCell($column, $row, $worksheetName = '') {
// Only read the rows and columns that were configured
if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
if (in_array($column,$this->_columns)) {
return true;
}
}
return false;
}
// .....
$filter = new MyReadFilter(1, 22000);
$chunkSize = 10;
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadFilter($filter);
$objReader->setReadDataOnly(false); //not sure if this should be true
for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {
echo "Reading";
$filterSubset->setRows($startRow, $chunkSize);
$objPHPExcel = $objReader->load($inputFileName); // this line takes like 40 seconds... for 10 rows?
echo "chunk done! ";
}
但是,在 for 内部,$objReader->load() 大约需要 40 秒,事实上,在 2 次循环之后,我遇到了内存错误。
如果我在 for 中取消设置 $objReader,我可以让它在 for... 中运行大约 20 次(尽管需要大约 10 分钟)和.. 内存错误。
我想知道如果我使用过滤器,为什么加载函数似乎读取了所有文件,过滤器策略似乎解析所有行并为所有不需要的行返回 false ......不可能中止读取或真的只阅读所需的吗?
我已经尝试了几个 FilterClass 和代码片段,但得到了相同的结果......