需求:一次性读取几万条excel数据并保存到数据库中
问题:当excel超过五万条时内存溢出,程序直接停止
解决办法:将表格切割成多个csv文件,每次只读取一部分数据,大大缓解服务器内存压力,缺点是处理时间会变长,适用于对时间要求不是很高的场景。
建议:小于两万五千条时phpspreadsheet直接读取,大于时采取分割法,下边只附分割法的代码
/**
* 预读过滤类
* @author wangyelou
* @date 2018-07-30
*/
class MyAheadreadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
{
public $record = array();
private $lastRow = '';
public function readCell($column, $row, $worksheetName = '')
{
if (isset($this->record[$worksheetName]) ) {
if ($this->lastRow != $row) {
$this->record[$worksheetName] ++;
$this->lastRow = $row;
}
} else {
$this->record[$worksheetName] = 1;
$this->lastRow = $row;
}
return false;
}
}
/**
* 解析过滤类
* @author wangyelou
* @date 2018-07-30
*/
class MyreadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
{
public $startRow;
public $endRow;
public $worksheetName;
public function readCell($column, $row, $worksheetName = '')
{
if ($worksheetName == $this->worksheetName && $row >= ($this->startRow+1) && $row <= ($this->endRo