//把要导出的数据相同的分组组成一个三维数组
$expTableData  //准备的导出数据
$res = array();
foreach($expTableData as &$val){$res[$val]['分组key'][] = $val;
}

//计算单元格合并的长度

foreach (array_values($res) as $k=>$v) {if ($k == 0) {$num1 = 3;$num2 = $num1+count($v)-1;}else {$num1 = $num2+1;$num2 = $num1+count($v)-1;}echo $num1.'-'.$num2;$objActSheet->mergeCells('A'.$num1.':A'.$num2);//合并单元格$objActSheet->mergeCells('B'.$num1.':B'.$num2);//合并单元格$objActSheet->mergeCells('C'.$num1.':C'.$num2);//合并单元格$objActSheet->mergeCells('D'.$num1.':D'.$num2);//合并单元格
}
完整代码
public function exportExcel_1($expTitle, $expCellName, $expTableData, $expColor = [], $fixed = 0, $title = null, $othTitle = [])
{// $expTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称$fileName = $expTitle.date('_YmdHis');//or $xlsTitle 文件名称可根据自己情况设定$cellNum = count($expCellName);$dataNum = count($expTableData);vendor('PHPExcel.PHPExcel');$objPHPExcel = new \PHPExcel();$cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');// echo $cellNum . '==' . $dataNum;die;/* 设置当前的sheet */$objActSheetIndex = $objPHPExcel->setActiveSheetIndex(0);$objActSheet = $objPHPExcel->getActiveSheet(0);/* sheet标题 */$objActSheet->setTitle($expTitle);$ascii = 65;$cv = '';if ($title) {$objActSheetIndex->setCellValue('A1', $expTitle);} else {$objActSheetIndex->setCellValue('A1', $expTitle.'  Export time:'.date('Y-m-d H:i:s'));}$i = 2;if ($othTitle) {foreach($othTitle as $val) {$ascii = 65;foreach ($val as $k=>$one) {$objActSheet->setCellValue($cv.chr($ascii). $i, $one);if ($k == 1) {$objActSheet->mergeCells($cv.chr($ascii).$i.':'.$cellName[$cellNum-1]. $i);}$ascii++;if($ascii == 91){$ascii = 65;$cv .= chr(strlen($cv)+65);}}$i++;}}$ascii = 65;foreach($expCellName as $key => $field){$objActSheet->setCellValue($cv.chr($ascii). $i, $field[1]);$ascii++;if($ascii == 91){$ascii = 65;$cv .= chr(strlen($cv)+65);}}$ascii = 65;$cv = '';$i ++;$width = [];$res = array();foreach($expTableData as &$val){$res[$val['xzbIds']][]= $val;foreach($expCellName as $field){// if ($fixed) {//     $tmpLen = mb_strlen($field[1]);//     if ($tmpLen > 20 ) {var_dump($field);die;//        // $objActSheet->getColumnDimension($cv.chr($ascii))->setAutoSize(true);//        $objActSheet->getColumnDimension($cv.chr($ascii))->setWidth(mb_strlen($field[1]));//        if (isset($width[$cv.chr($ascii)])) {//           $width[$cv.chr($ascii)] = $width[$cv.chr($ascii)] > $tmpLen ? $width[$cv.chr($ascii)] : $tmpLen;//        } else {//           $width[$cv.chr($ascii)] =  $tmpLen;//        }//     } else {//        $objActSheet->getColumnDimension($cv.chr($ascii))->setWidth('15');//     }// } else {//     $objActSheet->getColumnDimension($cv.chr($ascii))->setWidth('15');// }$objActSheet->getColumnDimension($cv.chr($ascii))->setWidth('15');if(isset($field[2])) {switch ($field[2]) {//防止使用科学计数法,在数据前加空格case 'longNumber':$objActSheet->setCellValue($cv.chr($ascii).$i, ' '.$val[$field[0]]);break;case 'datetime':$objActSheet->setCellValue($cv.chr($ascii).$i, date('Y-m-d',$val[$field[0]]));break;default:$objActSheet->setCellValue($cv.chr($ascii).$i, $val[$field[0]]);break;}} else {$objActSheet->setCellValue($cv.chr($ascii).$i, $val[$field[0]]);}$ascii++;if($ascii == 91){$ascii = 65;$cv .= chr(strlen($cv)+65);}}$ascii = 65;$cv = '';$i++;}$num2 = 0;foreach (array_values($res) as $k=>$v) {if ($k == 0) {$num1 = 3;$num2 = $num1+count($v)-1;}else {$num1 = $num2+1;$num2 = $num1+count($v)-1;}echo $num1.'-'.$num2;$objActSheet->mergeCells('A'.$num1.':A'.$num2);//合并单元格$objActSheet->mergeCells('B'.$num1.':B'.$num2);//合并单元格$objActSheet->mergeCells('C'.$num1.':C'.$num2);//合并单元格$objActSheet->mergeCells('D'.$num1.':D'.$num2);//合并单元格}/* 生成到浏览器,提供下载 */ob_end_clean();  //清空缓存header("Pragma: public");header("Expires: 0");//header("Cache-Control:must-revalidate,post-check=0,pre-check=0");//header("Content-Type:application/force-download");//header('Content-type:application/vnd.ms-excel;charset=utf-8');header("Content-Type:application/octet-stream");//header("Content-Type:application/download");$user_agent = $_SERVER['HTTP_USER_AGENT'];if(preg_match("/MSIE/", $user_agent) || preg_match("/Trident/", $user_agent)){$fileName = str_replace('+','%20',urlencode($fileName));header('content-disposition:attachment; filename="'.$fileName.'.xlsx"');}else if(preg_match("/Firefox/", $user_agent)){header("content-disposition:attachment; filename*=\"utf8''".$fileName.'.xlsx"');}else{header('content-disposition:attachment; filename="'.$fileName.'.xlsx"');}//header("Content-Transfer-Encoding:binary");//处理表格颜色if ($expColor) {foreach ($expColor as $one) {$tmp = $one['letters'][0] . $one['num'][0] . ':' . $one['letters'][1] . $one['num'][1];$tmpColor = $one['color'];$objPHPExcel->getActiveSheet()->getStyle($tmp)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);$objPHPExcel->getActiveSheet()->getStyle($tmp)->getFill()->getStartColor()->setARGB($tmpColor);}}//冻结表头if ($fixed) {// $objPHPExcel->getActiveSheet()->getStyle()->getFont()->setSize(10);//固定表头 $fixed 代表需要固定的行 第一行为2 第二行为3$objPHPExcel->getActiveSheet()->freezePane('A' . $fixed);$objPHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);$styleThinBlackBorderOutline = array('borders' => array('allborders' => array( //设置全部边框'style' => \PHPExcel_Style_Border::BORDER_THIN //粗的是thick),),);$h = 'A2:'. $cellName[$cellNum - 1]. (2 + $dataNum + + count($othTitle));$objPHPExcel->getActiveSheet()->getStyle($h)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);$objPHPExcel->getActiveSheet()->getStyle($h)->applyFromArray($styleThinBlackBorderOutline);//设置字体大小$objPHPExcel->getActiveSheet()->getStyle($h)->getFont()->setSize(10);$objPHPExcel->getActiveSheet()->getStyle('A2:' . $cellName[$cellNum - 1] . 2)->getFont()->setSize(11);$objPHPExcel->getActiveSheet()->getStyle($h)->getFont()->setBold(true);//表头设置$objPHPExcel->getActiveSheet()->getStyle( 'A1')->getFont()->setSize(22);$objPHPExcel->getActiveSheet()->getStyle('A1:'. $cellName[$cellNum - 1] . '1')->applyFromArray($styleThinBlackBorderOutline);//设置行高$objPHPExcel-> getActiveSheet()-> getRowDimension('1')-> setRowHeight(30);//设置字体加粗$objPHPExcel->getActiveSheet()->getStyle()->getFont()->setBold(true);//设置字体// $objPHPExcel->getActiveSheet()->getStyle( 'B1')->getFont()->setName('Candara' );//自适应宽度// $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setAutoSize(true);}$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');$objWriter->save('php://output');exit;
}

PHP 导出excel合并相同数据单元格相关推荐

  1. 【element-ui】 el-table 表格动态合并相同数据单元格最全教程,可指定列+自定义合并条件,附完整代码

    el-table合并单元格 1.固定合并 官方挺提供的合并具体某行列的方法:el-table合并行或列 通过给table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含 ...

  2. Excel合并多个单元格内容

    Excel合并多个单元格内容 技巧:只要在姓名后面输入分隔符,双击填充,输入等号=PH,选择PHONETIC函数,选择合并区域按回车,单元格自动换行即可

  3. Excel合并多列单元格并自动换行

    Excel合并多列单元格并自动换行 例:需要合并D9,E9,F9,G9三列,合并后D9,E9,F9,G9列内容换行 至H9 第一:设置H列自动换行 解释:但需要将单元格格式里设置"自动换行& ...

  4. java输出excel 异常处理_使用poi导出Excel,并设定单元格内容类型,抛出异常

    本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...

  5. ExcelJs导出Excel文件并设置单元格样式

    下载exceljs并引入 数据源格式:二维数组,null值是后面要合并单元格的,占个位置. //创建对象 var wb = new ExcelJS.Workbook(); //创建一个名称为Sheet ...

  6. 填报表导出excel非可写单元格锁定问题

     问题描述: 填报表单元格分为可写和不可写两种状态,当填报表在web上展现的时候可写单元格可以进行数据填报和修改,非可写单元格不可操作. 报表导出为excel时,润乾导出excel包默认情况下不对 ...

  7. POI导出支持合并表头及单元格锁定的Excel

    1.开发前提 目前项目上有这样的需求,支持Excel导出后再线下调至后导入,并且有关键字及其他部分字段不支持修改,所以需要写保护,按正常的理解来讲锁定特定的列即可,但是需求中需要在Excel中添加行数 ...

  8. excel导出java不完整_有关Java POI导出excel表格中,单元格合并之后显示不全的解决方法。...

    我在table变换excel之后发现合并的单元格不能显示全部边框,在网上找了半天解决方案,终于解决了.具体解决代码如下; /** * 设置合并单元格的边框样式 * * @param sheet 当前表 ...

  9. java导出excel_java按需导出Excel并自动合同单元格

    java导出excel并单元格自动合并 最近公司有一个需求,就是按到模版导出数据报表,并内容相同的单元格实现自动合并.具体业务设计图如下所示 需求分析 由于头部是固定不变的,先使用excel创建数据模 ...

  10. java excel 合并两个单元格内容 无法换行_12个简单高效的EXCEL小技巧,让你秒变职场达人!...

    小伙伴们早上好,今天小编和大家分享一组简单高效的Excel小技巧,点滴积累,也能提高办公效率哦. 1.填充合并单元格 在工作表中尽量不使用合并单元格,否则就是重复工作量.那么对已有合并单元格的工作表, ...

最新文章

  1. 资料验证的asp.net程序
  2. 地平线机器人提出Anchor free、NMS free的3D目标检测算法 | CVPR2020 Workshop
  3. C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件
  4. 【组合数学】生成函数 ( 正整数拆分 | 重复有序拆分 | 不重复有序拆分 | 重复有序拆分方案数证明 )
  5. python中json.load()、json.loads()、json.dump()、json.dumps()的区别
  6. SAP CRM WebClient UI的excel导出功能是否能启用,取决于这个逻辑
  7. Android View相关知识点
  8. vue 横向菜单滚动定位_使用vue组件+iscroll实现一个横向菜单,不能正确滑动
  9. c语言简单编程题模板,C语言编程题,比较简单
  10. Glomosim安装和ParseC的使用等相关链接
  11. 2021年考研经验分享(初试408分)
  12. c语言字符串常量表达,C语言基础教程:字符常量和字符串常量
  13. 你也认为技术总监应懂技术细节,那就有些可悲了
  14. Servlet实现 教师管理系统
  15. codec2中的函数命名后缀vb nb sm
  16. The Class File Viewer cannot handle the given input
  17. Netty 出站入站机制详解
  18. 西门子PLC产生随机数
  19. 【第4组】Touch组需求分析总文档 V7.0 2017/7/13
  20. Screenshot 屏幕截图

热门文章

  1. Mendeley如何设置某期刊对应的参考文献格式?
  2. Error:(199) undefined reference to `__android_log_print'
  3. VBA 根据模板批量生成工作表
  4. 常见免费邮箱 SMTP 服务地址及端口
  5. 原理图端口符号_接线图和原理图有什么区别,以电气的原理图和接线图来做详细解析...
  6. 电子设计从零开始(1)
  7. c语言指针详解参数,C语言之指针详解
  8. 邀请别人进入队伍rust,rust邀请进队 | 手游网游页游攻略大全
  9. qq空间相册查看器_python爬虫抓取QQ空间相册中的照片和视频
  10. 简单理解t检验与秩和检验