2013-08-15 31 views
7

Stil bilgilerini hücre biçiminde Excel'deki Biçim Boyacısı gibi aralıklara kopyalamak istiyorum. E100 hücre B1 stilini olsun: D100 ve E1:Stil kopyalamak için geçici çözüm PHPExcel

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

D1 hem çünkü bir hata olduğu görülmektedir: dokümantasyon böyle bir şey yapmak için söylüyor. İki satırın sırasını değiştirirsem, her iki aralık da stili A1'den alır. Benzer şekilde, D1

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

sonuçları: D100 hücre B1 stil bilgisi alma. Son getStyle değeri tüm duplicateStyle sonuçlarında kullanılır.

Eminim PHPExcel'in gelecekteki bir sürümünün bir düzeltmesi olacağından eminim, o zamana kadar bir çalışmayı anlamaya ihtiyacım var.

cevap

13

Bir workround stil xf dizinleri kullanmayı olabilir için: aralığındaki tüm hücrelerin xfIndex için bu değeri ayarlamak için Sonra

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

for ($col = 'D'; $col != 'E'; ++$col) { 
    for ($row = 1; $row <= 100; ++$row) { 
     $activeSheet->getCell($col . $row)->setXfIndex($xfIndex); 
    } 
} 

DÜZENLEME

Alternatif olarak, Classes/PHPExcel/Worksheet.php

numaralı makalede duplicateStyle() yöntemine düzeltme uygulayın

hatları 1479, o anda okunmakta:

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(); 
} 

değişimi için: Classes'daki applyFromArray() yönteminde Benzer

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(); 
} 

/PHPExcel/Style.php

satır 425-432 Şu anda okuyun:

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(); 
} 

Şuna değiştirin:

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(); 
} 

DÜZENLEME 2.

Fix şimdi github geliştirmek dalına itilmiştir. Kullanımdaki stil sayısına bağlı olarak hafif bir performans vuruşu verir ... Yarın gece daha hızlı bir versiyona girerim ve deneyeceğim.

+1

Teşekkürler Mark - yamalar mükemmel çalıştı. Harika bir ürün için iç destek. –

+0

getXfIndex() ve setXfIndex() yöntemlerini son derece yararlı buldum. Bu acımasızlık PHPExcel'in doktoru çok seyrek çünkü bu cevap olmadan bir Xf'in ne olduğunu asla tahmin edemezdim. – soger

+1

@soger - Microsoft belgelerinden ne 'xf' ne olduğunu anlamaya gayet eğlenceli. –

İlgili konular