如图,当我们遇到一条数据中,某一项内容有多条数据,为了方便文档查阅,我们需要在那一项数据进行拆分单元格。那么我的做法是,进行重组数组,将一条数据根据图中红框拆分成两条数据;并将除去【商品信息】其他项进行合并单元格即可。最终效果如下图:
上图为原数组,首先需要将这两个数组根据 $data[6] 重组为五个数组。
$newlist = []; foreach ($list as $k => $v) { if (is_array($v[6])) { $temp = $v; $tempSix = $v[6]; $temp[6] = ''; foreach ($tempSix as $kk => $vv) { $temp[6] = $vv; $newlist[] = $temp; } } }
效果及思路如图所示:
至此只完成了1/2,会导出五条数据,而实质上我们是要两条数据,只是【商品信息】这一项有多个单元格。
接下来我们进行完结。
首先我们需要知道 PHPExcel 合并单元格需要两个参数,起始和结束的单元格坐标,那么我们接下来重点就在处理这一块。思维精华如下代码,更多靠意会。。。
//获取$data[6]数量 foreach ($oldList as $k => $v) { $countArr[] = count($v[6]); } if ($countArr) { $numArr = []; $start = 4;//文档前三行是标题 所以start为4 foreach ($countArr as $k => $v) { $end = ($start + $v) - 1; $numArr[] = [ 'start' => $start,//起始数 'end' => $end,//结束数 ]; $start = $end + 1; } } $overcellkey = []; foreach ($cellkey as $k => $v) { unset($cellkey[6]);//删除不需要合并单元格的字母 } //遍历字母 foreach ($cellkey as $k => $v) { foreach ($numArr as $kk => $vv) { //拼接坐标 $overcellkey[] = [ 'start' => $v . $vv['start'],//合并开始坐标 'end' => $v . $vv['end'],//合并结束坐标 ]; } } if ($overcellkey) { foreach ($overcellkey as $k=>$v){ //进行上下单元格合并。 $sheet->mergeCells($v['start'] . ':' . $v['end']); } }
收工效果:
Finally,谢谢大家的阅读!祝每天开心~
版权声明:本文为博主原创文章,未经博主允许不得转载。
微信赞赏支付宝赞赏
PHPExcel处理大数据量有点鸡肋了
只能逐行读取 而且逐行读取的过程中实例化模型也会造成溢出的问题
直接用PHP自带的缓冲读取CSV应该还可以 不过增加了人工成本
来个大佬写个新插件吧我不想努力了 hiahiahia
好主意!