Доброго времени суток! Столкнулся с необходимостью загрузить в mySQL большой xlsx (более 300 000 строк). Для загрузки меньших файлов использовал PHPExcel. Но при загрузке большого файла сервер падает по памяти. Может кто сталкивался с такого рода проблемой и как то нашел решение? P.S. увеличить размер физической памяти возможности нет(((
сохраняй excel файлы, как csv. CSV это текстовый файл, разделитель колонок символ ";" либо "," , который открывается excel и отображается как excel файл. Обработка csv меньше ресурсов расходует.
https://github.com/box/spout - в большинстве случаев использования этого пакета будет достаточно. Скорость обработки несколько меньше, скорее всего придется переписать обработчик, т.к. файл читается не разом, а построчно, но по оперативке вы легко уложитесь 3-5мб на файле любого размера. Если скорость также критична, то лучше действительно конвертировать в csv, а затем разбирать его через fgetcsv, потому что на большом количестве итераций разница между while(fgetcsv) и вызовами методов / функций всё же заметна. На vps самый оптимальный вариант - поставить Libreoffice и потом с консоли делать примерно вот так: Код (Text): libreoffice --headless --convert-to csv book.xlsx --outdir conv/ , ну и есть ещё питоновский xlsx2csv как запасной вариант.
да Господи, программа называется Microsoft Office Excel , нажимаешь Сохранить как , там не только что в csv можно сохранить, даже в pdf можно сохранить
программно имеется в виду не производя никаких манипуляций у себя на компе)) пришел имэйл с файлом -> скрипт скачал файл -> преобразовал в csv -> залил в mySQL
Грузить частями с помощью ChunkReaderFilter https://github.com/cystbear/PHPExcel/blob/master/Documentation/Examples/Reader/exampleReader11.php
xlsx это zip-архив с xml-файлами внутри. Его можно распаковать как обычный архив и распарсить xml хоть построчно. Конвертация в csv конечно лучший вариант, если структура позволяет
О точно, а то помню что была задача похожая. Я распаковывал его как архив. Тоисть сначала пересохранял как zip потом распаковывал и обрабатывал файлы.
Конвертация в CSV - лучший выход, как подсказали выше. От себя добавлю, что если и CSV будет слишком жирный - его без проблем можно разбить на несколько файлов, т.к. там внутри уже не архив, а обычные строки.
1. Перейти на CSV (открывается также програмой excel без проблем). 2. CSV проще работать с ним и получать нужные данные по нужным ячейкам). 3. 300к это даже не много. Если у вас сервер не может запихнуть в буфер эти 300к и при это вы не можете запросить сервер "по лучше", тогда (или вообще всегда) используйте генератор. Сам лично обрабатывал в цикле при 128мб лимиту памяти данные которые > 100млн. записям.