Laravel 版本: Laravel5.8
Excel 版本: [maatwebsite/excel v2.1.*] [maatwebsite/excel 3.1]
Laravel-Excel
包首先,确保你已经安装了
Laravel-Excel
包,可以通过Composer
安装
composer require maatwebsite/excel
提示
1. 根据实际操作,发现,对于下单日期的写入,需计算从 1900-01-01到目标日期的天数
2. 但是,还需多添加两天(容错处理)
3. 并且,无需手动 在天数后面拼接一个"\t"
//指定下单日期,需要计算从 1900-01-01到目标日期的天数
...
//举例
$order_create_date = '2024-07-23';
$excelListData['下单日期'] = get_days_since1900($order_create_date);
$this->saveExcel($title, $excelListData,'订单列表',['W' => 'yyyy-mm-dd']);
/**
* @notes:保存Excel文件
* @param string $title 标题
* @param array $cellData 数据
* @param string $sheetName 工作表名
* @param array $columnFormat 列格式
* @author: zhanghj
* @Time: 2024/8/6 9:38
*/
public function saveExcel($title = 'title', $cellData = [], $sheetName = 'sheet1',$columnFormat = [])
{
Excel::create($title, function ($excel) use ($cellData, $sheetName,$columnFormat) {
$excel->sheet($sheetName, function ($sheet) use ($cellData,$columnFormat) {
if ($columnFormat){
$sheet->setColumnFormat($columnFormat);
}
$sheet->rows($cellData);
});
})->store('xlsx'); // 文件默认保存到storage/exports目录下
}
/**
* @notes:获取 从1900-01-01的天数
* @param string $curr_date 目标日期
* @return false|int 测试发现,计算所得的天数需加2,才能满足当前应用
* @throws Exception
* @author: zhanghj
* @Time: 2024/8/6 10:10
*/
function get_days_since1900($curr_date = '') {
$date = new \DateTime($curr_date);
$date1900 = new \DateTime('1900-01-01');
$interval = $date1900->diff($date)->days;
return intval($interval+2);
}
<?php
namespace App\Http\Model;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use PhpOffice\PhpSpreadsheet\Shared\Date;
/**
* Excel 导出类
* Class UserExport
* @package App\Http\Model
*/
class UserExport implements FromCollection,WithMapping,WithHeadings,WithColumnFormatting
{
use Exportable;
public function collection()
{
return (new User())->getExportData();
}
public function map($row): array
{
$dateTime = new \DateTime($row->reg_date);
// 数据映射逻辑
return [
$row->id,
$row->nick_name,
Date::dateTimeToExcel($dateTime),// 确保这里是日期格式
$row->auth_tel,
// ...其他数据映射
];
}
public function headings(): array
{
// 表头
return [
'ID',
'昵称',
'注册日期',
'手机号码'
// ...其他表头
];
}
public function columnFormats(): array
{
// 设置日期格式的筛选
return [
'C' => NumberFormat::FORMAT_DATE_YYYYMMDD,
// ...其他格式
];
}
}
/**
* @notes:获取导出的数据
* @return array 注意返回的数据为 Collection 集合形式
* @author: zhanghj
* @Time: 2024/8/6 17:14
*/
public function getExportData(){
$list = $this->select('id','nick_name','reg_time','auth_tel')->limit(7)->get();
foreach ($list as $key => $value){
$dateString = date("Y-m-d",$value['reg_time']??0);
$list[$key]['reg_date'] = $dateString;
}
return $list??[];
}
class TestController extends Controller
{
public function index()
{
$filePath = 'exports/users_'.time().'.xlsx';
//将文件存储到目录 “storage\app\exports” 下
$export = Excel::store(new UserExport(2018),$filePath);
//return Excel::download(new UserExport,$filePath); //如果直接浏览器下载文件,需注意路径不能有 /
return 'Test - MT';
}
}