使用PHPExcel在Excel中合并行和列的单元格

18
我需要使用PHPExcel按行和列合并Excel(xlsx)中的单元格。我尝试了以下方法。
$sheet->mergeCells("G".($row_count+1).":G".($row_count+4));             
$sheet->mergeCells("H".($row_count+1).":H".($row_count+4));             
$sheet->mergeCells("I".($row_count+1).":I".($row_count+4));     

变量$row_count的值是不可预测的动态值,如25、50、75等(没有规律模式)。

enter image description here

它将单元格合并,如上面的快照所示,可以立即在Note单元格下方看到。在按行合并这些单元格之后,我尝试按列合并它们,如下所示。
$sheet->mergeCells("G".($row_count+1).":I".($row_count+1));             

但它不起作用。当我尝试打开Excel文件时,它会要求确认(使用确认框)。

Excel在'report.xlsx'中发现无法读取的内容。您是否要恢复此工作簿的内容?如果您信任此工作簿的来源,请单击“是”。

如何在Excel中按行和列合并单元格?
6个回答

26

合并单元格只需要一个有效的单元格范围,例如A1:B2,因此您的

$sheet->mergeCells("G".($row_count+1).":I".($row_count+1));

应该可以毫无问题地工作。

您可以尝试使用简单的测试用例来证明这是否会对您的脚本造成问题,而不是其他什么原因。

编辑

重新阅读您的问题后: 您的问题可能是您尝试合并已经属于合并范围的单元格,而不是先按行合并,然后尝试按列合并,请尝试一次性合并整个范围。

$sheet->mergeCells("G".($row_count+1).":I".($row_count+4));              

@markBaker,我已经使用了PHPExcel并且只有好评。现在我正在处理一个Java项目的Aspose,并且该库存在一个限制,似乎PHPExcel也有同样的问题...我们不能合并已经合并的单元格和新的单元格。你知道为什么吗? - periback2
主要是因为在代码中处理起来很麻烦,并且每次合并时都会增加额外的开销,需要测试它是否是任何现有合并的一部分并将两者合并在一起......而且当它这样做时无法提供任何反馈。 - Mark Baker
这对我没用,我正在使用maatwebsite v2.1.0。 - Angel

11

有一种单元格合并的方法

    /**
 * Set merge on a cell range by using numeric cell coordinates
 *
 * @param   int $pColumn1   Numeric column coordinate of the first cell
 * @param   int $pRow1      Numeric row coordinate of the first cell
 * @param   int $pColumn2   Numeric column coordinate of the last cell
 * @param   int $pRow2      Numeric row coordinate of the last cell
 * @throws  Exception
 * @return PHPExcel_Worksheet
 */
     public function mergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1)

4
function cellsToMergeByColsRow($start = -1, $end = -1, $row = -1){
    $merge = 'A1:A1';
    if($start>=0 && $end>=0 && $row>=0){
        $start = PHPExcel_Cell::stringFromColumnIndex($start);
        $end = PHPExcel_Cell::stringFromColumnIndex($end);
        $merge = "$start{$row}:$end{$row}";
    }
    return $merge;
}

案例补充:

$objPHPExcel->getActiveSheet()->mergeCells(cellsToMergeByColsRow(0,2,3))

3
我编写了一个简单的函数,用于计算要按列和行合并的单元格。
function cellsToMergeByColsRow($start = NULL, $end = NULL, $row = NULL){
    $merge = 'A1:A1';
    if($start && $end && $row){
        $start = PHPExcel_Cell::stringFromColumnIndex($start);
        $end = PHPExcel_Cell::stringFromColumnIndex($end);
        $merge = "$start{$row}:$end{$row}";

    }

    return $merge;
}

并调用

$sheet->mergeCells(cellsToMergeByColsRow($col, $col+5, $row));

感谢 @Mark Baker

你可能想要使用内置的辅助函数PHPExcel_Cell::columnIndexFromString()和PHPExcel_Cell::stringFromColumnIndex(),而不是自己编写chr/floor等函数,因为它们已经内置了。 - Mark Baker
感谢提及这些辅助工具。 - jashk

1
$sheet -> mergeCellsByColumnAndRow($col1, $row1, col2, row2);

是函数。


1
我也在寻找解决这个问题的方法,我想合并单元格并将内容(值)放置在其中。经过一番搜索,我找到了一些解决方案,但由于我正在使用Maatawebsite获取Excel文件,所以没有进行检查。
但任何人都可以尝试一下。解决方案基于PHPExcel,不确定它是否适用于Maatawebsite。 源链接 从A列第1行合并到E列第1行。
$objPHPExcel->getActiveSheet()->mergeCells('A1:E1');

// add some text
$objPHPExcel->getActiveSheet()->setCellValue('A1','The quick brown fox.'); 

合并从A列第1行到E列第3行。
$objPHPExcel->getActiveSheet()->mergeCells('A1:E3');

// add some text
$objPHPExcel->getActiveSheet()->setCellValue('A1','The quick brown fox.');

我查看了maatawebsite文档,发现他们有相同的方法mergeCells。所以我认为这个方法可以使用。
这个解决方案来自Maatawebste。
$sheet->cells('A1:C1', function($cells) {
    $cells->setBorder('thin', 'thin', 'thin', 'thin');
});
$sheet->mergeCells('A1:C1');

第二个解决方案
$sheet->setMergeColumn(array(
'columns' => array('A','B','C','D'),
'rows' => array(
array(2,3),
array(5,11),
)
));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接