使用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的未来版本将有一个修复,我只需要找到一个解决方法,直到那时.

一个workround for you可能是使用样式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

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

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...