阿里云主机

万维景盛

万维景盛官网
php程序怎样使用phpexcel库导入大量excel数据并避免内存溢出?

一、phpexcel导入数据的准备工作

PHPExcel是一款非常强大的PHP操作EXCEL库,使用PHPExcel可以帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。在使用phpexcel导入大量数据之前,需要先做好准备工作。

首先,需要安装phpexcel库。可以使用composer进行安装,也可以直接下载源码。

其次,需要准备好导入的数据。常见的数据格式有Excel、CSV等。在本文中,我们以Excel格式为例。

最后,确定数据存储的位置和格式。可以将数据导入到MySQL数据库中,也可以存储在其他存储介质中。

二、使用phpexcel导入Excel数据

使用phpexcel导入Excel数据非常简单。下面是一个使用phpexcel导入Excel数据的示例代码:

    $inputFileType = 'Excel2007'; //文件类型
    $inputFileName = './data/test.xlsx'; //文件路径
    $sheetname = 'sheet1'; //sheet名称
    $startRow = 2; //从第二行开始
    $highestRow = 6; //最高行数

    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); //加载文件
    $sheetData = $objPHPExcel->getSheetByName($sheetname)->toArray(null, true, true, true); //获取数据

    $data=[];
    for ($row = $startRow; $row <= $highestRow; ++$row) {
        $rowData = $sheetData[$row];
        $data[] = [
            'name' => $rowData['A'],
            'gender' => $rowData['B'],
            'age' => $rowData['C'],
        ];
    }

    //存储数据
    saveData($data);

代码解释:

首先,需要指定要导入的文件类型、文件路径、sheet名称、开始行数和最高行数。

然后,通过`load`方法加载文件,再通过`getSheetByName`方法获取指定sheet的数据。

使用循环遍历每行数据,并将数据存储在数组中。

最后,调用存储数据的函数,将数据存储起来。

三、使用phpexcel处理大量数据

使用phpexcel导入大量Excel数据时,需要注意内存使用情况。如果一次性将所有数据加载到内存中,可能会导致内存不足。

针对这个问题,我们可以使用分批处理数据的方式。具体步骤如下:

1. 分批读取Excel数据

    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
    $sheetData = $objPHPExcel->getSheetByName($sheetname);

    //计算最高行数和列数
    $highestRow = $sheetData->getHighestRow();
    $highestColumn = $sheetData->getHighestColumn();

    //按行读取数据
    $batchSize = 100; //每批处理100条数据
    $currentRow = 2; //从第2行开始
    while ($currentRow <= $highestRow) {
        $rowData = $sheetData->rangeToArray("A$currentRow:$highestColumn$currentRow", '', true, true, true); //读取一行数据
        $data = [
            'name' => $rowData[$currentRow]['A'],
            'gender' => $rowData[$currentRow]['B'],
            'age' => $rowData[$currentRow]['C'],
        ];

        saveData($data); //存储数据

        $currentRow++;
        if ($currentRow % $batchSize == 2) {
            //每处理100条数据,就清空内存
            $objPHPExcel->disconnectWorksheets();
            unset($objPHPExcel);
            $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
            $sheetData = $objPHPExcel->getSheetByName($sheetname);
        }
    }

代码解释:

首先,我们需要计算最高行数和最高列数,以便后面的数据读取。

在每批处理数据的循环中,使用`rangeToArray`方法读取一行数据,存储在数组中,然后调用存储数据的函数。

每处理完一批数据,就清空内存并重新加载Excel文件,以释放内存空间。

2. 存储数据

存储数据的方式可以是将数据直接存储到MySQL数据库中,也可以存储到文件中。下面是一个将数据存储到MySQL中的示例代码:

    function saveData($data) {
        $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');

        $stmt = $pdo->prepare("INSERT INTO users (name,gender,age) VALUES (:name,:gender,:age)");

        foreach ($data as $row) {
            $stmt->bindParam(':name', $row['name']);
            $stmt->bindParam(':gender', $row['gender']);
            $stmt->bindParam(':age', $row['age']);
            $stmt->execute();
        }
    }

代码解释:

首先,连接到MySQL数据库。

使用预处理语句,将数据插入到`users`表中。

使用循环遍历每行数据,将数据绑定到参数中,并执行SQL语句。

四、phpexcel导入数据时的debug错误处理

在导入大量数据时,可能会发生一些错误。常见的错误包括文件无法打开、文件格式错误、数据解析错误等。

针对这个问题,我们需要对每个步骤都进行错误处理。下面是一个增加错误处理的示例代码:

    $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
    if (!$objPHPExcel) {
        echo "导入失败:Excel文件无法打开";
        exit;
    }

    $sheetData = $objPHPExcel->getSheetByName($sheetname);
    if (!$sheetData) {
        echo "导入失败:sheet不存在";
        exit;
    }

    $highestRow = $sheetData->getHighestRow();
    $highestColumn = $sheetData->getHighestColumn();
    if ($highestRow < 2 || $highestColumn < 'C') {
        echo "导入失败:Excel格式不正确";
        exit;
    }

    $batchSize = 100;
    $currentRow = 2;
    while ($currentRow <= $highestRow) {
        $rowData = $sheetData->rangeToArray("A$currentRow:$highestColumn$currentRow", '', true, true, true);
        if (!$rowData) {
            echo "导入失败:读取数据失败";
            exit;
        }

        $data = [
            'name' => $rowData[$currentRow]['A'],
            'gender' => $rowData[$currentRow]['B'],
            'age' => $rowData[$currentRow]['C'],
        ];

        if (!$data) {
            echo "导入失败:解析数据失败";
            exit;
        }

        saveData($data);

        $currentRow++;
        if ($currentRow % $batchSize == 2) {
            $objPHPExcel->disconnectWorksheets();
            unset($objPHPExcel);
            $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
            if (!$objPHPExcel) {
                echo "导入失败:Excel文件无法打开";
                exit;
            }

            $sheetData = $objPHPExcel->getSheetByName($sheetname);
            if (!$sheetData) {
                echo "导入失败:sheet不存在";
                exit;
            }
        }
    }

代码解释:

在每个步骤后,使用if语句判断是否发生错误,并输出错误信息。如果出现错误,程序立即退出。

五、phpexcel导入大量数据的技术总结

本文介绍了使用phpexcel导入大量数据的方法,包括导入Excel数据、处理大量数据、错误处理等。希望本文能够帮助你快速上手phpexcel导入大量数据。

< 购物车 > 会员 客服 充值 工单
Top

客服热线

010-80253326

18610695105

客服QQ

请拨总机 010-80253326

咨询售后问题建议 提交工单