【Maatwebsite 3.1 导出合并单元格、设置表格边框、字体大小颜色】

废话不多说,直接看代码

创建一个导出类,里面实现设置需要的一些方法

<?php
namespace App\Exports;

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Style\Border;

class InvoiceStatisticsExports implements FromCollection,WithHeadings,WithEvents
{

    protected $data;
    protected $headings;
    protected $columnWidth = [];//设置列宽       key:列  value:宽
    protected $rowHeight = [];  //设置行高       key:行  value:高
    protected $mergeCells = []; //合并单元格    value:A1:K8
    protected $font = [];       //设置字体       key:A1:K8  value:Arial
    protected $fontSize = [];       //设置字体大小       key:A1:K8  value:11
    protected $bold = [];       //设置粗体       key:A1:K8  value:true
    protected $background = []; //设置背景颜色    key:A1:K8  value:#F0F0F0F
    protected $vertical = [];   //设置定位       key:A1:K8  value:center
    protected $sheetName; //sheet title
    protected $borders = []; //设置边框颜色  key:A1:K8  value:#000000
    protected $fontColor = []; // 设置字体颜色
    //设置页面属性时如果无效   更改excel格式尝试即可
    //构造函数传值
    public function __construct($data, $headings,$sheetName)
    {
        $this->data = $data;
        $this->headings = $headings;
        $this->sheetName = $sheetName;
        $this->createData();
    }

    public function headings(): array
    {
        return $this->headings;
    }

    //数组转集合
    public function collection()
    {
        return new Collection($this->data);
    }
    //业务代码
    public function createData()
    {
        $this->data = collect($this->data)->toArray();
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class  => function(AfterSheet $event) {
                //设置区域单元格垂直居中
                $event->sheet->getDelegate()->getStyle('A1:Z1265')->getAlignment()->setVertical('center');
                //设置区域单元格水平居中
                $event->sheet->getDelegate()->getStyle('A1:Z1265')->getAlignment()->setHorizontal('center');
                //设置列宽
                foreach ($this->columnWidth as $column => $width) {
                    $event->sheet->getDelegate()
                        ->getColumnDimension($column)
                        ->setWidth($width);
                }
                //设置行高,$i为数据行数
                foreach ($this->rowHeight as $row => $height) {
                    $event->sheet->getDelegate()
                        ->getRowDimension($row)
                        ->setRowHeight($height);
                }

                //设置区域单元格垂直居中
                foreach ($this->vertical as $region => $position) {
                    $event->sheet->getDelegate()
                        ->getStyle($region)
                        ->getAlignment()
                        ->setVertical($position);
                }

                //设置区域单元格字体
                foreach ($this->font as $region => $value) {
                    $event->sheet->getDelegate()
                        ->getStyle($region)
                        ->getFont()->setName($value);
                }
                // 设置字体颜色
                foreach ($this->fontColor as $region => $value) {
                    $event->sheet->getDelegate()
                        ->getStyle($region)
                        ->getFont()->setColor($value);
                }

                //设置区域单元格字体大小
                foreach ($this->fontSize as $region => $value) {
                    $event->sheet->getDelegate()
                        ->getStyle($region)
                        ->getFont()
                        ->setSize($value);
                }

                //设置区域单元格字体粗体
                foreach ($this->bold as $region => $bool) {
                    $event->sheet->getDelegate()
                        ->getStyle($region)
                        ->getFont()
                        ->setBold($bool);
                }


                //设置区域单元格背景颜色
                foreach ($this->background as $region => $item) {
                    $event->sheet->getDelegate()->getStyle($region)->applyFromArray([
                        'fill' => [
                            'fillType' => 'linear', //线性填充,类似渐变
                            'startColor' => [
                                'rgb' => $item //初始颜色
                            ],
                            //结束颜色,如果需要单一背景色,请和初始颜色保持一致
                            'endColor' => [
                                'argb' => $item
                            ]
                        ]
                    ]);
                }
                //设置边框颜色
                foreach ($this->borders as $region => $item) {
                    $event->sheet->getDelegate()->getStyle($region)->applyFromArray([
                        'borders' => [
                            'allBorders' => [
                                'borderStyle' =>Border::BORDER_THIN,
                                'color' => ['argb' => $item],
                            ],
                        ],
                    ]);
                }
                //合并单元格
                $event->sheet->getDelegate()->setMergeCells($this->mergeCells);
                if(!empty($this->sheetName)){
                    $event->sheet->getDelegate()->setTitle($this->sheetName);
                }
            }
        ];
    }

    /**
     * @return array
     * [
     *    'B' => 40,
     *    'C' => 60
     * ]
     */
    public function setColumnWidth (array $columnwidth)
    {
        $this->columnWidth = array_change_key_case($columnwidth, CASE_UPPER);
    }

    /**
     * @return array
     * [
     *    1 => 40,
     *    2 => 60
     * ]
     */
    public function setRowHeight (array $rowHeight)
    {
        $this->rowHeight = $rowHeight;
    }

    /**
     * @return array
     * [
     *    A1:K7 => '宋体'
     * ]
     */
    public function setFont (array $font)
    {
        $this->font = array_change_key_case($font, CASE_UPPER);
    }

    /**
     * @return array
     * @2020/3/22 10:33
     * [
     *    A1:K7 => true
     * ]
     */
    public function setBold (array $bold)
    {
        $this->bold = array_change_key_case($bold, CASE_UPPER);
    }

    /**
     * @return array
     * @2020/3/22 10:33
     * [
     *    A1:K7 => F0FF0F
     * ]
     */
    public function setBackground (array $background)
    {
        $this->background = array_change_key_case($background, CASE_UPPER);
    }
    /**
     * 合并单元格
     * @return array
     * [
     *    A1:K7
     * ]
     */
    public function setMergeCells (array $mergeCells)
    {
        $this->mergeCells = array_change_key_case($mergeCells, CASE_UPPER);
    }
    /**
     * @return array
     * [
     *    A1:K7 => 14
     * ]
     */
    public function setFontSize (array $fontSize)
    {
        $this->fontSize = array_change_key_case($fontSize, CASE_UPPER);
    }

    /**
     * 设置边框颜色
     * [
     *    A1:K7 => #000000
     * ]
     */
    public function setBorders (array $borders)
    {
        $this->borders = array_change_key_case($borders, CASE_UPPER);
    }

    /**
     * @description 设置字体颜色
     * @param array $fontColor ['A1' => new Color('FF0000'), 'B1:D1' => new Color('FF0000')]
     * @author: zhangyf
     * @create_at: 2024/4/22 16:41
     */
    public function setFontColor(array $fontColor)
    {
        $this->fontColor = array_change_key_case($fontColor, CASE_UPPER);
    }

}

数据组装导出,直接看代码

/**
     * @description 发票统计数据导出excel
     * @param array $condition
     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
     * @throws JsonException
     * @throws \App\Exceptions\ApiException
     * @author: zhangyf
     * @create_at: 2024/4/22 14:04
     */
    public function exportStatisticsExcel(array $condition)
    {

        // 获取统计的数据
        $data = $this->api->getUsersInvoiceStatistics([
            'query' => $condition
        ]);

        $excel_data = Helper::checkApiResponse($data);
        //设置表头
        $header = [
            [
                "title"          => '发票审核数据明细表',
            ]
        ];

        //数据 只管data中对应的value就行,渲染在对应的单元格
        $elec_s = ($excel_data['general_person_elec'] + $excel_data['general_public_elec']);
        $paper_s = ($excel_data['general_person_paper'] + $excel_data['general_public_paper']);
        $all_p = ($elec_s + $paper_s);
        $all_s = ($excel_data['special_public_elec'] + $excel_data['special_public_paper']);
        $p_elec = ($excel_data['general_public_elec'] + $excel_data['special_public_elec']);
        $p_paper = ($excel_data['general_public_paper'] + $excel_data['special_public_paper']);
        $all = ($all_p + $all_s);
        $all_public = $p_elec + $p_paper;

        $person_elec_paper = $excel_data['general_person_elec'] + $excel_data['general_person_paper'];
        $data = [
            0 => [
                "title"    => '发票申请种类',
                "person"   => '个人',
                "person_c" => '',
                "public"   => '对公',
                "public_c" => '',
                "elec_s"   => '电子小计',
                "paper_s"  => '纸质小计',
                "all_s"    => '合计'
            ],
            1 => [
                "title"        => '',
                "person_elec"  => '电子',
                "person_paper" => '纸质',
                "public_elec"  => '电子',
                "public_paper" => '纸质',
                "title1"       => '',
                "title2"       => '',
                "title3"       => ''
            ],

            2 => [
                "title"                => '增值税普通发票',
                "general_person_elec"  => $excel_data['general_person_elec'],
                "general_person_paper" => $excel_data['general_person_paper'],
                "general_public_elec"  => $excel_data['general_public_elec'],
                "general_public_paper" => $excel_data['general_public_paper'],
                "elec_s"               => $elec_s . "",
                "paper_s"              => $paper_s . "",
                "all_p"                => $all_p . ""
            ],
            3 => [
                "title"                => '增值税专用发票',
                "special_person_elec"  => '/',
                "special_person_paper" => '/',
                "special_public_elec"  => $excel_data['special_public_elec'],
                "special_public_paper" => $excel_data['special_public_paper'],
                "elec_s"               => $excel_data['special_public_elec'],
                "paper_s"              => $excel_data['special_public_paper'],
                "all_s"                => $all_s . ""
            ],
            4 => [
                "title"        => '小计',
                "person_elec"  => $excel_data['general_person_elec'],
                "person_paper" => $excel_data['general_person_paper'],
                "public_elec"  => $p_elec . "",
                "public_paper" => $p_paper . "",
                "elec_s"       => $elec_s . "",
                "paper_s"      => $paper_s . "",
                "all_s"        => $all ?? "0"
            ],
            5 => [
                "title"               => '合计',
                "person_elec_paper"   => $person_elec_paper ."",
                "person_elec_paper_c" => "",
                "public_elec_paper"   => $all_public ."",
                "public_elec_paper_c" => ' ',
                "elec_and_paper"      => ($elec_s+$paper_s),
                "elec_and_paper_c"    => '',
                "all_s"               => ''
            ]
        ];

        $excel = new InvoiceStatisticsExports($data, $header, '导出sheetName');
        // 设置列宽
        $excel->setColumnWidth(['A' => 20]);
        // 设置行高
        $excel->setRowHeight([1 => 40]);
        // 设置字体格式
        $excel->setFont(['A1:Z1265' => '宋体']);
        // 设置字体大小
        $excel->setFontSize(['A1:H1' => 14, 'A2:H7265' => 10]);
        // 设置边框
        $excel->setBold(['A1:H7' => true]);
        // 合并单元格
        $excel->setMergeCells(['A1:H1', 'A2:A3' , 'B2:C2', 'D2:E2', 'F2:F3', 'G2:G3', 'H2:H3', 'B7:C7', 'D7:E7', 'F7:G7', 'H6:H7']);
        // 设置边框颜色
        $excel->setBorders(['A1:H7' => '#00000']);
        // 设置字体颜色
        $red = new Color('FF0000');
        $excel->setFontColor(['A7:G7265' => $red, 'H2:H7265' => $red]);

        return Excel::download($excel, '导出文件-'.date('YmdHis').'.xlsx');
    }

实际导出效果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在EasyExcel中,可以使用`@ExcelProperty`注解来声明单元格的位置和内容。如果需要合并单元格,则可以在注解中使用`@ContentRowHeight`、`@HeadRowHeight`和`@ColumnWidth`来设置合并后单元格的高度和宽度。 例如,以下是一个合并单元格的示例: ```java public class TestDto { @ExcelProperty(value = {"表头1", "表头1.1"}, index = 0) @ContentRowHeight(30) @HeadRowHeight(30) @ColumnWidth(25) private String col1; @ExcelProperty(value = {"表头2", "表头2.1"}, index = 1) @ContentRowHeight(30) @HeadRowHeight(30) @ColumnWidth(25) private String col2; @ExcelProperty(value = {"表头3", "表头3.1"}, index = 2) @ContentRowHeight(30) @HeadRowHeight(30) @ColumnWidth(25) private String col3; @ExcelProperty(value = {"表头4", "表头4.1", "表头4.2"}, index = 3) @ContentRowHeight(60) @HeadRowHeight(30) @ColumnWidth(25) private String col4; // 省略getter/setter方法 } ``` 在以上示例中,`@ExcelProperty`注解中的`value`属性表示单元格的位置,使用数组来表示多级表头。`@ContentRowHeight`、`@HeadRowHeight`和`@ColumnWidth`注解分别表示合并后单元格的高度和宽度。其中,`@ContentRowHeight`和`@HeadRowHeight`设置的是行高,`@ColumnWidth`设置的是列宽。 以上示例中,第4列的单元格需要合并三个表头,因此在`@ExcelProperty`注解中使用了一个长度为3的数组。同时,通过`@ContentRowHeight`注解设置合并后单元格的高度为60,即占用两行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值