如何在 PHPExcel 中合并具有相同值的行,使用 if 逻辑进行数组循环

How to merge row with same value in PHPExcel, array looping with if logic

我需要 phpexcel 中循环逻辑的帮助,它可以合并具有相同事务 ID 的行

这是示例代码

foreach ($transaction as $key => $value) {
     // I need if condition for $merge (ex. N4:N5)
     $excel->getActiveSheet()->mergeCells($merge);
}

我尝试了一些比较上次循环交易 ID 和当前交易 ID 的逻辑。但是我的逻辑还是不好,不太行。

我想要这样的结果

以下解决方案是使用 PHPSpreadSheet PHPExcel 的升级版开发的。但是,您应该可以将方法调整为 PHPExcel,因为逻辑应该是相同的。

主要逻辑是(对于每个循环):

  • 如果代码为空,请检查或标记当前发票代码
  • 设置下一个发票代码,从下一行的值中获取
  • 根据以下条件渲染合并:
    • 当前行是否等于或大于发票代码行的开头
    • 如果上一个发票代码与下一个发票代码不同(或者如果下一个发票代码为空(这标志着记录结束))
  • 最后,使用 mergeCells() 方法渲染合并:

    $spreadsheet->getActiveSheet()->mergeCells($cellToMerge);
    

完整示例代码:

<?php
require_once('vendor/autoload.php');

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$path = dirname(__FILE__);

$data = array(
    array(1, 'INV201806001', '1000'),
    array(2, 'INV201806001', '1000'),
    array(3, 'INV201806002', '0'),
    array(4, 'INV201807001', '1000'),
    array(5, 'INV201807001', '1000'),
    array(6, 'INV201807001', '1000'),
    array(7, 'INV201807002', '0'),
    array(8, 'INV201807002', '0'),
);

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();

$row = 3;
$startRow = -1;
$previousKey = '';
foreach($data as $index => $value){
    if($startRow == -1){
        $startRow = $row;
        $previousKey = $value[1];
    }
    $sheet->setCellValue('C' . $row, $value[0]);
    $sheet->setCellValue('D' . $row, $value[1]);
    $sheet->setCellValue('E' . $row, $value[2]);
    $nextKey = isset($data[$index+1]) ? $data[$index+1][1] : null;

    if($row >= $startRow && (($previousKey <> $nextKey) || ($nextKey == null))){
        $cellToMerge = 'E'.$startRow.':E'.$row;
        $spreadsheet->getActiveSheet()->mergeCells($cellToMerge);
        $startRow = -1;
    }

    $row++;
}

$writer = new Xlsx($spreadsheet);
$writer->save('test-xls-merge.xlsx');

以上代码截图如下: