在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已试过,数据量太大,不