Решение для копирования стиля с PHPExcel

Я хочу скопировать информацию о стиле из ячеек в диапазоны, например Format Painter в Excel. В документации написано что-то вроде этого:

$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 ответов


один workround для вас может быть использовать индексы стиля 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);
    }
}

редактировать

кроме того, примените исправление к методу duplicateStyle() в Classes/PHPExcel/Worksheet.в PHP

строки 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();
}

аналогично в методе applyFromArray () в Классы/PHPExcel/Стиль.в PHP

строки 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();
}

EDIT #2

исправление теперь было перенесено в ветку разработки на github. Это дает небольшой удар производительности, в зависимости от количества используемых стилей... Я постараюсь получить более быструю версию завтра вечером