学习需要耐心&&时间,更重要的是你要学会坚持!
当前位置:首页 > PHP领域 > 正文

PHP如何快速导出 百万级数据 到EXCEL,给个思路和具体实例

2023-04-13 PHP领域 php自学中心

最新版phpstorm,在这里获取全家桶账号,支持版本升级
链接:https://web.52shizhan.cn/activity/xqt8ly

导出百万级数据到Excel需要考虑到以下几个方面:


1 数据处理速度:对于大规模数据,需要考虑处理数据的速度,避免造成服务器负载过高或者请求超时等问题。
2 内存消耗:如果一次性将所有数据都读入内存,可能会造成内存消耗过高,导致服务器崩溃,因此需要使用流式输出的方式进行数据导出。
3 Excel文件格式:Excel支持多种文件格式,其中常用的有xls和xlsx格式,建议使用xlsx格式,因为它的容量更大,同时支持更多的格式。
针对以上问题,可以采用以下步骤来实现快速导出百万级数据到Excel:
将需要导出的数据按照一定规则进行分批读取,并使用PHPExcel库进行流式输出到Excel文件中。
采用多线程技术来提高数据处理速度,可以使用pcntl_fork()函数创建子进程进行数据处理,加快处理速度。

下面是一份示例代码,用于将百万级数据分批读取,并使用PHPExcel库进行流式输出到Excel文件中:


 
<?php

require_once 'PHPExcel.php';

// 建立Excel对象
$objPHPExcel = new PHPExcel();

// 设置文档属性
$objPHPExcel->getProperties()->setCreator("Your name")
                             ->setLastModifiedBy("Your name")
                             ->setTitle("Title")
                             ->setSubject("Subject")
                             ->setDescription("Description")
                             ->setKeywords("Keywords")
                             ->setCategory("Category");

// 打开输出缓冲区,减少内存消耗
ob_start();

// 查询百万级数据,每次读取10000条
$total = 1000000;
$step = 10000;
for ($i = 0; $i < $total; $i += $step) {
    $data = getDataFromDatabase($i, $step);

    // 设置单元格值
    $row = $i / $step + 1;
    $objPHPExcel->setActiveSheetIndex(0)
                ->setCellValue('A' . $row, $data['col1'])
                ->setCellValue('B' . $row, $data['col2'])
                ->setCellValue('C' . $row, $data['col3'])
                ->setCellValue('D' . $row, $data['col4']);

    // 每写入1000行就刷新输出缓冲区,减少内存消耗
    if ($row % 1000 == 0) {
        ob_flush();
        flush();
    }
}

// 导出Excel文件
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="export.xlsx"');
header('Cache-Control: max-age=0');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');

// 关闭输出缓冲区
ob_end_flush();

// 从数据库中读取数据
function getDataFromDatabase($start, $length) {
    // 从数据库中查询数据
    $data = array();
    // ...
    return $data;
}

需要注意的是,在导出大量数据时,可能会出现超时或内存不足的问题,可以通过增加 PHP 的运行时间和内存限制,或者采用分页查询的方式逐步输出数据。




 

以上是本文的全部内容,希望对大家学习有帮助,也希望大家多多支持 磊丰的技术博客 感谢阅读!

站长磊丰学长
男,文化程度不高,性格有点犯二,爱好学习与分享,闲着没事喜欢研究各种代码,写写文章,潜水技术宅。
关注公众号:PHP自学中心
关注公众号:Go语言学习圈
学习与交流:程序员技术微信群

网站工具箱