2013-08-05 18 views
8

小さなxlsテーブル(〜25x15)を生成するスクリプトがあります。これは、パーセンテージおよび文字列が含まれていると私はこのコードの割合タイプとして、現在のセルを設定した場合の演算子を持っている:20個のセルタイプを設定した後にPhpExcelが機能しなくなる

$this->objPHPExcel->getActiveSheet()->getStyle($coords)->getNumberFormat()->setFormatCode('0.00%'); 

しかし、私は、エクスポートするときに、私はそれだけでおよそタイプとスタイルを設定するために管理を参照ファイルを見ます20細胞。残りはすべてデフォルト設定です。私はそれをデバッグし、問題が私の論理にないことを認識しました。私はPHPのキャッシュメモリを増やすことについて - それを試してみましたが、うまくいきませんでした。私は少なくとも15倍大きなテーブルをエクスポートする必要があるので、助けてください。前もって感謝します!

+1

/Examplesフォルダを使用している私たちのデモスクリプトの数20種類以上の異なるスタイルで、この問題を示すコードの実例を提供してください。問題は、いくつかのスタイルの後ではなく、設定している特定のスタイルにある可能性があります。 –

+0

あなたの質問には '$ this'とは何ですか?あなたの質問には' $ coords'とは何ですか?問題を再現するための最低限の例はどこにありますか? http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions – hakre

答えて

1
<?php 
$file = 'output_log.txt'; 

function get_owner($file) 
{ 
    $stat = stat($file); 
    $user = posix_getpwuid($stat['uid']); 
    return $user['name']; 
} 

$format = "UID @ %s: %s\n"; 

printf($format, date('r'), get_owner($file)); 

chown($file, 'ross'); 
printf($format, date('r'), get_owner($file)); 

clearstatcache(); 
printf($format, date('r'), get_owner($file)); 
?> 

clearstatcache();有用である可能性があります。この関数をPHPページの先頭にロードします。 PHPExcelは、それがPHPに割り当てられたメモリの膨大な量を必要とするかもしれない使用して、美しいライブラリですが

+0

私は試しましたが、うまくいかなかった。ここで私が使用しているコードはhttp://pastebin.com/wjWuX8J0です。あなたが他のアドバイスをすることができれば、私はとても感謝しています。 – Martin

3

PHPExcelはかなりのメモリに

を割り当てます。

<?php 
require_once 'php/PHPExcelSVN/PHPExcel/IOFactory.php'; 
$objPHPExcel = PHPExcel_IOFactory::load("php/tinytest.xlsx"); 
$objPHPExcel->setActiveSheetIndex(0); 
$objPHPExcel->getActiveSheet()->setCellValue('D2', 50); 
echo $objPHPExcel->getActiveSheet()->getCell('D8')->getCalculatedValue() . " 
"; 
echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB\r\n"; 
?> 

I get 6MB of memory usage. 

user even failed with a 256MByte memory設定:

this threadによれば、わずか5細胞を6メガバイトのメモリ使用量のをレンダリングしてもよいです。

PHPExcelはメモリフットプリントを減らす方法を提供しますが、私の場合はすべての削減が小さすぎることが判明しました。 This page on githubは、PHPExcelのキャッシュ管理オプションの詳細を提供します。たとえば、この設定は、ワークシートのセル構造をシリアライズし、GZIPs:私はPHPExcelをインストルメントPHP Excelの

Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa

PHPExcel holds an "in memory" representation of a spreadsheet, so it is susceptible to PHP's memory limitations. The memory made available to PHP can be increased by editing the value of the memorylimit directive in your php.ini file, or by using iniset('memory_limit', '128M') within your code (ISP permitting);

Some Readers and Writers are faster than others, and they also use differing amounts of memory. You can find some indication of the relative performance and memory usage for the different Readers and Writers, over the different versions of PHPExcel, here http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=234150

If you've already increased memory to a maximum, or can't change your memory limit, then this discussion on the board describes some of the methods that can be applied to reduce the memory usage of your scripts using PHPExcel http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=242712

測定結果

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; 

PHPExcel_Settings::setCacheStorageMethod($cacheMethod); 

PHPExcel's FAQはこれを説明します例ファイル[01simple.php][5]のクイックテストを実行しました。各フラグメントは約4メガバイトを消費し、1本のフラグメント数回変更せずに実行した場合

for($n=0; $n<200; $n++) { 
    $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); 
    $objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true); 
} 

for($n=0; $n<200; $n++) { 
    $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs'); 
} 

4164キロバイトを消費:

92キロバイトを消費します。

あなたのアプリをチェックする論理的に正しいです

確保するために、あなたのアプリケーションが論理的に正しいことを、私は最初のPHPのメモリ容量を増やすことを提案したい:

ini_set('memory_limit', '32M'); 

を私の場合、私がしなければなりませんエクスポートして、オンライン評価アプリケーションの結果データをエクスポートします。水平方向に100個未満のセルがあるのに対し、私はいくつかの10.000行までエクスポートする必要があります。セルの量が大きかったのに対し、私のセルはそれぞれ、数式または3文字の文字列を保持しています。数式はなく、スタイルはありません。

強いメモリ制限や、大きなスプレッドシート私の場合は

の場合は、キャッシュオプションのどれもが同じくらい必要に応じて量を削減しませんが。さらに、アプリケーションの実行時間が非常に長くなりました。

最後に、旧式のCSVデータファイルの書き出しに切り替える必要がありました。

+1

'PHPExcelスプレッドシートの各セルはおよそ20KByteのメモリに相当します.' ...私の経験則は、32ビットPHPでは1k/cell、1.6k/cellではいつも使用しています64ビットPHP –

+0

これは、PHPExcelのメモリ管理に対する馬鹿馬鹿しくしているようなものではありません。 OPには何も言及されていません。また、PHPExcelのメモリ使用量を減らすためのテクニックについてはほとんど言及していません。 –

+0

COMの問題とMSがそれをお勧めしない理由は、複数のCOMオブジェクトを扱うときに問題を引き起こすことですまたは複数のExcelファイル)を一度に....しかし、それはWindowsサーバーにも限定されています –

2

コードをローカルで実行しましたが、このパーセンテージに設定した26個のセルのすべてが正しいフォーマットと%記号を持っていることがわかりました。私は当然136-137行のコメントを外さなくてはなりませんでした。

これは、セットアップに関連している必要があります。私はあなたがこのサイズのスプレッドシートのためにあまりにも少ないメモリを持っているだろうと想像することはできません。

あなたの情報のために、私はそれがphp excelバージョン1.7.6、2011-02-27でPHPバージョン5.4.16で動作することを確認しました。私はMSエクセルでスプレッドシートを開いたPHPExcelは(エクセル自体がないのに、それも20より上だ)、とスタイルの数に制限はありませんので、2007年

+0

最新のバージョン1.7.9でも。 17:01:54現在のメモリ使用量:5.5 MB 17:01:54ピークメモリ使用量:5.5 MB – Spork

+1

これは、スクリプトがあなたのマシンで動作し、私のマシンで動作しないことを意味します... – Martin

+0

それはマシンメモリであれば依存しますが、特に印象的なマシンはありません。私は、PHPのバージョンやPHPExcelのバージョンの違いに頼るだろう。あなたは何ですか? – Spork

関連する問題