设为首页 - 加入收藏 - 网站地图 欢迎加QQ群 :14364084
当前位置:谭博的博客 > 编程语言 > php > 正文

使用phpexecel导出excel文件,合并单元格

时间:2013-03-03 18:24 来源: 标签:合并单元格 phpexecel 导出excel 作者:谭博 阅读:

<?php
session_start();
require_once("../../PHPExcel/PHPExcel.php");

//根据数据创建excel
function create_excle_by_data($path,$colums_name,$data,$title=''){
 $column_number = count($colums_name);//列的数量
 $objPHPExcel = new PHPExcel();// 创建一个处理对象实例
 $objPHPExcel->createSheet();//创建sheet
 $objPHPExcel->setActiveSheetIndex(0);
 $objActSheet = $objPHPExcel->getActiveSheet();
 //设置表格标题
 $objActSheet->setCellValue('A1', $title);
 //设置字体大小
 $objActSheet->getStyle('A1')->getFont()->setName('Candara');
 $objActSheet->getStyle('A1')->getFont()->setSize(20);
 $objActSheet->getStyle('A1')->getFont()->setBold(true);
 //合并标题单元格
 $objActSheet->getStyle('B2')->getAlignment()->applyFromArray(
 array(
 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
 'rotation' => 0,
 'wrap' => true
 )
 );
 $objActSheet->mergeCells( 'A1:'.chr(ord(A)+$column_number-1).'1');//合并标题
 $objActSheet->fromArray($colums_name, NULL, 'A2');//插入列名

// $objActSheet->fromArray($data, NULL, 'A3');//插入数据

 from_array_merge_same($objActSheet,$data,$startCell = 'A3','time');//插入数据合并相同
 // 生成2007excel格式的xlsx文件
 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
 $objWriter->setOffice2003Compatibility(true);
 $objWriter->save($path);

}
function from_array_merge_same($objActSheet,$data,$startCell = 'A1',$col_name){
 if (is_array($data)) {
 //把一围数组转二围数组便于循环
 if (!is_array(end($data))) {
 $source = array($data);
 }

 if (preg_match("/^([$]?[A-Z]{1,3})([$]?\d{1,7})$/", $startCell, $matches)) {
 list ($startColumn, $startRow) =array($matches[1],$matches[2]);
 }

 $tmp = $data[0][$col_name];//临时取第一个元素,便于对比找出第一个不同的元素,找出后tmp被赋值这个找到的值,继续找下去
 $begin = 0;//开始下标
 $end =0;//结束下标

 for($i=0;$i<=count($data);$i++){

 if(!isset($data[$i][$col_name])){//判断循环是否结束
 $end =$i-1;//如果结束取最后一位作为end
 $result['A'.($begin+3).':A'.($end+3)]='A'.($begin+3).':A'.($end+3);//把start和end推入数组
 $result['F'.($begin+3).':F'.($end+3)]='F'.($begin+3).':F'.($end+3);
 $count_arr['F'.($begin+3)]=$end-$begin+1;
 break;
 }

 $currentColumn = $startColumn;
 foreach($data[$i] as $v){
 $objActSheet->setCellValue($currentColumn.$startRow,$v);//插入数据
 ++$currentColumn;
 }
 ++$startRow;

 //开始查询合并start end 数组

 if($data[$i][$col_name]!==$tmp){//判断元素是否不等于临时值
 $end =$i-1;//如果找到几下end值
 if($begin!==$end){//如果只有一个值start就和end相同了要排除
 $result['A'.($begin+3).':A'.($end+3)]='A'.($begin+3).':A'.($end+3);
 $result['F'.($begin+3).':F'.($end+3)]='F'.($begin+3).':F'.($end+3);
 $count_arr['F'.($begin+3)]=$end-$begin+1;
 }
 $tmp = $data[$i][$col_name];//推入一次后把tmp赋新值继续比较下去
 $begin =$i;//推入一次后把bgin赋新值继续比较下去

 }

}
 $get_merge = $objActSheet->getMergeCells();
 $objActSheet->setMergeCells(array_merge($get_merge,$result));//合并相同列
 print_r(array_merge($get_merge,$result));
 foreach ($count_arr as $key=>$value){//循环插入统计值
 $objActSheet->setCellValue($key,$value);
 }

 }
}
$path = '../../report/192_fda.xlsx';
$colums_name = array(
 '时间',
 '终端',
 '所属部门',
 '类型',
 '描述',
 '共'
);
$data = array(
 array('time'=>'2011','name'=>'ad','age'=>'29','pthone'=>'1493532534','c'=>'电信'),
 array('time'=>'2011','name'=>'bc','age'=>'29','pthone'=>'1493532532','c'=>'电信'),
 array('time'=>'2012','name'=>'朱伟','age'=>'29','pthone'=>'1493532533','c'=>'电信'),
 array('time'=>'2012','name'=>'虾子','age'=>'2','pthone'=>'1493532531','c'=>'电信')
);
create_excle_by_data($path,$colums_name,$data,'名')
?>

 

 

关注微信公众号

微信扫一扫,打赏我

热评文章
    内容不错,支持一下
    评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
    • 陈勇
      2016-12-01 11:50:59发表

      先用for循环把所有数据写入excel对像中,然后再根据要合并的例,统计合并的表格数,然后针对统计的数据进行合并,这样最简单。统计重复次数的关键函