PHPExcel大文件块级别读取 速度快 减少占用资源
2018-06-22 05:12:57来源:未知 阅读 ()
/**
* 读取excel转换成数组
*
* @param string $excelFile 文件路径
* @param int $startRow 开始读取的行数
* @param int $endRow 结束读取的行数
* @return array
*/
private function readFromExcel($excelFile, $startRow = 1, $endRow = 100) {
include_once './Core/Common/PHPExcel.php';
include_once './Core/Common/PHPExcelReadFilter.php';
$excelType = PHPExcel_IOFactory::identify($excelFile);
$excelReader = \PHPExcel_IOFactory::createReader($excelType);
if(strtoupper($excelType) == 'CSV') {
$excelReader->setInputEncoding('GBK');
}
if ($startRow && $endRow) {
$excelFilter = new PHPExcelReadFilter();
$excelFilter->startRow = $startRow;
$excelFilter->endRow = $endRow;
$excelReader->setReadFilter($excelFilter);
}
$phpexcel = $excelReader->load($excelFile);
$activeSheet = $phpexcel->getActiveSheet();
$highestColumn = $activeSheet->getHighestColumn(); //最后列数所对应的字母,例如第1行就是A
$highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn); //总列数
$data = array();
for ($row = $startRow; $row <= $endRow; $row++) {
for ($col = 0; $col < $highestColumnIndex; $col++) {
$data[$row][] = (string) $activeSheet->getCellByColumnAndRow($col, $row)->getValue();
}
if(implode($data[$row], '') == '') {
unset($data[$row]);
}
}
return $data;
}
$rowSize = 200;
$startRow = 2;//从第二行开始读取
$endRow = $rowSize;
$excel_orders = array();
while (true) {
$excel_orders = $this->readFromExcel(dirname(dirname(HOME_PATH)).'/Upload/'.$newname, $startRow, $endRow);
if(empty($excel_orders)) {
break;
}
$startRow = $endRow + 1;
$endRow = $endRow + $rowSize;
}
/**
* 读取excel过滤器类 单独文件
*/
class PHPExcelReadFilter implements PHPExcel_Reader_IReadFilter {
public $startRow = 1;
public $endRow;
public function readCell($column, $row, $worksheetName = '') {
if (!$this->endRow) {
return true;
}
if ($row >= $this->startRow && $row <= $this->endRow) {
return true;
}
return false;
}
}
描述:用户导入订单数据,但用户导入8k左右的数据之后,PHP开始爆红了。
查阅部分资料得知,是由于PHPExcel的类读取,如果使用
$PHPExcel = $PHPReader->load($newfilename);
load的方式读取文件的话,是把文件中的全部内容读出并储存在内存中,再读取内容的话,就是直接从内存中读取,极其消耗资源。
而以上代码片段实现的效果就是我需要那块(n-m行)的内容,我只读去那部分的内容,不会加载整个文件。
最后,使用完变量,可以进行 $a = null; / unset($a); 进行释放资源。
祝工作顺利!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP实现打包下载文件的方法示例 2020-03-17
- PHPExcel如何读取Excel文件 2020-03-10
- PHP怎么读取超大文件 2020-03-10
- PHP文件管理之实现网盘及压缩包的功能操作 2020-02-20
- php判断文件上传图片格式的实例详解 2020-02-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash