2011-02-04 17 views
8

Czy ktoś może mi powiedzieć, dlaczego PHPExcel nie zezwala na więcej niż 5000 wierszy. Używam open-source PHPExcel do generowania raportów w moich projektach i nie mogłem napisać więcej niż 5000 wierszy danych z Mysql-DB. Mój zestaw wyników pobiera 7230 rekordów, gdy kwerenda jest wykonywana. Jak to naprawić ..Dlaczego PHPExcel nie pozwala na zapisanie więcej niż 5000 wierszy

+0

Czy jesteś w stanie pobrać dokładnie 5000 wierszy? Jeśli tak jest, może być ograniczenie w PHPExcel, prawdopodobnie lepiej zapytać na forum pomocy CodePlex - zawsze uważałem, że wsparcie dla PHPExcel jest całkiem dobre. Jeśli nie, jest to prawdopodobnie problem z pamięcią/przekroczeniem limitu czasu na serwerze. – user183037

Odpowiedz

15

Prawie na pewno jest to problem z limitem czasu lub pamięcią. Jedynym ograniczeniem PHPExcel dla arkuszy roboczych jest 65 536 wierszy i 256 (IV) kolumn (podczas korzystania z programu Excel5 Writer); lub 1 048 576 wierszy i 16 384 (XFD) kolumn (podczas korzystania z programu Excel2007 Writer).

Upewnij się, że rejestrowanie błędów jest zawsze włączone ... użyj bloków try/catch, aby wykryć wyjątki PHPExcel. I przeczytaj wątki dyskusyjne strony PHPExcel na temat pamięci i wydajności.

1

Bez twojego kodu lub kodu klasy jest dość trudny Wierzę ... Czy masz na myśli, że nie możesz napisać więcej niż 5k wierszy w pliku XLS lub w arkuszu? w przeciwnym razie brzydkim obejściem byłoby zapisanie 5K wierszy na pierwszym arkuszu, a reszta w drugim (więc 5K wierszy na każdym arkuszu, jeśli DB staje się większy). Nie sądzę, że XLS ma ograniczenia rzędu 5k, więc w twoim skrypcie powinno być coś złego lub źle skonfigurowanego. Czy próbowałeś już kilka razy? Czy zawsze drukuje 5k wierszy? czy może to być spowodowane przekroczeniem czasu? (twojego skryptu lub połączenia)

0

Ten rodzaj problemu jest bardziej niż prawdopodobny problem z pamięcią serwera. Na jakim typie serwera jesteś i czy na pewno ma wystarczającą ilość pamięci i zasobów dostępnych do przetwarzania dużych plików danych? Jeśli nie możesz powiedzieć w żaden sposób, najlepszą opcją jest przeczytanie kilku tysięcy rekordów na raz, przetworzenie ich i przejście do następnego fragmentu. Sam wolałbym podzielić duży plik danych na łatwe do zarządzania pliki (pliki), na których mógłbym następnie przetworzyć każdy z tych elementów, aby uzyskać pożądany rezultat. Po przetworzeniu wszystkich elementów można je połączyć, tworząc nowy, duży plik danych.

9

Miałem ten sam problem. Musisz przydzielić wystarczającą ilość czasu i limitu pamięci.

Ja testowałem moje rozwiązanie na 3 różnych serwerze Oto wynik:

około 5000 rekordów (12 kolumn)

Reading file:
09:48:22 Szczyt zużycie pamięci: 1,25 MB

Odczyt danych:
9:48:31 szczytowa zużycia pamięci: 54,5 MB

Po danych indeksowanie w tablicy :
09:48:35 Szczyt wykorzystanie pamięci: 68,5 MB

Rekordy: 4504

zwiększyłem pamięć i czas czytać 22.000 rekordy po indeksowania wzrosła ona do 370.00MB

Oto rozwiązanie (jest podane, że wszystko jest poprawne w sekwencji kodu) gdzie zadzwonić PHPExcel w programie/funkcja:

ini_set("max_execution_time", 'time_limit'); //see manual 

Czy wszystkie inicjalizacji tutaj tak, że wszystkie obiekty są gotowe następnie przydzielić pamięci dla odczytu danych i indeksowanie plików w wewnętrznej strukturze programu:

ini_set('memory_limit', '???'); //your memory limit as string 
$excel = $excelReader->load($filePath); 
"Memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB" 
//do the rest of the structure! 

dobrym pomysłem jest, aby udało się to wszystko przez niektórych kategorii danych, więc nie napotkasz 400 MB - podatny na błędy!

+0

ini_set ('memory_limit', '-1'); sam ma tendencję do naprawienia tego – maxhud

2

Prawie na pewno jest to problem z limitem czasu lub pamięcią. Jedynym ograniczeniem PHPExcel dla arkuszy roboczych jest 65 536 wierszy i 256 (IV) kolumn (podczas korzystania z programu Excel5 Writer); lub 1 048 576 wierszy i 16 384 (XFD) kolumn (podczas korzystania z programu Excel2007 Writer).

Można zmienić tę linię

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

jak

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 

Wtedy to pozwala na zapisanie rekordów ponad 65536 wierszy.

Powiązane problemy