吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2026|回复: 4
收起左侧

[其他转载] 【PHP】通过PHPExcel导出比较复杂的表格

  [复制链接]
yqsphp 发表于 2020-7-8 11:07
本帖最后由 yqsphp 于 2020-7-8 15:18 编辑

平时作为一个系统需要导出数据时一般的话导出的是Excel便于统计。常见的就是导出的表格第一行是标题或列名名了,其他行对应数据如图:

1594175536(1).jpg
这里做了个最多3级行数据导出,虽不能满足所有要求但一般是可以的,要想更复杂的请自行扩展吧
这是导出的结果
1594176308(1).jpg
下面是主要代码:提示使用之前请下好PHPExcel
[PHP] 纯文本查看 复制代码
/**
 * excel文件导出
 *
 * [url=home.php?mod=space&uid=952169]@Param[/url] array $data 需要生成excel文件的数组
 *                $data = [
 *                  [NULL, 2010, 2011, 2012],//列名
 *                  ['Q1', 12, 15, 21],
 *                  ['Q2', 56, 73, 86],
 *                  ['Q3', 52, 61, 69],
 *                  ['Q4', 30, 32, 0],
 *                ];
 * @param string $filename 生成的excel文件名,示例数据:
 * @param array $config 配置选项
 *          $config = [
 *              'title_size' //标题字体大小
 *              'title_height' //标题高度
 *              'row_height' //行高
 *              'form_pend' //从第几行填充数据,默认2
 *              'free' => 'A4' //冻结窗口位置 A4
 *              'iscell' => true  //是否合并列
 *              'cell_init_row' => //初始从第几行合并 1
 *              'cell_init_col' => //合并列初始 A
 *              'cell'  => [] //合并列数 ['title'=>1,'title'=>2,'title'=>3,'title'=>4,'title'=>5...];
 *          ]
 */
function export_excel($data, $title = '', $filename = '*.xls', $config = []){
        set_time_limit(0);
        Vendor('PHPExcel.PHPExcel');
        $filename = ($filename ?: $title) . '.xls';
        $phpexcel = new PHPExcel();
        $phpexcel->getProperties()->setCreator("Maarten Balliauw")->setLastModifiedBy("Maarten Balliauw")->setTitle("Office 2007 XLSX Test Document")->setSubject("Office 2007 XLSX Test Document")->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")->setKeywords("office 2007 openxml php")->setCategory("Test result file");
        $phpexcel->getActiveSheet()->setTitle('Sheet1');
        // 默认表格样式居中
        $phpexcel->getActiveSheet()->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        
        //生成字母
        for ($i = 0, $len = count($data[0]); $i<= $len; $i++){
            $y = $i / 26;
            if($y >= 1){
                $y = intval($y);
                $cellKey[] = chr($y+64) . chr($i-$y*26 + 65);
            }else{
                $cellKey[] = chr($i+65);
            }
        }
        $len = [];
        foreach($data[0] as $val){
            array_push($len, strlen($val)+1);
        }
        //从第几行开始换行
        $rows = $config['form_pend'] ? $config['form_pend'] : 2;
        for($i = 0; $i < count($data[0]); $i ++){
            $phpexcel->getActiveSheet()->getColumnDimension($cellKey[$i])
            //->setAutoSize(true); //设置列宽自适应
            ->setWidth($len[$i]);
            //单元格内自动换行
            $phpexcel->getActiveSheet()->getStyle($cellKey[$i])->getAlignment()->setWrapText(true);
            $phpexcel->getActiveSheet()->getStyle($cellKey[$i])->getAlignment()
            ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平居中
            ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
            $phpexcel->getActiveSheet()->getStyle($cellKey[$i].$rows)->getFont()->setBold(true)->setSize(15);
        }
        $phpexcel->getActiveSheet()->getRowDimension($rows)->setRowHeight(20); // 设置第n的行高
        // 标题设置
        if(! empty($title)){
                $phpexcel->getDefaultStyle()->getFont()->setName('宋体');
                $phpexcel->getDefaultStyle()->getFont()->setSize(12);
                $phpexcel->getActiveSheet()->mergeCells('A1:' . $cellKey[count($data[0]) - 1] . '1')// 合并指定列 
                                 ->getStyle('A1')->getFont()->setBold(true)->setSize($config['title_size']?:12);
                $phpexcel->getActiveSheet()->freezePane($config['free']?:'A3'); // 冻结窗口
                
                if($config['iscell']){
                    $init = 0;
                    $cell_start = $config['cell_init_col'].$config['cell_init_row'];
                    static $len  = 1;
                    static $col  = null;
            foreach($config['cell'] as $key => $num){
                $start = $init == 0 ? $cell_start : $cellKey[$len].$config['cell_init_row'];
                $end   = $cellKey[$len+$num-1].$config['cell_init_row'];
                $col   = $cellKey[$len].'2';
                $len  += $num;
                    ++$init;
                    //合并指定列    
                    $phpexcel->getActiveSheet()->mergeCells($start.':'.$end)->setCellValue($col,$key);
                    $phpexcel->getActiveSheet()->getStyle($col)->getFont()->setBold(true)->setSize(15);
            }
            //exit();
            //当存在多级行表格,最多3行
            $phpexcel->getActiveSheet()->getRowDimension(2)->setRowHeight(40); // 设置第2行高
                    
                    $phpexcel->getActiveSheet()->getStyle('A3')->getAlignment()
                            ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平居中
                            ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
                }
                $phpexcel->setActiveSheetIndex(0)->setCellValue('A1', $title); // 设置标题
                $phpexcel->getActiveSheet()->getRowDimension(1)->setRowHeight($config['title_height']?:50); // 设置标题行高
                $phpexcel->getActiveSheet()->getStyle('A1')->getAlignment()
                        ->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER) // 水平居中
                        ->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
                 // formArray(填充的数据,列值为空默认填充空,从第几行开始)
            $phpexcel->getActiveSheet()->fromArray($data, null, 'A'.($config['form_pend']?:2)); 
                                 
        }else{
                $phpexcel->getActiveSheet()->fromArray($data);
        }
        
        // 合并指定列
        // $phpexcel->getActiveSheet()->mergeCells('A1:R1');
        // $phpexcel->setActiveSheetIndex(0);
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename=' . $filename);
        header('Cache-Control: max-age=0');
        header('Cache-Control: max-age=1');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
        header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
        header('Pragma: public'); // HTTP/1.0
        $objwriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5');
        $objwriter->save('php://output');
        exit();
}

数据测试使用:比如:
我要导出这样一个数据
[PHP] 纯文本查看 复制代码
$output = [
            [   '时间',
                'A总数','A1总数','A2总数','A3总数','A4新增',
                'B总数','B1新增','B2筛掉',
                'C总数','C1总数','C2总数','C3新增',
                'D总数','D1总数','D2总数','D3总数','D4新增','D5新增',
                'E总数','E1总数','E2总数','E3新增','E4新增'
            ]
        ];

配置如下:
[PHP] 纯文本查看 复制代码
//设置第二行合并数
        $config = [
            'form_pend'     => '3',
            'free'          => 'A4', //设置冻结窗口
            'iscell'        => true,
            'title_size'    => 50,
            'cell_init_row' => 2, //初始从第几行合并
            'cell_init_col' => 'B',
            'cell'          => ['A类'=>5,'B类'=>3,'C类'=>4,'D类'=>6,'E类'=>5],,
        ];

这里的
'cell' => ['A类'=>5,'B类'=>3,'C类'=>4,'D类'=>6,'E类'=>5],
是对应上边$output中A ,B,C,D,E合并列的个数,如A的共有5列,那么就是“A类”作为列名合并5列
最后导出的结果如图所示
fecb05eb7cc00a981583b45f0e868dd.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
小姐姐退下吧 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| yqsphp 发表于 2020-7-8 14:16
怎么回事,一直审核
ivanlong 发表于 2020-7-8 16:40
头像被屏蔽
longtian1911 发表于 2020-7-9 08:51
xiaomingtt 发表于 2020-7-9 13:06
咨询一下,如何让图片大小与单元格大小相等
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 03:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表