如何在 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');
以上代码截图如下:
我需要 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');
以上代码截图如下: