За последние 24 часа нас посетили 22954 программиста и 1219 роботов. Сейчас ищет 721 программист ...

чтение больших xlsx

Тема в разделе "PHP для профи", создана пользователем ArtemMinsk, 17 июн 2019.

  1. ArtemMinsk

    ArtemMinsk Новичок

    С нами с:
    17 июн 2019
    Сообщения:
    4
    Симпатии:
    0
    Доброго времени суток!
    Столкнулся с необходимостью загрузить в mySQL большой xlsx (более 300 000 строк). Для загрузки меньших файлов использовал PHPExcel. Но при загрузке большого файла сервер падает по памяти. Может кто сталкивался с такого рода проблемой и как то нашел решение?
    P.S. увеличить размер физической памяти возможности нет(((
     
  2. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    сохраняй excel файлы, как csv.
    CSV это текстовый файл, разделитель колонок символ ";" либо "," , который открывается excel и отображается как excel файл.

    Обработка csv меньше ресурсов расходует.
     
  3. ArtemMinsk

    ArtemMinsk Новичок

    С нами с:
    17 июн 2019
    Сообщения:
    4
    Симпатии:
    0
    а есть ли способ преобразовать xlsx в csv программно?
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    https://github.com/box/spout - в большинстве случаев использования этого пакета будет достаточно. Скорость обработки несколько меньше, скорее всего придется переписать обработчик, т.к. файл читается не разом, а построчно, но по оперативке вы легко уложитесь 3-5мб на файле любого размера.

    Если скорость также критична, то лучше действительно конвертировать в csv, а затем разбирать его через fgetcsv, потому что на большом количестве итераций разница между while(fgetcsv) и вызовами методов / функций всё же заметна.
    На vps самый оптимальный вариант - поставить Libreoffice и потом с консоли делать примерно вот так:
    Код (Text):
    1. libreoffice --headless --convert-to csv book.xlsx --outdir conv/
    , ну и есть ещё питоновский xlsx2csv как запасной вариант.
     
    artoodetoo и Deonis нравится это.
  5. ArtemMinsk

    ArtemMinsk Новичок

    С нами с:
    17 июн 2019
    Сообщения:
    4
    Симпатии:
    0
    огромное спасибо!
     
  6. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    да Господи, программа называется Microsoft Office Excel , нажимаешь Сохранить как , там не только что в csv можно сохранить, даже в pdf можно сохранить
     
  7. ArtemMinsk

    ArtemMinsk Новичок

    С нами с:
    17 июн 2019
    Сообщения:
    4
    Симпатии:
    0
    программно имеется в виду не производя никаких манипуляций у себя на компе))
    пришел имэйл с файлом -> скрипт скачал файл -> преобразовал в csv -> залил в mySQL
     
  8. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    xlsx это zip-архив с xml-файлами внутри. Его можно распаковать как обычный архив и распарсить xml хоть построчно. Конвертация в csv конечно лучший вариант, если структура позволяет
     
    Dron-Boy нравится это.
  10. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    О точно, а то помню что была задача похожая. Я распаковывал его как архив. Тоисть сначала пересохранял как zip потом распаковывал и обрабатывал файлы.
     
  11. mike4ip

    mike4ip Новичок

    С нами с:
    24 авг 2019
    Сообщения:
    18
    Симпатии:
    1
    Конвертация в CSV - лучший выход, как подсказали выше. От себя добавлю, что если и CSV будет слишком жирный - его без проблем можно разбить на несколько файлов, т.к. там внутри уже не архив, а обычные строки.
     
  12. DarkU

    DarkU Активный пользователь

    С нами с:
    15 июл 2013
    Сообщения:
    12
    Симпатии:
    2
    1. Перейти на CSV (открывается также програмой excel без проблем).
    2. CSV проще работать с ним и получать нужные данные по нужным ячейкам).
    3. 300к это даже не много. Если у вас сервер не может запихнуть в буфер эти 300к и при это вы не можете запросить сервер "по лучше", тогда (или вообще всегда) используйте генератор. Сам лично обрабатывал в цикле при 128мб лимиту памяти данные которые > 100млн. записям.