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