13
2025
03
21:43:34

使用Spout读取大体积Excel文件

目录  
1 Spout简介
2 安装方法
3 DEMO
4 另一种办法

Spout简介

使用phpExcel在读取体积较大的excel文件时,会提示Fatal error: Allowed memory size of的错误,提示内存不够。可以使用Spout来解决。

Spout 是一个 PHP 库,用于以快速且可扩展的方式读取和写入电子表格文件(CSV、XLSX 和 ODS)。它能够处理非常大的文件,同时保持非常低的内存使用率(小于 3MB)。
官方网站:
https://opensource.box.com/spout/
github地址:
https://github.com/box/spout

安装方法

通过composer或手动引入。
通过composer:

composer require box/spout

手动引入:

require_once '[PATH/TO]/src/Spout/Autoloader/autoload.php';

DEMO

  1. use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;

  2. $filePath = '/path/to/file.xlsx';

  3. $reader = ReaderEntityFactory::createReaderFromFile($filePath);

  4. $reader->open($filePath);

  5. foreach ($reader->getSheetIterator() as $sheet) {

  6.    //只取第一个sheet

  7.    if($sheet->getIndex()>0) continue;

  8.    foreach ($sheet->getRowIterator() as $row) {

  9.        // do stuff with the row

  10.        $cells = $row->getCells();

  11.        $tmp = [];

  12.        foreach ($cells as $k=>$cell){

  13.            $value = $cell->getValue();

  14.            if(strlen($value)>0) $tmp[$k+1] = $value;

  15.        }

  16.        var_dump($tmp);die;

  17.    }

  18. }

  19. $reader->close();


另一种办法

将xlsx文件转为csv文件,使用PHP的原生函数如fgetcsv()来读取,这通常是处理非常大的数据集的最快方法。使用 fgetcsv() 函数是读取大型 CSV 文件的一个非常高效的方法,因为它允许你逐行处理文件,而不需要一次性将整个文件加载到内存中。

以下是一个使用 fgetcsv() 读取大型 CSV 文件的例子:


  1. <?php

  2. function readLargeCsv($filename, $delimiter = ',') {

  3.    // 检查文件是否存在

  4.    if (!file_exists($filename) || !is_readable($filename)) {

  5.        return false;

  6.    }

  7.    // 打开文件

  8.    $handle = fopen($filename, 'r');

  9.    if ($handle === false) {

  10.        return false;

  11.    }

  12.    // 设置一个计数器来跟踪处理的行数

  13.    $row = 0;

  14.    // 读取文件头(假设第一行是列名)

  15.    $header = fgetcsv($handle, 0, $delimiter);

  16.    if ($header === false) {

  17.        fclose($handle);

  18.        return false;

  19.    }

  20.    $row++;

  21.    // 逐行读取文件内容

  22.    while (($data = fgetcsv($handle, 0, $delimiter)) !== false) {

  23.        $row++;

  24.        // 使用 $header 和 $data 创建关联数组

  25.        $rowData = array_combine($header, $data);

  26.        // 在这里处理每一行的数据

  27.        // 例如,你可以将数据插入数据库,或者进行一些计算

  28.        processRow($rowData, $row);

  29.        // 可选:每处理 1000 行后,输出一个进度指示

  30.        if ($row % 1000 === 0) {

  31.            echo "Processed $row rows\n";

  32.            // 可选:刷新输出缓冲

  33.            flush();

  34.            ob_flush();

  35.        }

  36.    }

  37.    // 关闭文件

  38.    fclose($handle);

  39.    return $row; // 返回处理的总行数

  40. }

  41. function processRow($rowData, $rowNumber) {

  42.    // 在这里处理每一行的数据

  43.    // 这只是一个示例,你需要根据你的具体需求来实现这个函数

  44.    echo "Processing row $rowNumber: " . json_encode($rowData) . "\n";

  45. }

  46. // 使用示例

  47. $filename = 'path/to/your/large_file.csv';

  48. $totalRows = readLargeCsv($filename);

  49. if ($totalRows === false) {

  50.    echo "An error occurred while reading the file.\n";

  51. } else {

  52.    echo "Total rows processed: $totalRows\n";

  53. }




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://sg.hqyman.cn/post/9591.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: