2015-09-22 18 views
5

私はこことPHPExcelの公式ドキュメント/フォーラムの両方で可能なすべての類似のソリューションをチェックしようとしましたが、私の問題の解決策は見つかりませんでした。PHPExcel - オリジナルのスタイルを維持して元のスタイルを維持する

問題

私はクローンのスタイルを維持することにより、phpexcelを通じて作成別のファイルにそれを解析するためのシート(正直、またはコピー)クローンにしようとしていますシート

設定は次のとおりです。

sheet.xls < --- & COPY

PHPExcelオブジェクト<開くファイル - ループのためにX回作成されるファイル、私がする必要があります一連の配列に従ってYシートを追加します。

お知らせ:&追加作品美しく

クローニングをどのような作品

理由は、phpexcelファイルに関連するいくつかの奇妙な通知の時間を要するオフセット未定義:1 \ serverpath \にPHPExcel \ Classes \ PHPExcel.php on line 729

注意:定義されていないオフセット:\ serverpath \ PHPExcel \ Classes \ PHPExcel.php on line 729

お知らせ:オフセット不定:3 serverpath \で\ PHPExcel \クラスがライン上PHPExcel.phpを\ 729

お知らせ:オフセット不定:\ serverpath \ PHPExcel \クラス4は、ライン729

にPHPExcel.phpを\

EDIT :: 729はこれに言及

ライン:私の知る限りのスタイルについてです

foreach ($sheet->getCellCollection(false) as $cellID) { 
    $cell = $sheet->getCell($cellID); 
    ++$countReferencesCellXf[$cell->getXfIndex()]; // line 729 
} 

。 < - これらは数千もありますが、どこから来ているのかわからず、ファイルが正しく生成されていて、上記のようにフォーマットが失われてしまいます。オリジナルの「テンプレート」の

生成されたファイルは動作しませんが、元の形式を失うが、式を保持し、したがって、すべての単一の境界線(および任意の様式)(sheet.xls )が失われる。

コード

の関連部分私はそれがコードの1000行についてです主な理由は、ここでは実際に関連するコードを掲示しています。後の(親のforeachで起こる)の作成を保存されます

ファイル:

$file  = new PHPExcel(); 

クローニング(上記作成した後、子foreachの内部で起こる):

$sd = $objReader->load("sheet.xls"); 
$sc = $sd ->getActiveSheet()->copy(); 
$clonedSheet = clone $sc; 

が追加はは(N回起こります上記のクローニングの子供の中に):

$ficheName = "not relevant tbh and less than 31 characters"; 
$temporarySheet = clone $clonedSheet; 
$temporarySheet->setTitle($ficheName); 
$file->addSheet($temporarySheet,0); 
$file->setActiveSheetIndex($file->getIndex($temporarySheet)); 
unset($temporarySheet); 

// some actions are done here 

セービング(外側私は私がになってるExcel形式の種類について絶対に制限はありません

$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5'); 
$objWriter->save($filename); 

制限

:foreachのの、PHPExcelオブジェクトが作成される同じforeachの中で起こります私はいつもそれを使用しているので、私は2003年を使用している、私は2003年を使用している、私はいくつかのマシンは、Excel 2003で動作しますが、これまでのところ問題はなかった。

私はXLSシートを別のファイルの中にクローンすることを余儀なくされていますが、私ができる唯一の方法は同じファイルの中にシートをクローンして元のものを残して保存し、私が本当に感謝してくれるスタイルを「輸出」するチャンス。

PHPExcel clone .xlsm with macros

http://www.mindfiresolutions.com/Cloning-a-XLS-worksheet-in-PHP--Mindfire-Solutions-933.php

PHPExcel 1.8.0 - Creating many sheets by cloning a template sheet gets slower with each clone

Workaround for copying style with PHPExcel

EDITを:私はすでに確認されている何

私も試してみた:

  • ファイルを開き、元のクローニングの代わりにシートを取得する - 問題が解決しません。
  • Excel2007を読み取りと書き込みの両方で使用しようとしました。問題は解決しません。
  • 使用しないことを試みました - > copy() - 問題は解決しません。
  • phpexcelを1.8にアップデートしましたが、上記の通知は1079行目に表示されますが、同じコードを参照しています - 問題は解決しません。

答えて

6

さて、私は可能な回避策を考え出しました。

問題がとのようですので:

  • clone
  • PHPExcelワークシート->copy()プロトタイプ
  • の参照PHPExcelワークシート

私はそのことについて考えた:

  • 新しいPHPExcelオブジェクトインスタンスを作成する代わりに、元のファイルを開くだけです。
  • 同じファイルのシートをまだコピーして、同じファイルの他のインスタンスでファイルを追加します。
  • 終了時に最後のシートを取り除きます。

    $file  = $objReader->load("sheet.xlsx"); // decided to work with excel2007 
    

    をそして、この:これに

    $objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel5'); 
    $objWriter->save($filename); 
    

    :これに

    $file  = new PHPExcel(); 
    

ので、一言で言えば、私はこれを変更した

$sheetCount = $file->getSheetCount(); 
$file->removeSheetByIndex($sheetCount - 1); 

$objWriter = PHPExcel_IOFactory::createWriter($file, 'Excel2007'); // same story, excel 2007 instead of 2003 
$objWriter->save($filename); 

今、私はエラーがなく、別のより洗練された解決策があると確信していますが、すべてが期待どおりに機能しています。

1

あなたは) Aにしようとし、その後sheet.xlsの形式を変更 Bを使用しての.xlsx)の名前を変更しない場合は*の.xlsxに* .zipファイル C)解凍sheet.zip、および保存したファイルhaved D).xls/styles.xmlをシートから保存したファイルにコピーします E)* .zipを* .xlsx にリパックして名前を変更して、フォーマットを元に戻します。 phpのループでは生成せず、ループでphpを実行するだけで問題を最小限に抑えることができます。

関連する問題