2013-08-05 66 views
8

我有一個腳本可以生成一個xls表(〜25x15)。它包含百分比和字符串和我有一個,如果操作者將當前單元格爲百分比型與此代碼:PhpExcel在設置20個單元格類型後停止工作

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

但是,當我出口,並期待在我看到這個文件只管理設置的類型和風格有關20個細胞。其餘的都是默認設置。我調試它,並意識到這個問題不在我的邏輯。我讀了關於增加php緩存內存 - 嘗試了它,但它沒有奏效。請幫忙,因爲我需要導出至少15倍大的表格。提前致謝!

+1

由於PHPExcel對樣式數量沒有任何限制(儘管Excel本身也有,它遠高於20),並且/ 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頁面的開始加載這個函數。

+0

我試過了,但沒有奏效。以下是我使用http://pastebin.com/wjWuX8J0的代碼。如果你能給出任何其他建議,我將不勝感激。 – Martin

3

PHPExcel分配相當長的一段記憶

雖然PHPExcel是一個美麗的圖書館,使用它可能需要分配給PHP大量內存。

根據this thread,只是5細胞可使得存儲器使用的6兆字節

<?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設置。

雖然PHPExcel提供了減少內存佔用的方法,但在我的情況下,所有的減少量都變得太小了。 This page on github提供了PHPExcel的緩存管理選項的詳細信息。例如,該設置序列化和的gzip工作表的單元格結構:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; 

PHPExcel_Settings::setCacheStorageMethod($cacheMethod); 

PHPExcel's FAQ解釋這一點:

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

爲PHP的Excel

我儀表的PHPExcel測量結果示例文件[01simple.php][5]並做了一些快速測試

消耗92 K字節

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

消耗4164千字節

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

如果一個執行該片段幾次不變,每個片段消耗約4兆字節。

檢查您的應用程序是邏輯上是正確

要確保,你的應用是邏輯上是正確的,我會建議首先增加PHP內存:

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

就我而言,我不得不導出到在線評估應用程序的導出結果數據。雖然水平少於100個單元格,但我需要導出多達10.000行。儘管細胞數量很大,但我的每個細胞都擁有一個數字或一串3個字符 - 沒有公式,也沒有樣式。

在強大的內存限制或大型電子表格

在我的情況下,要求無緩存選項減少量一樣多。另外,應用程序的運行時間也大大增加。

最後,我不得不切換到老式的CSV數據文件導出。

+1

請引用您的參考資料'PHPExcel電子表格的每個單元大約有20千字節的內存。'...如果您使用的是32位PHP和1.6k/cell,則我的經驗法則始終爲1k/cell 64位PHP –

+0

這似乎只是對PHPExcel內存管理的咆哮,似乎沒有以任何方式回答OP的風格問題。 OP根本沒有提到內存。並且它幾乎沒有提及任何減少PHPExcel中的內存使用的技術。 –

+0

COM的問題以及MS不推薦它的原因是,當您嘗試使用多個COM對象時會導致問題(或多個Excel文件)一次....但它也僅限於Windows服務器 –

2

我在本地運行您的代碼,發現您設置爲該百分比的所有26個單元格都具有正確的格式和%符號。當然,我必須先取消第136-137行的註釋。

這必須與您的設置有關。我無法想象,對於這種尺寸的電子表格,內存太少。

爲了您的信息,我確認它使用PHP版本5.4.16與PHP的Excel版本1.7.6,2011年2月27日。我使用MS Excel 2007打開了電子表格。

+0

也用最新版本1.7.9。 17:01:54當前的內存使用情況:5.5 MB 17:01:54峯值內存使用情況:5.5 MB – Spork

+1

這意味着,腳本可以在您的機器上運行並且不適用於我的... – Martin

+0

它只能是機器如果它是記憶,那麼它是依賴的,但是我沒有特別令人印象深刻的機器。我會傾向於PHP版本或PHPExcel版本的差異。你是什​​麼? – Spork