2013-08-05 14 views
8

Ich habe ein Skript, das eine kleine xls-Tabelle (~ 25x15) generiert. Es enthält Prozentsätze und Zeichenketten, und ich habe einen, wenn Betreiber, der die aktuelle Zelle als Prozentsatz Art mit diesem Code wird:PhpExcel funktioniert nicht mehr nach der Einstellung 20 Zelltypen

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

Aber wenn ich exportieren und sehen Sie die Datei, die ich sehe es nur geschafft Art und Stil setzen über 20 Zellen. Und alle anderen sind mit Standardeinstellungen. Ich debuggte und erkannte, dass das Problem nicht in meiner Logik liegt. Ich lese über zunehmenden PHP-Cache-Speicher - versuchte es, aber es hat nicht funktioniert. Bitte helfen, weil ich mindestens 15 mal größere Tabelle exportieren muss. Danke im Voraus!

+1

Da PHPExcel gibt es kein Limit für die Anzahl der Stile (obwohl Excel selbst, ist es weit über 20), und eine Reihe unserer Demo-Skripte im Ordner/Beispiele verwenden mehr als 20 verschiedene Stile, können Sie bitte ein funktionierendes Beispiel für Code, der dieses Problem veranschaulicht. Möglicherweise liegt das Problem in einem bestimmten Stil, den Sie festlegen, und nicht nach einer Reihe von Stilen. –

+0

Was ist '$ this' in Ihrer Frage und was ist' $ coords' in Ihrer Frage und wo ist der Rest des minimalen Beispiels, um Ihr Problem zu reproduzieren? http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-example-for-programming-questions – hakre

Antwort

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)); 
?> 

clearcatcache(); kann nützlich sein. Laden Sie diese Funktion am Anfang der PHP-Seite.

+0

Ich habe es versucht, aber es hat nicht funktioniert. Hier ist der Code, den ich benutze http://pastebin.com/wjWuX8J0. Ich werde sehr geschätzt werden, wenn Sie es schaffen, andere Ratschläge zu geben. – Martin

3

PHPExcel weist einige ganz Speicher

Während PHPExcel eine schöne Bibliothek ist, verwendet, kann es riesige Mengen an Speicher zu PHP zugewiesen erfordern.

Nach this thread, nur 5 Zellen 6 MByte von Speichernutzung machen:

<?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. 

Eine weitere user even failed with a 256MByte memory Einstellung.

Während PHPExcel Möglichkeiten bietet, seinen Speicherbedarf zu reduzieren, haben sich alle Reduzierungen in meinem Fall als zu klein herausgestellt. This page on github enthält Details zu den Cache-Management-Optionen von PHPExcel. Zum Beispiel serialisiert diese Einstellung und die GZIPs die Zellstruktur von einem Arbeitsblatt:

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip; 

PHPExcel_Settings::setCacheStorageMethod($cacheMethod); 

PHPExcel's FAQ erklärt dies:

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

Messergebnisse für PHP Excel

I instrumentiert die PHPExcel Beispiel Datei [01simple.php][5] und hat einige Schnelltests.

Verbrauchen 92 KByte:

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

Verbraucht 4164 KBytes:

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

Wenn man dieses Fragment mehrere Male unverändert ausgeführt wird, wobei jedes Fragment etwa 4 MBytes verbraucht.

Ihre Anwendung prüfen ist logisch korrekt

Um sicherzustellen, dass Ihre Anwendung logisch korrekt ist, würde ich vorschlagen erste PHP-Speicher zu erhöhen:

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

In meinem Fall muss ich Export, um Ergebnisdaten einer Online-Bewertungsanwendung zu exportieren.Während es weniger als 100 Zellen horizontal gibt, muss ich bis zu mehreren 10.000 Zeilen exportieren. Während die Anzahl der Zellen groß war, enthält jede meiner Zellen eine Zahl oder eine Folge von 3 Zeichen - keine Formeln, keine Stile.

Bei starken Speicherbeschränkungen oder großer Tabellen

In meinem Fall keine der Cache-Optionen reduzierte die Menge so viel wie nötig. Außerdem ist die Laufzeit der Anwendung enorm gewachsen.

Schließlich musste ich zu altmodischen CSV-Dateiexporten wechseln.

+1

Bitte zitieren Sie Ihre Referenz für 'Jede Zelle einer PHPExcel-Tabelle beläuft sich auf etwa 20 KByte Speicher. '... Meine Faustregel war immer 1k/Zelle auf 32-Bit-PHP und 1.6k/Zelle, wenn Sie verwenden 64-Bit-PHP –

+0

Dies scheint wenig mehr als eine Tirade gegen PHPExcel-Speicherverwaltung zu sein und scheint die Frage des OP zu Stilen in keiner Weise zu beantworten. OP erwähnt Speicher überhaupt nicht. Und es erwähnt kaum eine der Techniken zur Reduzierung der Speicherauslastung in PHPExcel –

+0

Das Problem mit COM, und der Grund, warum MS es nicht empfehlen, ist, dass es Probleme verursacht, wenn Sie versuchen, mit mehr als einem COM-Objekt zu arbeiten (oder mehr als eine Excel-Datei) gleichzeitig ....aber es ist auch auf Windows-Server beschränkt –

2

Ich habe Ihren Code lokal ausgeführt und festgestellt, dass alle 26 Zellen, die Sie für diesen Prozentsatz festgelegt haben, das richtige Format und ein% -Zeichen haben. Ich musste natürlich zuerst die Zeilen 136-137 auskommentieren.

Dies muss mit Ihrer Konfiguration zusammenhängen. Ich kann mir nicht vorstellen, dass Sie für eine Tabelle dieser Größe zu wenig Speicher hätten.

Zu Ihrer Information, ich bestätigte, es funktionierte auf PHP Version 5.4.16 mit php Excel-Version Version 1.7.6, 2011-02-27. Ich habe die Tabelle mit MS Excel 2007 geöffnet.

+0

Auch mit der neuesten Version, 1.7.9. 17:01:54 Aktuelle Speicherauslastung: 5.5 MB 17:01:54 Maximale Speicherauslastung: 5.5 MB – Spork

+1

das würde bedeuten, das Skript funktioniert auf Ihrem Rechner und funktioniert nicht auf meinem ... – Martin

+0

Es könnte nur Maschine sein abhängig davon, ob es Speicher war, aber ich habe keine besonders beeindruckende Maschine. Ich würde auf einen Unterschied in PHP-Versionen oder PHPExcel-Versionen lehnen. Was sind deine? – Spork

Verwandte Themen