我需要 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');
这是上面代码的屏幕截图:
关于php - 如何在 PHPExcel 中合并具有相同值的行,使用 if 逻辑进行数组循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51297114/