Решение для копирования стиля с 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. Это дает небольшой удар производительности, в зависимости от количества используемых стилей... Я постараюсь получить более быструю версию завтра вечером