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
Odpowiedz
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.
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)
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.
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!
ini_set ('memory_limit', '-1'); sam ma tendencję do naprawienia tego – maxhud
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.
- 1. R: Shapiro.test (..) nie może zajmować więcej niż 5000 punktów danych
- 2. Dlaczego nie można użyć MPMoviePlayerController więcej niż raz?
- 3. Dlaczego więcej niż jeden chromosom na roztwór (lub genotyp)?
- 4. Jak odzyskać więcej niż 1000 wierszy z Parse.com?
- 5. Jak wyświetlić więcej niż 200 wierszy w TStringGrid za pomocą funkcji LiveBindings?
- 6. Dlaczego javac nie narzeka na więcej niż jedną klasę publiczną na plik?
- 7. alokowanie Duży (5000+) Array
- 8. Więcej niż 2 przyciski na sweetalert 2
- 9. Dlaczego C++ nie pozwala mi używać typeof?
- 10. Backbone relacyjny - nie więcej niż jedną instancję ,,,
- 11. Dlaczego drzewo map Java Java nie pozwala na początkowy rozmiar?
- 12. Dlaczego Rust nie pozwala na wymuszanie obiektów w kontenerach?
- 13. Dlaczego seq computation builder nie pozwala na "let!"
- 14. Dlaczego C# nie pozwala na zablokowanie wartości pustej?
- 15. Dlaczego JavaScript nie pozwala na przypisanie właściwości "nazwa" do funkcji?
- 16. Dlaczego moja HashMap pozwala na duplikowanie kluczy?
- 17. Nie można użyć makro więcej niż raz w gVim
- 18. Baza danych SQLite na PhoneGap/iOS - Więcej niż 5mb możliwe
- 19. Jak włączyć port 5000 na AWS Ubuntu
- 20. Jak wykonać mniej niż/więcej niż porównania na obiektach niestandardowych w javascript
- 21. Różnica między varchar (5) a varchar (5000)?
- 22. ponowne BackgroundWorker więcej niż raz
- 23. Dlaczego ta klasa przypadku może przechowywać więcej parametrów niż deklaruje?
- 24. UITabBarController - więcej niż 20 wyświetleń
- 25. Połączyć dwa lub więcej plików xls jako arkusze kalkulacyjne PHPExcel
- 26. Problem z pamięcią PHPExcel
- 27. Android - bindService więcej niż raz
- 28. Mysqldump więcej niż jeden stół?
- 29. Uruchamianie testów jednostkowych na więcej niż pięciu rdzeniach równolegle
- 30. Konstruktor Webservice C# nie pozwala na argumenty?
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