使用PHPExcel复制样式的解决方法

时间:2013-08-15 17:35:12

标签: phpexcel

我想将样式信息从单元格复制到范围,例如Excel中的Format Painter。文档说要做这样的事情:

$activeSheet->duplicateStyle($activeSheet->getStyle('A1'), 'D1:D100');
$activeSheet->duplicateStyle($activeSheet->getStyle('B1'), 'E1:E100');

似乎有一个错误,因为D1:D100和E1:E100都从单元格B1获取样式。如果我改变两条线的顺序,两个范围都从A1获得样式。同样,

$styleA = $activeSheet->getStyle('A1');
$styleB = $activeSheet->getStyle('B1');
$activeSheet->duplicateStyle($styleA, 'D1:D100');

导致D1:D100从单元格B1获取样式信息。最后一个getStyle值用于所有duplicateStyle结果。

我确信PHPExcel的未来版本将有一个修复,我只需要找到解决办法。

1 个答案:

答案 0 :(得分:13)

您可以使用xf索引:

样式
$xfIndex = $activeSheet->getCell('A1')->getXfIndex();

然后为范围

中所有单元格的xfIndex设置该值
for ($col = 'D'; $col != 'E'; ++$col) {
    for ($row = 1; $row <= 100; ++$row) {
        $activeSheet->getCell($col . $row)->setXfIndex($xfIndex);
    }
}

修改

或者,将修复应用于Classes / PHPExcel / Worksheet.php中的duplicateStyle()方法

第1479至1486行目前已阅读:

if ($this->_parent->cellXfExists($pCellStyle)) {
    // there is already this cell Xf in our collection
    $xfIndex = $pCellStyle->getIndex();
} else {
    // we don't have such a cell Xf, need to add
    $workbook->addCellXf($pCellStyle);
    $xfIndex = $pCellStyle->getIndex();
}

更改为:

if ($existingStyle = $this->_parent->getCellXfByHashCode($pCellStyle->getHashCode())) {
    // there is already such cell Xf in our collection
    $xfIndex = $existingStyle->getIndex();
} else {
    // we don't have such a cell Xf, need to add
    $workbook->addCellXf($pCellStyle);
    $xfIndex = $pCellStyle->getIndex();
}

类似于Classes / PHPExcel / Style.php中的applyFromArray()方法

第425至432行目前已阅读:

if ($workbook->cellXfExists($newStyle)) {
    // there is already such cell Xf in our collection
    $newXfIndexes[$oldXfIndex] = $existingStyle->getIndex();
} else {
    // we don't have such a cell Xf, need to add
    $workbook->addCellXf($newStyle);
    $newXfIndexes[$oldXfIndex] = $newStyle->getIndex();
}

更改为:

if ($existingStyle = $workbook->getCellXfByHashCode($newStyle->getHashCode())) {
    // there is already such cell Xf in our collection
    $newXfIndexes[$oldXfIndex] = $existingStyle->getIndex();
} else {
    // we don't have such a cell Xf, need to add
    $workbook->addCellXf($newStyle);
    $newXfIndexes[$oldXfIndex] = $newStyle->getIndex();
}

编辑#2

现在已将修复程序推送到github上的develop分支。根据使用的样式数量,它确实会有轻微的性能影响......明天晚上我会尝试获得更快的版本