在Laravel中导入Excel文件,数据量太大,服务器经常500怎么办

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Laravel中导入Excel文件,数据量太大,服务器经常500怎么办相关的知识,希望对你有一定的参考价值。

参考技术A 解析excel之后,把每条的数据做成一个job丢到队列中处理,然后队列一条条异步处理就好了,不要做同步的处理,很容易就超时挂掉了,做成异步的,队列全部消费完毕了,发个回调通知就好了

在 Symfony 数据库中导入 Excel 数据

【中文标题】在 Symfony 数据库中导入 Excel 数据【英文标题】:Import Excel data in Symfony database 【发布时间】:2018-02-14 20:43:02 【问题描述】:

我正在做一个项目,我需要将 Excel 数据导入我的 Symfony 数据库。但问题是我不知道该怎么做。 我尝试使用 ExcelBundle。该项目是:用户必须使用表单按钮来发送他的 Excel 文件,我需要提取没有标题的数据来填充我的数据库。 你能帮帮我吗?

【问题讨论】:

how to use phpexcel to read data and insert into database?的可能重复 我已经检查过了,但我正在使用 Symfony。 不管你用什么fremework,都可以在Symfony项目中使用PHPExcel库并包含在服务中 【参考方案1】:

如果您可以将您的 excel 电子表格转换为 CSV 格式,那么有一个非常好的软件包可以处理它!

看看这个:http://csv.thephpleague.com/9.0/

这是他们的示例,展示了将表放入数据库是多么容易

<?php

use League\Csv\Reader;

//We are going to insert some data into the users table
$sth = $dbh->prepare(
    "INSERT INTO users (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"
);

$csv = Reader::createFromPath('/path/to/your/csv/file.csv')
    ->setHeaderOffset(0)
;

//by setting the header offset we index all records
//with the header record and remove it from the iteration

foreach ($csv as $record) 
    //Do not forget to validate your data before inserting it in your database
    $sth->bindValue(':firstname', $record['First Name'], PDO::PARAM_STR);
    $sth->bindValue(':lastname', $record['Last Name'], PDO::PARAM_STR);
    $sth->bindValue(':email', $record['E-mail'], PDO::PARAM_STR);
    $sth->execute();

试一试!

【讨论】:

我现在使用 Symfony 5,对 foreach 进行必要的更改,但非常完美。谢谢【参考方案2】:

您可以使用fgetcsv PHP 函数,例如here。

必须将 Excel 文件更改为 CSV 文件。

【讨论】:

【参考方案3】:

正如评论中提到的,您可以使用 PHPExcel。使用 composer 安装库

composer require phpoffice/phpexcel

典型的读者可能看起来像

class GameImportReaderExcel


    public function read($filename)
    
        // Tosses exception
        $reader = \PHPExcel_IOFactory::createReaderForFile($filename);

        // Need this otherwise dates and such are returned formatted
        /** @noinspection PhpUndefinedMethodInspection */
        $reader->setReadDataOnly(true);

        // Just grab all the rows
        $wb = $reader->load($filename);
        $ws = $wb->getSheet(0);
        $rows = $ws->toArray();

        foreach($rows as $row) 
            // this is where you do your database stuff
            $this->processRow($row);
        

从您的控制器调用阅读器类

public function (Request $request)

    $file = $request->files->has('file') ? $request->files->get('file') : null;
    if (!$file) 
        $errors[] = 'Missing File';
    

    $reader = new GameImportReaderExcel();
    $reader->read($file->getRealPath());

这应该让你开始。是的,您可以转换为 csv,但为什么要麻烦。阅读原始文件同样容易,并为您的用户节省了额外的步骤。

【讨论】:

此包已存档,请改用 PHPspreadsheet:https://github.com/PHPOffice/PhpSpreadsheet

以上是关于在Laravel中导入Excel文件,数据量太大,服务器经常500怎么办的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.8 中导入 excel 文件后无法管理文件数据

如何在 Laravel 中导入具有各种模型(和子数据/模型)的单个 excel 文件/工作表?

如何使用 laravel 5.7 和 vue JS 在 mysql 中导入 excel 文件

java大概1000W数据导出成excel有啥好的建议。(最好是插件,POI、JXL、FastExcel已试过,数据量太大,不

MySQL中导入excel表格,急!

Excel数据量太大,用VBA运算依然会耗时太久,运行很慢,该怎么办?