9

Excel の Format Painter のように、スタイル情報をセルから範囲にコピーしたい。ドキュメントには、次のようなことをするように書かれています:

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

D1:D100 と E1:E100 の両方がセル B1 からスタイルを取得するため、バグがあるようです。2 つの線の順序を変更すると、両方の範囲が A1 からスタイルを取得します。同様に、

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

D1:D100 はセル B1 からスタイル情報を取得します。最後の getStyle 値がすべての duplicateStyle 結果で使用されます。

PHPExcel の将来のリリースで修正されると確信しています。それまでは、回避策を見つける必要があります。

4

1 に答える 1

13

1 つの回避策として、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 の開発ブランチにプッシュされています。使用しているスタイルの数によっては、パフォーマンスがわずかに低下します...明日の夜、より高速なバージョンを取得してみます

于 2013-08-15T21:59:51.327 に答える