安装
PhpExcel 已停止维护,laravel-excel目前已更新至3.1版本,虽然很方便,但对于复杂样式的Excel导出还是没有太多办法.特别是需要导出给别的软件导入用的,必须要遵循对方的模板的情况…
laravel-excel中使用的是PhpOffice,可以说是PhpExcel的后续版本,提供了非常全面的样式操作. 在laravel下面方便的用户法就是直接先安装laravel-excel,然后使用PhpOffice\PhpSpreadsheet\Spreadsheet来解决复杂的导出.
composer require maatwebsite/excel
编程实现
组织
实际应用中,一般是不止导出一种格式的Excel文件的,所以建议建立一个Exports目录,所有导出类都放这里,每一个类负责一种格式导出.
<?php
namespace App\Exports;
class UserExport
{
protected $prarm;
protected $filename;
public function __construct($prarm,$filename)
{
$this->param = $param;
$this->filename = $filename;
}
public function outExcel()
{
//通过参数$param获取需要导出的数据
$data = User::where(' .... ')->get();
//TODO 开始各种样式编辑
}
}
样式
新建一个Spreadsheet 对象,操作excel都靠它了
$spreadsheet = new Spreadsheet();
- 全局指定的样式(比如字体,对齐,单元格格式)
$styles = [
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER,
],
'numberFormat' => [
'formatCode' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT,
],
];
$spreadsheet->getDefaultStyle()->getFont()->setName('宋体')->setSize(10);
$spreadsheet->getDefaultStyle()->applyFromArray($styles);
- 对单元格操作
$sheet = $spreadsheet->getActiveSheet();
- 不显示网络线
$sheet->setShowGridlines(false);
- 设置列宽
//设置A列为20宽
$sheet->getColumnDimension('A')->setWidth(20);
- 设置行高
//设置第22行的行高为166
$sheet->getRowDimension('12')->setRowHeight(166);
- 合并单元格
//从B8到C9合并
$sheet->mergeCells('B8:C9');
- 拆分
$sheet->unmergeCells('B10:E14');
- 设置单元格内容
$sheet->setCellValue('A2', '姓名');
- 换行
$sheet->setCellValue('A1', '这是导入文件模板\n请不要改动格式 \n 注:日期格式: yyyy-mm-dd');
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);
- 设置字体和大小
$sheet->getStyle('A1')->getFont()->setSize(14)->setBold(true);
- 写入数据
$i=2;
foreach ($res as $data) {
$i++;
$sheet->setCellValue('A' . $i, $data['name']);
$sheet->setCellValue('B' . $i, $data['last_name_p']);
$sheet->setCellValue('C' . $i, $data['first_name_p']);
$sheet->setCellValue('D' . $i, $data['gender']);
...
}
- 设置边框
$styles = [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
'color' => ['argb' => '000000'],
],
],
];
$sheet->getStyle('A3:D' . $i)->applyFromArray($styles);
- 设置字体颜色
$sheet->getStyle('B14')->applyFromArray([
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT,
],
])->getFont()->getColor()->setRGB('F57C3B');
$sheet->getStyle('C8')->getFont()->setBold(true)
->setColor(Color::indexedColor(3));
- 设置背景色
$sheet->getStyle('B7:G12')->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('CDFECE');
- 保存文件
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $this->filename . '"');
header('Cache-Control: max-age=0');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('php://output');
return true;
调用
// blade 中的a标签
<a href="/users/export/1" target="_blank">导出用户信息</a>
Route::get('/users/export/{param}', function ($param) {
$obj = new UserExport($param,'用户列表.xls')
return $obj->outExcel();
});
总结
PhpOffice中的api非常的多,写法也很灵活,参数方面和其它api可以参考
以上只是示例,还有很多可以优化和提升的地方,视实际开发情况而定.
本文介绍了在Laravel项目中利用laravel-excel和PhpOffice库来处理复杂样式的Excel导出。通过建立专门的导出类、设置全局样式、单元格操作、调整行列宽高等方式,实现符合特定模板要求的Excel文件生成。同时,文章提醒读者可以参考PhpSpreadsheet官方文档以获取更多API和参数设置。
1万+

被折叠的 条评论
为什么被折叠?



