PHPEXCEL 合并单元格--导出

 调用

$list = DB::table('agent.dbo.retained')->orderByDesc('mydate')->limit(1000)->get()->map(function ($value) {
                return (array)$value;
            })->toArray();
            $title = ['日期', '活跃', '新增', '充值金额', '玩过游戏玩家', '新增里玩过游戏的玩家', '玩过TP玩家', '新增里玩过TP的玩家', '5局TP活跃玩家', '10局TP活跃玩家', '20局TP活跃玩家', '50局TP活跃玩家',
                '100局TP活跃玩家', '总局数', '人均局数', '总税收', '人均税收', '玩过TP玩家', '新增里玩过TP的玩家', '5局TP活跃玩家',
                '10局TP活跃玩家', '20局TP活跃玩家', '50局TP活跃玩家', '100局TP活跃玩家', '总局数', '人均局数', '总税收', '人均税收',
                '玩过RM玩家', '新增里玩过RM的玩家', '玩过RM2人玩家', '玩过RM5人玩家', '5局RM活跃玩家', '10局RM活跃玩家', '20局RM活跃玩家', '50局RM活跃玩家', '总局数', '人均局数', '总税收', '人均税收', '玩过RM玩家',
                '新增里玩过RM的玩家', '玩过RM2人玩家', '玩过RM5人玩家', '3局RM活跃玩家', '5局RM活跃玩家', '10局RM活跃玩家', '总局数', '人均局数', '总税收', '人均税收'];
            $mergeCells = ['B1:F1', 'G1:Q1', 'R1:AB1', 'AC1:AN1', 'AO1:AY1'];
            $mergeCellsValue = ['B1' => '总体数据', 'G1' => '所有玩家teenpatti玩家的数据', 'R1' => '所有玩家teenpatti付费玩家的数据', 'AC1' => '所有RUMMY玩家的数据', 'AO1' => '所有玩家RUMMY付费玩家的数据'];
            $name = '玩家留存付费';
            PHPExcelHelper::downExcel($name, $title, $list, $mergeCells, $mergeCellsValue);

助手类 

/**
     * @param string $name excel名
     * @param array $title 标题
     * @param array $data 数据
     * @param array $mergeCells 要合并的单元格
     * @param array $mergeCellsValue 合并单元格的标题和序列号
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     * @throws \PHPExcel_Writer_Exception
     */
    public static function downExcel($name, $title, $data, $mergeCells, $mergeCellsValue)
    {
        // 创建对象
        $objPHPExcel = new \Maatwebsite\Excel\Classes\PHPExcel();

        // 显示错误信息
        error_reporting(E_ALL);

        // 设置水平居中
        if (!empty($mergeCells)) {
            foreach ($mergeCells as $val) {
                $objPHPExcel->getActiveSheet()->getStyle($val)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            }
        }

        // 设置行高度
        $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(20); //设置默认行高
        $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(30);    //第一行行高

        //设置单元格宽度
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);

        // 合并
        if (!empty($mergeCells)) {
            foreach ($mergeCells as $val) {
                $objPHPExcel->getActiveSheet()->mergeCells($val);
            }
        }

        // 合并单元格的标题
        if (!empty($mergeCellsValue)) {
            foreach ($mergeCellsValue as $key => $val) {
                $objPHPExcel->setActiveSheetIndex(0)->setCellValue($key, $val);
            }
        }

        $serial_number = self::serial_number($title);
        // 第二列 初始行2
        $row = 2;
        foreach ($title as $key => $value) {
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($serial_number[$key] . $row, $value);
        }

        // 填充数据 初始化3
        $row = 3;
        foreach ($data as $value) {
            if (!empty($value)) {
                $value = array_values($value);
                foreach ($value as $key => $val) {
                    $objPHPExcel->setActiveSheetIndex(0)->setCellValue($serial_number[$key] . $row, $val);
                }
                $row++;
            }
        }

        // Rename sheet
        $objPHPExcel->getActiveSheet()->setTitle($name);

        // Set active sheet index to the first sheet, so Excel opens this as the first sheet
        $objPHPExcel->setActiveSheetIndex(0);

        // 设置输出
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename='.$name.'.xls');
        header('Cache-Control: max-age=0');

        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
        exit;
    }

 生成序列号

// 生成序列号
    protected static function serial_number($title)
    {
        // 初始值
        $loop = 0;
        $charnum = 65;
        $serial_number = [];
        for (; $loop < count($title); $loop++) {
            $quotient = intval($loop / 26);
            $remainder = $loop % 26;
            $f = $quotient > 0 ? chr($charnum + $quotient - 1) : '';
            $s = $remainder >= 0 ? chr($charnum + $remainder) : '';
            $serial_number[] = $f . $s;
        }
        return $serial_number;
    }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值