Laravel Excel 导出csv文件乱码
背景:Laravel Excel 导出 csv 文件时,会出现乱码,但改为 xlsx 格式,则正常。但凡乱码,都跟bom有或多或少的关系
解决方法:修改配置文件 config/excel.php, 将 use_bom 设置为 true,这样导出的CSV文件就有BOM头了
// config / excel.php
'csv' => [
/*
|--------------------------------------------------------------------------
| setUseBom
|--------------------------------------------------------------------------
*/
//'use_bom' => false
'use_bom' => true
],
如若找不到 config/excel.php 的配置文件,可执行以下命令生成
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
Laravel Excel 安装
- 首先在Laravel项目根目录下使用Composer安装依赖:
composer require "maatwebsite/excel:~2.1.0"
- 在config/app.php中注册服务提供者到providers数组:
Maatwebsite\Excel\ExcelServiceProvider::class,
- 在config/app.php中注册门面到aliases数组:
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
- 建议你生成Laravel Excel的配置文件,使用如下命令:
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
然后你会发现在config目录下有一个excel.php文件
你可以打开看一下大概的配置项,主要就是缓存,表单,和导入,导出的一些设置。
Laravel Excel 实现 Excel/CSV 文件导入导出功能
- 导出功能
// 在controller使用
use Excel;
/**
* 导出
*/
public function export_test(Request $request)
{
$result = $this->returnList($request);
//print_r($result['data']);exit;
if (isset($result['data']) && !empty($result['data'])) {
// 文件名
$title = '导出数据_' . date('YmdHis');
// 获取导出需要的字段名
$field = $this->get_header($request, 'value');
// 重组数据
// [从数据库搜索的结果(有冗余或缺失字段且顺序不当),按字段名排序,并去除冗余及填充缺失]
$list = re_com_array($field, $result['data']);
// 获取表头
$header = $this->get_header($request, 'label');
$data = array_merge(array($header), $list);
Excel::create($title, function ($excel) use ($data){
$excel->sheet('score', function ($sheet) use ($data){
$sheet->rows($data);
});
})->export('csv'); // csv || xlsx
// 如需上传到服务器,加入 store 方法即可
/*Excel::create($title, function ($excel) use ($data){
$excel->sheet('score', function ($sheet) use ($data){
$sheet->rows($data);
});
})->store('csv')->export('csv');*/
}
return parent::fail(ErrorCode::NO_DATA, '暂无相关数据');
}
// 在 common/functions.php 中
if (!function_exists('re_com_array'))
{
/**
* 数据根据字段排序,去除多余字段,补充缺失字段
* 用于excel导出
* @param array $field 字段数组
* @param array $arr 数据
* @return array
* @author Edmund
*/
function re_com_array($field, $arr)
{
$data = [];
if(!empty($field))
foreach ($arr as $key => $value) {
$temp = [];
foreach ($field as $row) {
$temp[] = isset($value[$row]) ? $value[$row] : '-';
}
$data[] = $temp;
}
return $data;
}
}
导出的数据格式,如下
- 导入功能
/**
*
* Excel导入
*/
public function import(){
$filePath = 'storage/exports/'.iconv('UTF-8', 'GBK', '用户信息').'.xls';
Excel::load($filePath, function($reader) {
$data = $reader->all();
});
}