PHPExcel大文件导入数据库

本文探讨了在处理大量数据的Excel文件时遇到的内存问题。通过使用PhpSpreadsheet库读取Excel文件导致内存溢出,而转换为TXT文件并逐行处理则能有效解决这一问题。提供的代码示例展示了如何读取TXT文件并以CSV格式导出,同时通过分块写入来避免内存过载。此外,还提供了大文件下载的处理方式,确保了大文件的顺利下载。
摘要由CSDN通过智能技术生成
PhpOffice\PhpSpreadsheet导入Excel保存数据库,数据量在几十万,上百万后,读取excel文件内容内存会严重不足,本地测试50M的Excel数据读取,16G内存会立马跑满。
$spreadsheet = IOFactory::load($inputFileName);
$sheetData = $spreadsheet->getActiveSheet()->toArray('', true, true, true);

excel另存为txt文件处理,内存不受影响

$file = fopen($path, "r");
$data = [];

while(!feof($file)) {
    $tmp = fgets($file);
    if($tmp !== false) {
        $tmp = trim(mb_convert_encoding($tmp, "UTF-8", "GBK"));
        //$data[]= trim(iconv('GBK', 'UTF-8', $tmp));//fgets()函数从文件指针中读取一行
        if(!empty($tmp)) {
            $data[] = explode("\t", $tmp);
        }
    }
}
fclose($file);
return $data;

        header('Content-Type: application/vnd.ms-execl');
        header('Content-Disposition: attachment;filename="rter.csv"');

        $fp = fopen('php://output', 'a');
        foreach ($data as $k => $datum){
            foreach($datum as $key => $item) {
                $datum[$key] = iconv('UTF-8', 'GBK', $item);
            }
            fputcsv($fp, $datum);

            if($k/10000 == 0){
                ob_flush();
                flush();
            }
        }
        //关闭句柄
        fclose($fp);
        ob_flush();
        flush();
        exit;


       header('content-type:application/octet-stream');
       header('Accept-Ranges:bytes');
       $filesize = filesize($file);
       //告诉浏览器返回的文件大小
       header('Accept-Length:'.$filesize);
       //告诉浏览器文件作为附件处理并且设定最终下载完成的文件名称
       header('content-disposition:attachment;filename=fdgd.csv');
       //针对大文件,规定每次读取文件的字节数为4096字节,直接输出数据
       $read_buffer = 4096;
       $handle = fopen($file, 'rb');
       //总的缓冲的字节数
       $sum_buffer=0;
       //只要没到文件尾,就一直读取
       while(!feof($handle) && $sum_buffer < $filesize) {
          echo fread($handle, $read_buffer);
          $sum_buffer+=$read_buffer;
       }
       //关闭句柄
       fclose($handle);
       exit;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值