Laravel 中使用 PhpOffice 复杂样式的Excel 导出

本文介绍了在Laravel项目中利用laravel-excel和PhpOffice库来处理复杂样式的Excel导出。通过建立专门的导出类、设置全局样式、单元格操作、调整行列宽高等方式,实现符合特定模板要求的Excel文件生成。同时,文章提醒读者可以参考PhpSpreadsheet官方文档以获取更多API和参数设置。

安装

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可以参考

PhpSpreadsheet Documentation

以上只是示例,还有很多可以优化和提升的地方,视实际开发情况而定.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值