【面向初学者】Laravel:尝试导入 CSV 文件!

大家好!我是系统开发部的福井!
这次我想为大家介绍一下如何在 Laravel 中使用 Goodby CSV 库导入 CSV 文件!
*这是我的第一篇博客文章,所以我怀着无比激动的心情写下它……!
顺便一提,这次我开发的是一个基于 Homestead 环境的 Laravel 项目。
环境配置如下:
PHP 7.4.5
、Laravel 7.14.1
、MySQL 5.7
目录
• 准备工作
• 安装 Goodby CSV 库
• 创建 CSV 导入方法
• 功能测试
• 总结
• 附加内容
提前准备
这次,我将创建一个简单的表格,只记录书籍的“标题”和“价格”。
| 表名 | 图书 |
|---|---|
| 柱子 | ID、标题、价格 |
Schema::create('books', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->integer('price'); $table->timestamps(); });
这是我准备的视图。

(是的,很简单!抱歉!)
路由、CSV 导入方法和模型都已就绪,下一步是安装 Goodby CSV 库。
安装 Goodby CSV 库
运行以下命令安装 Goodby CSV 库:
composer 需要 goodbye/csv
请等待其完成。

安装完成后,请按照 Goodby CSV GitHub 仓库中 README 文件的说明,将以下 use 声明添加到相应的控制器中。
(Goodby CSV GitHub)
使用 Goodby\CSV\Import\Standard\LexerConfig;使用 Goodby\CSV\Import\Standard\Lexer;使用 Goodby\CSV\Import\Standard\Interpreter;
创建 CSV 导入方法
CSV导入部分的代码如下。
在保存到数据库之前,我配置了Goodbye CSV并执行了字符集转换。
public function importCsv(Request $request) { // 保存 CSV 文件 $tmpName = mt_rand().".".$request->file('csv')->guessExtension(); // 临时文件名 $request->file('csv')->move(public_path()."/csv/tmp",$tmpName); $tmpPath = public_path()."/csv/tmp/".$tmpName; // 移除 CSV 配置设置 $config = new LexerConfig(); $interpreter = new Interpreter(); $lexer = new Lexer($config); // 将字符集转换为 UTF-8,忽略 CSV 标题行 $config->setToCharset("UTF-8"); $config->setFromCharset("sjis-win"); $config->setIgnoreHeaderLine(true); $dataList = []; // 将值赋给 $dataList 数组作为新的观察者 $interpreter->addObserver(function (array $row) use (&$dataList){ // 获取每一列的数据 $dataList[] = $row; }); // 解析 CSV 数据 $lexer->parse($tmpPath, $interpreter); // 删除临时文件 unlink($tmpPath); // 注册过程 $count = 0; foreach($dataList as $row){ Book::insert(['title' => $row[0], 'price' => $row[1]]); $count++; } return redirect()->action('ItemsController@book')->with('flash_message', $count . '书籍已注册!'); }
操作检查
这次,我将把以下三行数据保存为 CSV 文件。(我热爱音乐。)

我选中了 CSV 文件并点击了上传……

看起来上传过程很成功,我被重定向到了其他页面。现在
我要检查一下数据库。

我们已确认以 CSV 格式写入的数据已保存到数据库中!
概括
我很高兴能够成功地将写入 CSV 文件的信息保存到数据库中。
开始之前我还有些忐忑,但后来发现整个过程非常便捷,因为库的安装和注册过程很快就能完成。
实际上,验证检查和异常处理是必不可少的,但我希望仅在需要时才使用这些功能,尤其是在需要注册大量数据的时候。
奖金
■ 下载 CSV 模板文件
通过添加以下方法,我能够下载 CSV 模板文件。
public function downloadCsv(): object { // 准备输出数据 $csvHeader = ["Title", "Price"]; // 设置输出数据以逗号分隔 $downloadData = implode(',', $csvHeader); // 兼容 Excel $downloadData = mb_convert_encoding($downloadData, "SJIS", "UTF-8"); // 创建一个临时 CSV 文件 if (! file_exists(storage_path('csv'))) { $bool = mkdir(storage_path('csv')); // 如果目录创建失败,则抛出异常 if (! $bool) { throw new \Exception("无法创建目录。"); } } $name = 'book.csv'; $pathToFile = storage_path('csv/' . $name); // 创建 CSV 文件 if (! file_put_contents($pathToFile, $downloadData)) { throw new \Exception("文件写入失败。"); } // 下载响应 return response()->download($pathToFile, $name)->deleteFileAfterSend(true); }
■ 编辑 CSV 文件(VS Code 插件)
我在这个项目中添加了这个功能。它让在 VS Code 中查看 CSV 文件变得更加容易。

最后
我已推出“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、构建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
今天就到这里啦!
感谢您阅读到最后!
1
