phpexcel 导出列数不固定的表格

最近做了一个学生校服的后台,客户要求打印出学生购买记录,每个学生是一行。校服的种类不同,有的人买的多,有的人买的少,所以表格的列数就不固定了
先放一张图。
思路:
首先要查出购买种类最多的学生,以他的购买的校服种类作为表头,查询结果打印出来是这个样子的,我这里删减了几条,方便展示。

array(9) {
  [0]=>
  array(2) {
    ["key"]=>
    string(34) "ada69bc16a22bebdafe4f090503a56d5_6"
    ["value"]=>
    string(27) "冬季加厚装男款套装"
  }
  [1]=>
  array(2) {
    ["key"]=>
    string(34) "ada69bc16a22bebdafe4f090503a56d5_3"
    ["value"]=>
    string(27) "冬季加厚装女款上装"
  }
  [2]=>
  array(2) {
    ["key"]=>
    string(34) "ada69bc16a22bebdafe4f090503a56d5_1"
    ["value"]=>
    string(27) "冬季加厚装男款上装"
  }
}
$jbxx = array('key'=>1,'value'=>'基本信息');
array_unshift($headerArr,$jbxx);

因为数组中没有基本信息这一列,用array_unshift()函数添加在数组首位。

再根据第一行的表头生成第二行

foreach($headerArr as $k=>$v){
			if($k == 0){
				array_push($header2,['key'=>'class','value'=>'班级']);
				array_push($header2,['key'=>'name','value'=>'姓名']);
				array_push($header2,['key'=>'sex','value'=>'性别']);
			}else{
				$kk1 = $v['key'].'_1';
				$kk2 = $v['key'].'_2';
				$kk3 = $v['key'].'_3';
				array_push($header2,['key'=>"$kk1",'value'=>'尺寸' ,'type'=>'chicun']);
				array_push($header2,['key'=>"$kk2",'value'=>'数量','type'=>'num']);
				array_push($header2,['key'=>"$kk3",'value'=>'缴费情况','type'=>'money']);
			}	
		}

这里完了生成的数组大致是这样的:
在这里插入图片描述这里涉及了一个合并单元格,所以将第一行数组循环组成新的数组,这样第一列和第二列的列数就是一样的了

$new_header= array();
for($i=0;$i<count($headerArr);$i++){
	array_push($new_header,$headerArr[$i]);
	array_push($new_header,$headerArr[$i]);
	array_push($new_header,$headerArr[$i]);
}

这里操作完是这样的:
在这里插入图片描述
下面就是重点:计算表格列数

$phpExcel->setActiveSheetIndex(0); //设置当前的sheet
		$objSheet =$phpExcel->getActiveSheet(); //获取当前活动sheet
		$objSheet->setTitle($sheet); //设置标题		
		//获取列字母,设置第一行表头
		$headCharArr = $this->getHeaderChar($new_header); //A B C
		foreach ($headCharArr as $k => $v) {
			$objStyle = $objSheet->getStyle($headCharArr[$k] . '1');
			$objAlign = $objStyle->getAlignment();
			$objAlign->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //上下居中
			$objAlign->setHorizontal(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //左对齐
			$phpExcel->getActiveSheet()->setCellValue($headCharArr[$k] . '1', $new_header[$k]['value']);//先写入内容再合并单元格,否则报错			
		}
		//获取列字母,设置第二行表头
		$headCharArr2 = $this->getHeaderChar($header2); //A B C
		//dd($headCharArr2);
		foreach ($headCharArr2 as $k => $v) {
			$objStyle2 = $objSheet->getStyle($headCharArr2[$k] . '2');
			$objAlign2 = $objStyle2->getAlignment();
			$objAlign2->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //上下居中
			$objAlign2->setHorizontal(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //左对齐
			$phpExcel->getActiveSheet()->setCellValue($headCharArr2[$k] . '2', $header2[$k]['value']);//先写入内容再合并单元格,否则报错
			//$phpExcel->getActiveSheet()->mergeCells($headCharArr2[$k].'1:'.$headCharArr2[$k*3].'1');   //合并单元格
		}
		for($m=0;$m< count($headerArr);$m++){
			$a=$m*3;
			$b=$m*3+2;
			$aa = $headCharArr2[$a];
			$bb = $headCharArr2[$b];
			$phpExcel->getActiveSheet()->mergeCells($aa.'1:'.$bb.'1'); //合并第一列的单元格,每3个合成一个
		}

然后就是填充数据,完成!!!
完整代码:

  public function export($fileName="Excel", $headerArr = array(), $data = array(),$sheet = 'Sheet1')
	{
        // 实例化excel
        // 引入文件
        include  '../vendor/phpoffice/phpexcel/Classes/PHPExcel.php';
		$phpExcel = new \PHPExcel();
		$jbxx = array('key'=>1,'value'=>'基本信息');
		array_unshift($headerArr,$jbxx);
		$new_header= array();
		for($i=0;$i<count($headerArr);$i++){
			array_push($new_header,$headerArr[$i]);
			array_push($new_header,$headerArr[$i]);
			array_push($new_header,$headerArr[$i]);
		}
		$header2 = array();		
		foreach($headerArr as $k=>$v){
			if($k == 0){
				array_push($header2,['key'=>'class','value'=>'班级']);
				array_push($header2,['key'=>'name','value'=>'姓名']);
				array_push($header2,['key'=>'sex','value'=>'性别']);
			}else{
				$kk1 = $v['key'].'_1';
				$kk2 = $v['key'].'_2';
				$kk3 = $v['key'].'_3';
				array_push($header2,['key'=>"$kk1",'value'=>'尺寸' ,'type'=>'chicun']);
				array_push($header2,['key'=>"$kk2",'value'=>'数量','type'=>'num']);
				array_push($header2,['key'=>"$kk3",'value'=>'缴费情况','type'=>'money']);
			}	
		}
		$phpExcel->setActiveSheetIndex(0); //设置当前的sheet
		$objSheet =$phpExcel->getActiveSheet(); //获取当前活动sheet
		$objSheet->setTitle($sheet); //设置标题		
		//获取列字母,设置第一行表头
		$headCharArr = $this->getHeaderChar($new_header); //A B C
		foreach ($headCharArr as $k => $v) {
			$objStyle = $objSheet->getStyle($headCharArr[$k] . '1');
			$objAlign = $objStyle->getAlignment();
			$objAlign->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //上下居中
			$objAlign->setHorizontal(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //左对齐
			$phpExcel->getActiveSheet()->setCellValue($headCharArr[$k] . '1', $new_header[$k]['value']);//先写入内容再合并单元格,否则报错			
		}
		//获取列字母,设置第二行表头
		$headCharArr2 = $this->getHeaderChar($header2); //A B C
		//dd($headCharArr2);
		foreach ($headCharArr2 as $k => $v) {
			$objStyle2 = $objSheet->getStyle($headCharArr2[$k] . '2');
			$objAlign2 = $objStyle2->getAlignment();
			$objAlign2->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //上下居中
			$objAlign2->setHorizontal(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //左对齐
			$phpExcel->getActiveSheet()->setCellValue($headCharArr2[$k] . '2', $header2[$k]['value']);//先写入内容再合并单元格,否则报错
			//$phpExcel->getActiveSheet()->mergeCells($headCharArr2[$k].'1:'.$headCharArr2[$k*3].'1');   //合并单元格
		}
		for($m=0;$m< count($headerArr);$m++){
			$a=$m*3;
			$b=$m*3+2;
			$aa = $headCharArr2[$a];
			$bb = $headCharArr2[$b];
			$phpExcel->getActiveSheet()->mergeCells($aa.'1:'.$bb.'1');
		}
		$jj = 3;
		foreach ($data as $k => $v) {   //class name 
			foreach ($header2 as $k1 => $v1) {   //key value 
				$val = @$v[$v1['key']];
				$phpExcel->getActiveSheet()->setCellValue($headCharArr2[$k1].$jj, $val);
			}
			$jj++;
		}
		$objWriter = \PHPExcel_IOFactory::createWriter($phpExcel,'Excel5');
		$fileName = $fileName.'.xls';
		//直接导出
		$copy = 'Excel5';
		$this->browserExport($copy, $fileName);
		$objWriter->save('php://output'); //输出到浏览器
		die();
	}

只用修改export方法,其他的方法照常用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值