·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

PHPExcel 行合并、列合并、设置背景颜色实战

541 1
发表于 2023-4-22 09:04:13 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
PHPExcel 行合并、列合并、设置背景颜色实战 合并,设置,背景,背景颜色,颜色
需求:运营需要实现导出上面报表,格式为excel,方便作二次统计。
一看到这个报表当场就懵了,又是行合并,又是列合并,又是背景色。HTML页面的话,还好说。但导出报表为Excel就……唉,老板的需求,硬着头皮也要完工。

接招吧,码农:
  1. import('ORG.phpexcel.PHPExcel', '', '.php');
  2. $objPHPExcel  = new PHPExcel();
  3. $objWorksheet = $objPHPExcel->getActiveSheet();
  4. $objWorksheet->setTitle('群组数据'); //给当前sheet设置名称
  5. //设置列宽
  6. $istart = ord('A') - 65;
  7. $iend   = ord('R') - 65;
  8. for($i = $istart; $i <= $iend; $i++){
  9.     $col_width = in_array($i, [1,3,7, 8, 15, 16, 17]) ? 19 : 11;
  10.     $objWorksheet->getColumnDimension( chr(ord('A') + $i) )->setWidth($col_width);//setAutoSize(true)不起作用
  11. }
  12. $hcenter      = PHPExcel_Style_Alignment::HORIZONTAL_CENTER;//水平居中
  13. $vcenter      = PHPExcel_Style_Alignment::VERTICAL_CENTER;//上下居中
  14. //搜索条件:
  15. $objWorksheet->setCellValue('A1', '群组ID');
  16. $objWorksheet->setCellValue('B1', $search['group_id'])->getStyle('B1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
  17. $objWorksheet->setCellValue('D1', '数据更新完成时间');
  18. $objWorksheet->setCellValue('E1', $search['group_time'])->getStyle('E1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
  19. $objWorksheet->setCellValue('G1', '选取时间');
  20. $objWorksheet->setCellValue('H1', $search['start_time'])->getStyle('H1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
  21. $objWorksheet->setCellValue('I1', $search['end_time'])->getStyle('I1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
  22. $objWorksheet->setCellValue('L1', '优惠券ID');
  23. $objWorksheet->setCellValue('M1', $search['coupon_id'])->getStyle('M1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
  24. //数据表头
  25. $bt     = ['群组ID', '数据更新完成时间', '总人数', '回访人数', '用券人数', '订单量', '销售额', '使用券的销售额', '购买人数','订单价', '平均回访天数', '平均购买天数'];//
  26. $bt_sub = ['0-20', '21-50', '51-70', '71-100', '101-200', '200以上'];
  27. foreach($bt as $k => $v) {
  28.     $col       = chr(65 + $k);
  29.     if($v == '平均回访天数'){
  30.         $col   = 'P';
  31.     }elseif($v == '平均购买天数'){
  32.         $col   = 'Q';
  33.     }
  34.     $mergeLine = $col.'3:'.$col.'4';
  35.     $celV      = $col.'3';
  36.     $mergeCol  = 'K3:O3';
  37.     if($v == '订单价'){
  38.         $objWorksheet->mergeCells($mergeCol)->setCellValue('K3', $v)->getStyle('K3')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
  39.         $objWorksheet->getStyle('K3')->getAlignment()->setHorizontal($hcenter);
  40.         foreach($bt_sub as $kk => $vv){
  41.             $cel = chr(ord('K') + $kk) . '4';
  42.             $objWorksheet->setCellValue($cel, $vv)->getStyle($cel)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('fce4d6');
  43.             $objWorksheet->getStyle($cel)->getAlignment()->setHorizontal($hcenter);
  44.         }
  45.     }
  46.     $objWorksheet->mergeCells($mergeLine)->setCellValue($celV, $v)->getStyle($celV)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
  47.     $objWorksheet->getStyle($celV)->getAlignment()->setHorizontal($hcenter);
  48.     $objWorksheet->getStyle($celV)->getAlignment()->setVertical($vcenter);
  49. }
  50. //数据体
  51. foreach($datalist as $k => $v){
  52.     $lineno3   = ($k == 0 ?  5  : ($k + 5));
  53.     $objWorksheet->setCellValue(chr(ord('A')).$lineno3, $v['qun_id']);
  54.     $objWorksheet->setCellValue(chr(ord('B')).$lineno3, $v['update_time']);
  55.     $objWorksheet->setCellValue(chr(ord('C')).$lineno3, $v['members']);
  56.     $objWorksheet->setCellValue(chr(ord('D')).$lineno3, $v['view_nums']);
  57.     $objWorksheet->setCellValue(chr(ord('E')).$lineno3, $v['coupon_user']);
  58.     $objWorksheet->setCellValue(chr(ord('F')).$lineno3, $v['orders']);
  59.     $objWorksheet->setCellValue(chr(ord('G')).$lineno3, $v['sales_money']);
  60.     $objWorksheet->setCellValue(chr(ord('H')).$lineno3, $v['coupon_money']);
  61.     $objWorksheet->setCellValue(chr(ord('I')).$lineno3, $v['buyers']);
  62.     $objWorksheet->setCellValue(chr(ord('J')).$lineno3, $v['buyer_0_20']);
  63.     $objWorksheet->setCellValue(chr(ord('K')).$lineno3, $v['buyer_21_50']);
  64.     $objWorksheet->setCellValue(chr(ord('L')).$lineno3, $v['buyer_51_70']);
  65.     $objWorksheet->setCellValue(chr(ord('M')).$lineno3, $v['buyer_71_100']);
  66.     $objWorksheet->setCellValue(chr(ord('N')).$lineno3, $v['buyer_101_200']);
  67.     $objWorksheet->setCellValue(chr(ord('O')).$lineno3, $v['buyer_200_']);
  68.     $objWorksheet->setCellValue(chr(ord('P')).$lineno3, $v['view_days_avg']);
  69.     $objWorksheet->setCellValue(chr(ord('Q')).$lineno3, $v['buy_days_avg']);
  70. }
  71. $filename = $sheet_title.".xlsx";
  72. $ua       = $_SERVER["HTTP_USER_AGENT"];
  73. $encoded_filename = urlencode($filename);
  74. $encoded_filename = str_replace("+", "%20",$encoded_filename);
  75. header('Content-Type: application/octet-stream');
  76. if (preg_match("/MSIE/", $ua)) {
  77.     $filename = $encoded_filename;
  78.     header('Content-Disposition: attachment;filename="' .$filename . '"');
  79. }else if (preg_match("/Firefox/", $ua)){
  80.     header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
  81. }else {
  82.     header('Content-Disposition: attachment; filename="' . $filename . '"');
  83. }
  84. ////////////////////////////////////////
  85. header('Cache-Control: max-age=0');
  86. // If you're serving to IE 9, then the following may be needed
  87. header('Cache-Control: max-age=1');
  88. // If you're serving to IE over SSL, then the following may be needed
  89. header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
  90. header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
  91. header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
  92. header ('Pragma: public'); // HTTP/1.0
  93. $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
  94. $objWriter->save('php://output');
  95. exit();
复制代码

唉,终于可以小小的休息一下了,明天继续加班。
我要说一句 收起回复

评论1

Discuz智能体Lv.8 发表于 2025-3-17 03:18:48 | 查看全部
你提供的代码已经很好地展示了如何使用 PHPExcel 进行 Excel 文件的生成、样式设置、单元格合并以及背景颜色的设置。以下是对代码的详细解释和一些优化建议:

### 1. **PHPExcel 的导入与初始化**
  1. import('ORG.phpexcel.PHPExcel', '', '.php');
  2. $objPHPExcel  = new PHPExcel();
  3. $objWorksheet = $objPHPExcel->getActiveSheet();
  4. $objWorksheet->setTitle('群组数据'); //给当前sheet设置名称
复制代码

- `import` 函数用于导入 PHPExcel 类库。
- `$objPHPExcel` 是 PHPExcel 的实例,表示一个 Excel 文件。
- `$objWorksheet` 是当前活动的工作表,通过 `setTitle` 方法设置工作表的名称。

### 2. **设置列宽**
  1. $istart = ord('A') - 65;
  2. $iend   = ord('R') - 65;
  3. for($i = $istart; $i <= $iend; $i++) {
  4.     $col_width = 15; // 设置列宽为15
  5.     $objWorksheet->getColumnDimension( chr(ord('A') + $i) )->setWidth($col_width);
  6. }
复制代码

- 通过 `getColumnDimension` 方法获取列对象,并使用 `setWidth` 方法设置列宽。
- `chr(ord('A') + $i)` 用于动态生成列字母(A, B, C, ..., R)。

### 3. **设置单元格样式**
  1. $hcenter = PHPExcel_Style_Alignment::HORIZONTAL_CENTER; //水平居中
  2. $vcenter = PHPExcel_Style_Alignment::VERTICAL_CENTER; //上下居中
复制代码

- `HORIZONTAL_CENTER` 和 `VERTICAL_CENTER` 分别用于设置单元格内容的水平和垂直居中。

### 4. **设置单元格背景颜色**
  1. $objWorksheet->setCellValue('B1', $search)->getStyle('B1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
复制代码

- `setCellValue` 方法用于设置单元格的值。
- `getStyle` 方法获取单元格的样式对象。
- `getFill` 方法获取填充对象,`setFillType` 设置填充类型为实心填充(`FILL_SOLID`)。
- `getStartColor` 方法获取颜色对象,`setRGB` 方法设置颜色为指定的 RGB 值。

### 5. **合并单元格**
  1. $objWorksheet->mergeCells('K3:O3')->setCellValue('K3', $v)->getStyle('K3')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB('f8cbad');
复制代码

- `mergeCells` 方法用于合并单元格,参数为合并的单元格范围(如 `K3:O3`)。
- 合并后,设置合并区域的单元格值和样式。

### 6. **填充数据**
  1. foreach($datalist as $k => $v){
  2.     $lineno3 = ($k == 0 ?  5  : ($k + 5));
  3.     $objWorksheet->setCellValue(chr(ord('A')).$lineno3, $v);
  4.     // 其他列的数据填充...
  5. }
复制代码

- 通过循环 `$datalist` 数组,将数据填充到 Excel 的相应单元格中。
- `chr(ord('A'))` 用于动态生成列字母。

### 7. **导出 Excel 文件**
  1. $filename = $sheet_title.".xlsx";
  2. header('Content-Type: application/octet-stream');
  3. header('Content-Disposition: attachment; filename="' . $filename . '"');
  4. $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
  5. $objWriter->save('php://output');
  6. exit();
复制代码

- 设置 HTTP 头信息,指定文件类型和文件名。
- 使用 `PHPExcel_IOFactory::createWriter` 方法创建 Excel 写入器,并保存为 Excel2007 格式。
- `$objWriter->save('php://output')` 将文件输出到浏览器。

### 8. **优化建议**
- **代码复用**:可以将设置单元格样式、背景颜色、合并单元格等操作封装成函数,减少代码重复。
- **异常处理**:在文件导出时,建议添加异常处理机制,确保在出现错误时能够捕获并处理。
- **性能优化**:如果数据量较大,可以考虑分批写入数据,避免内存溢出。

### 9. **示例优化代码**
  1. function setCellStyle($objWorksheet, $cell, $value, $bgColor = null, $hAlign = null, $vAlign = null) {
  2.     $objWorksheet->setCellValue($cell, $value);
  3.     $style = $objWorksheet->getStyle($cell);
  4.     if ($bgColor) {
  5.         $style->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setRGB($bgColor);
  6.     }
  7.     if ($hAlign) {
  8.         $style->getAlignment()->setHorizontal($hAlign);
  9.     }
  10.     if ($vAlign) {
  11.         $style->getAlignment()->setVertical($vAlign);
  12.     }
  13. }

  14. // 使用示例
  15. setCellStyle($objWorksheet, 'B1', $search, 'f8cbad', $hcenter, $vcenter);
复制代码


通过以上优化,代码将更加简洁、易读,并且易于维护。希望这些建议对你有所帮助!如果有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.220.25.158,GMT+8, 2025-3-31 07:14 , Processed in 0.434340 second(s), 80 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表