PHP生成Excel之表格(一)

文章使用phpexcel提供的操作方法,生成excel文件。

Excel目标

我们将要生成的excel最终效果如下图显示。
这里写图片描述

代码演示

public static function ExportExcel($data,$filename=''){
    $data; //数据数组(三维数组)
    $filename=empty($filename)?"":$filename;
    $resultPHPExcel = new \PHPExcel();
    $sheet_title = "每日效果走势图";
    // 设置sheet名称
    $resultPHPExcel->getActiveSheet()->setTitle($sheet_title);
    // 边框配置数组
    $styleArray = array(
        'borders' => array(
            'allborders' => array(
                //'style' => PHPExcel_Style_Border::BORDER_THICK,//边框是粗的
                'style' => \PHPExcel_Style_Border::BORDER_THIN,//细边框
                //'color' => array('argb' => 'FFFF0000'),
            ),
        ),
    );

    //数据开始
    $i = 102;
    $j = $i;
    // 设置所在行的字体、大小、加粗
    $resultPHPExcel->getActiveSheet()->getStyle($i)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true);
    $resultPHPExcel->getActiveSheet()->getStyle($i+29)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true);
    // 设置所在行的字体、大小、加粗、颜色
    $resultPHPExcel->getActiveSheet()->getStyle($i+1)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE);
    $resultPHPExcel->getActiveSheet()->getStyle($i+30)->getFont()->setName('微软雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_WHITE);
    // 设置区域范围内的单元格背景颜色
    $resultPHPExcel->getActiveSheet()->getStyle('A'.($i+1).':B'.($i+1))->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('404040');
    $resultPHPExcel->getActiveSheet()->getStyle($i+30)->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('404040');
    // 给范围内的表格加上边框
    $resultPHPExcel->getActiveSheet()->getStyle('A'.($i+1).':B'.($i+26))->applyFromArray($styleArray);
    //单元格范围内,格式化数字。(取整,百分比)
    $resultPHPExcel->getActiveSheet()->getStyle('B104:B123')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER);
    $resultPHPExcel->getActiveSheet()->getStyle('B124:B128')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE);
    $resultPHPExcel->getActiveSheet()->getStyle('133:148')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER);
    $resultPHPExcel->getActiveSheet()->getStyle('149:152')->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE);

    //循环数组,写入数据。
    foreach($data['list'] as $item){
        foreach($item as $key=>$val){
             // 获取列的标识
             $columnID = self::stringFromColumnIndex($key);
             $cellID=self::stringFromColumnIndex($key).$i;
             //设置单元格内容水平居中
             $resultPHPExcel->getActiveSheet()->getStyle($cellID)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
             //数据写入单元格
             $resultPHPExcel->getActiveSheet()->setCellValue($cellID,$val);
             // 非A列时,设置单元格宽度为15
             if ($columnID!='A') {
                $resultPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setWidth(15);
             }
        }
        $i ++;
    }
    // 设置A列的单元格宽度
    $resultPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
    //在单元格范围内,给表格添加边框
    $resultPHPExcel->getActiveSheet()->getStyle('A'.($j+30).':'.$columnID.($j+50))->applyFromArray($styleArray);
    $sum = $arrayLegth-3;
    //表格末尾两行,写入数据
    $resultPHPExcel->getActiveSheet()->setCellValue('A153','备注:表格内各数据单位为万;线索单位为条');
    $resultPHPExcel->getActiveSheet()->getStyle('A153')->getFont()->setName('微软雅黑')->setSize(11)->setBold(true)->getColor()->setARGB(\PHPExcel_Style_Color::COLOR_RED);

    $outputFileName = $filename.date('Y_m_d_H_i').'.xlsx';
    $xlsWriter = new \PHPExcel_Writer_Excel2007($resultPHPExcel);
    //输出到浏览器
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header('Content-Disposition:inline;filename="'.$outputFileName.'"');
    header("Content-Transfer-Encoding: binary");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Pragma: no-cache");
    $xlsWriter->save( "php://output" );
    exit;
}

关于代码
以上代码只是生成excel的核心部分。数据源部分、和其他一些方法的调用都没有给出。
关于数据数组
这里我个人习惯将输出数组拼接成一个三维数组。由外到内,第一维度为sheet页、第二维度为表格的行、第三维度为表格的列。二三维度可以具体到一个单元格。
关于数据写入
phpexcel的写入数据,是需要指定单元格的。所以,必须转换成excel的列表示方式(英文字母)
其他补充
基本上代码上都给了比较详细的注释。那如果对这些操作样式的方法不熟悉,还是需要去看一下文档。后面有时间我会专门出一篇文章来解释文档。

Excel效果

这里写图片描述
和我们的目标对比发现,好像有很多区别。比如:

  1. 许多颜色样式没有配置。
  2. 数字格式没有千分位分割符。
  3. 除了有内容的单元格,其他的单元格应该是空白。
    ……

存在的问题

从我们的代码上看,发现通过phpexcel官方提供的操作对象去生成excel是存在许多问题的。(以下问题不一定能通过上面内容反映)

  1. 配置样式比较繁琐,复杂的样式可能需要大量代码去支持。
  2. 虽然提供了行和列整体的操作。但是存在单元格合并时,整行或者整列的配置会失效。而且整行或者整列配置样式时,会导致把表格外部带入样式,比较难看。
  3. 虽有提供默认样式配置,但是多种配置在同一个单元格时,会出现默认失效的问题。调试比较麻烦。
  4. 单元格的自动宽度,对于中文支持不好。

这种生成excel的方式存在许多问题,但是还是能尽量避免的。解决方法可以尝试。

  1. 尽量通过循环,把样式配置到单元格上。
  2. 样式设置时,有限默认样式->写入数据->单元格样式配制的方式。这种方式一般不会出现配置后不生效的问题。

寻求别的途径

既然样式的配置,那么繁琐又增加代码量。那么有没有什么别的方式来解决这个问题呢?
答案肯定是有的,不然这篇文章就没有意见。在上一篇文章介绍phpexcel时,有说道。phpexcel能读取、生成、修改excel文件。那么出力直接生成excel文件,能否能使用别的方式间接生成呢?
下一篇文件,主要讨论如何放弃繁琐的样式配置,生成跟目标文件一样样式的文件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值