qishu_qiu 2019-10-17 17:30 采纳率: 0%
浏览 258

phpExcel 竖向合并单元格 导致CPU占用100%

phpExcel 导出 竖向合并单元格 导致CPU占用100%

foreach($data as $key => item) {
            $j = $i + 1;
            foreach ($item['examiner'] as $k => $examiner) {
                    if ($k == 0) {
                        $objPHPExcel->getActiveSheet()->setCellValue('A' . ++$i, ($key + 1));
                        $objPHPExcel->getActiveSheet()->setCellValue('B' . $i, $item['province']);
                        $objPHPExcel->getActiveSheet()->setCellValue('C' . $i, $item['city']);
                    } else {
                        ++$i;
                    }

                    $objPHPExcel->getActiveSheet()->setCellValue('K' . $i, $examiner['not_pass_num']);
                    $objPHPExcel->getActiveSheet()->setCellValue('L' . $i, $examiner['unqualified']);
                    $objPHPExcel->getActiveSheet()->setCellValue('M' . $i, $examiner['money_total']);
                    $objPHPExcel->getActiveSheet()->setCellValue('N' . $i, $examiner['examiner_money']);
                    $objPHPExcel->getActiveSheet()->getRowDimension($i)->setRowHeight(32);
                }
                if ($i > $j) {
                    $objPHPExcel->getActiveSheet()->mergeCells("A{$j}:A{$i}");
                    $objPHPExcel->getActiveSheet()->mergeCells("B{$j}:B{$i}");
                    $objPHPExcel->getActiveSheet()->mergeCells("C{$j}:C{$i}");
                }
            }
 };

这段代码本地执行没有任何问题 放到服务器上 执行 进程就会占用100% CPU(持续占用)
经调试 发现 注释掉 $objPHPExcel->getActiveSheet()->mergeCells("A{$j}:A{$i}"); 这些纵向合并单元格的代码 再执行 进程就会恢复正常
哪位大佬知道这是怎么回事 帮帮忙!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 22:23
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题可能是因为在PHP Excel中,当你尝试合并多个行时,可能会导致内存泄漏或者资源消耗过大。这可能是由于一些计算操作导致的结果超过缓存大小而触发的。

    你可以通过以下方式来解决这个问题:

    1. 使用 PHPExcel_Cached_SingleFile 类型的 PHPExcel 实例:如果你的 PHP 文件很大,你可能需要使用 PHPExcel_Cached_SingleFile 类型的实例,它会自动管理文件的读取和写入,并且会避免不必要的内存分配。

    2. 在你的循环中添加一个检查条件,只进行横向合并而不进行纵向合并。例如:

    foreach ($data as $key => $item) {
        // 横向合并单元格
        $objPHPExcel->getActiveSheet()->setCellValue('A1', $key+1);
        $objPHPExcel->getActiveSheet()->setCellValue('B1', $item['province']);
        $objPHPExcel->getActiveSheet()->setCellValue('C1', $item['city']);
    
        // 循环处理每个列
        for ($i = 2; $i <= count($item['examiner']); $i++) {  
            $objPHPExcel->getActiveSheet()->setCellValue('K'.$i, $item['examiner'][$i-2]['not_pass_num']);
            $objPHPExcel->getActiveSheet()->setCellValue('L'.$i, $item['examiner'][$i-2]['unqualified']);
            $objPHPExcel->getActiveSheet()->setCellValue('M'.$i, $item['examiner'][$i-2]['money_total']);
            $objPHPExcel->getActiveSheet()->setCellValue('N'.$i, $item['examiner'][$i-2]['examiner_money']);
        }
    }
    
    1. $objPHPExcel->getActiveSheet()->getRowDimension($i)->setRowHeight(32); 更改为 $objPHPExcel->getActiveSheet()->setRowHeight(32); 或者 $objPHPExcel->getActiveSheet()->getWorksheet()->setRowHeight(32);,以减少内存消耗。
    2. 如果以上方法仍然无法解决问题,请考虑使用其他库或框架来处理表格数据的合并,例如 TableGen 库,它可以提供更高效的数据合并功能。

    希望这些信息能帮助到你!

    评论

报告相同问题?