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

标签 php codeigniter web phpexcel

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

这是示例代码

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

我尝试了一些逻辑,将最后一个循环事务 ID 与当前事务 ID 进行比较。但我的逻辑仍然很糟糕并且不能很好地运作。

我想要这样的结果

Goal

最佳答案

以下解决方案是使用 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');

这是上面代码的屏幕截图:

enter image description here

关于php - 如何在 PHPExcel 中合并具有相同值的行,使用 if 逻辑进行数组循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51297114/

相关文章:

html - 为什么 box-sizing 不会是 : border-box; work when applied to the container in 960. gs?

javascript - 有没有办法通过网页编辑本地文件而不需要运行服务器软件?

php - 通过 mktime 查找所有月份

php - CI 高级 SQL 查询?

php - 在 Grocery CRUD + Codeigniter 中设置控件的默认值

php - 搜索在 yii2 中不起作用

php - 如何使用 Linux 或 PHP 将文件保持在 1000 行?

php - 如何通过点击将数据从一个页面传递到另一个页面

javascript - 我想查看有多少人选择了

php - 代码点火器 SQL_CALC_FOUND_ROWS