5

自分のテンプレートファイルでphpexcelを使おうとしました。phpexcelはファイルをロードし、たとえばセルA2、A3、A4にデータを書き込み、新しいデータを含む出力ファイルを開きます。

テンプレートファイルにはグラフが組み込まれています。phpexcelで実行したいのは、セルに値を入力することだけで、グラフには触れないでください。そして、新しいファイルを開きます。(チャートをコードで作成したくないことに注意してください。チャートは、最初に作成したのと同じ形式でテンプレートにすでに存在している必要があります)。データのみを更新する必要があります。

しかし、これを行おうとすると、グラフ自体が結果のファイルから失われます。さまざまな方法を試した後、まだ失敗しました。

そして、私はhttp://phpexcel.codeplex.com/discussions/397263から次のコードを見つけました

require_once 'Classes/PHPExcel.php'; 
/** PHPExcel_IOFactory */
include 'Classes/PHPExcel/IOFactory.php';




$target ='Results/';
$fileType = 'Excel2007';   
$InputFileName = $target.'Result.xlsx';   
$OutputFileName =  $target . '_Result.xlsx';

 //Read the file (including chart template) 
$objReader = PHPExcel_IOFactory::createReader($fileType); 
$objReader->setIncludeCharts(TRUE);
$objPHPExcel = $objReader->load($InputFileName); 

 //Change the file 


$objPHPExcel->setActiveSheetIndex(0)
// Add data
            ->setCellValue('C3','10' )
            ->setCellValue('C4','20' )
            ->setCellValue('C5','30')
            ->setCellValue('C5','40' );

 //Write the file (including chart)

PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, $fileType); 
$objWriter->setIncludeCharts(TRUE);
$objWriter->save($OutputFileName);

上記のコードはExcel2010で機能し、グラフをそのまま維持します...しかし、ファイルタイプ「Excel5」を使用しようとすると機能しません。

次のエラーがスローされます。

    Fatal error: Call to undefined method PHPExcel_Reader_Excel5::setIncludeCharts()
 in D:\IT\bfstools\PHPExcel\MyExamples\test1.php on line 16

テンプレートファイルを.xlsおよび.xlsxで機能させ、テンプレートファイル内の元のグラフをすべてそのままにしておく必要がある簡単なソリューションを提供してください。結果のファイルからチャートを削除したくありません。phpexcelコードを使用してグラフを作成する予定もありません。(Excelがすべての作業を実行できるのに、なぜ不要なコードを書くのか)。

テンプレート内のすべてを使用し、セルに新しいデータを入力するだけの最も簡単な方法が必要です。また、テンプレート内の既存のグラフは自動的に公開されます。エクセルのテンプレートとチャート関数に安全に頼ることができる間、私は不必要なコードを書きたくありません。

助けてください。

4

3 に答える 3

10

これには非常に正当な理由があります。

グラフはコアでのみ実装されており、現時点ではExcel2007のリーダーとライターの場合、他のすべてのリーダーまたはライターはグラフを無視し、単に存在しないかのように扱います。来年中に他の読者/作家にチャートを展開することを意図しています。

編集

あなたのコメントから、PHPExcelがどのように機能するかをまったく理解していないことがわかりました。そのため、説明することがたくさんあります。

PHPExcelは、ブックファイルを「編集」するためのライブラリではありません。PHPExcelを使用してファイルを変更するのではなく、ファイルからロードして後でファイルに書き込むことができるPHPExcelオブジェクトを変更します。

PHPExcel Coreは、スプレッドシートのメモリ内表現であり、ワークシート、セル、画像、スタイルなどのさまざまな構成オブジェクトがすべてPHPオブジェクトとして表されます。

PHPExcelリーダーは、スプレッドシートファイルを解析し、認識するようにプログラムされたファイルからすべてのコンポーネントをロードし、それらのファイルコンポーネントから適切なPHPExcelコアオブジェクトを作成します。同等のPHPExcelコアオブジェクト(ピボットテーブルなど)がない場合、そのファイルコンポーネントを「ロード」することはできません。ローダーがファイルコンポーネントを認識するようにプログラムされていない場合、ローダーをロードすることはできません。このような場合、ファイルのこれらの要素は単に無視されます。Readerがその作業を完了すると、PHPExcelオブジェクトが存在し、スプレッドシートファイルが閉じられて忘れられます。

PHPExcel Coreオブジェクトがメモリに存在する場合、それを操作および変更したり、Core要素を追加、変更、または削除したりできる一連のメソッドがあります。ただし、これらは、PHPExcelコアを構成するワークシート、セル、スタイルオブジェクトの「メモリ内」コレクションでのみ機能します。Coreは、ファイルからロードされた、またはPHPの「newPHPExcel()」ステートメントを使用して作成されたという知識がなくても存在します。ファイルに変更を加えることはありません。

書くときは、その逆が当てはまります。各ライターはPHPExcelコアオブジェクトを取得し、適切な形式(Excel BIFF、OfficeOpenXML、HTMLなど)でファイルに書き込みます。リーダーと同様に、各ライターは、書き込みがプログラムされているPHPExcelCoreオブジェクトのみを書き込むことができます。書き込み用にプログラムされていない場合(たとえば、グラフ)、PHPExcel Coreで定義されたグラフは、その作成者がまだ書き込み方法を知らないため、無視されます。同様に、書き込み中のファイル形式でサポートされていないPHPExcel Coreに存在する機能(CSVライターのセルスタイルなど)は無視されます。

したがって、グラフなどのスプレッドシート機能をサポートするには、PHPExcel Coreオブジェクトコレクションを変更して、これらの要素の「メモリ内」表現を提供、さまざまなリーダーがこれらの要素を認識するようにプログラムされている必要があります。それらがロードしているファイルを適切なPHPExcelコアオブジェクトに変換しさまざまなライターがPHPExcelコア表現を適切なファイル表現に変換するようにプログラムされていること。

各リーダーと各ライターは個別にプログラムする必要があります。チャートは比較的新しい機能であり、1.7.7リリースでPHPExcel Coreにのみ追加されました。現時点では、Excel2007形式のリーダーとライターのみがチャート要素を認識するようにプログラムされています。これを拡張して他の形式もカバーすることは開発者の意図ですが、必要なコードは自動的に作成されません。個々のリーダーとライターのプログラミングには時間と労力がかかります。Excel2007 Reader and Writerのチャートコードは、「実験的」とは見なされなくなった時点まで安定しており、開発の焦点は、Excel5 Reader and Writerでのチャート処理に必要なコードの記述に向けられていますが、これは機能しています。それはまだ完了していません。

于 2012-11-01T07:40:07.200 に答える
0

Golangを使用できる場合は、 Excelizeを試してください。XLSXの元のチャートを失うことなくファイルの保存をサポートします。

于 2017-01-04T07:16:27.160 に答える
-1

セットしてみてくださいsetIncludeCharts

$objReader = PHPExcel_IOFactory::createReader('Excel2007');
//  Tell the reader to include charts when it loads a file
$objReader->setIncludeCharts(TRUE);
//  Load the file
$objPHPExcel = $objReader->load($filePath);
于 2015-09-21T07:45:57.717 に答える