1. Если есть возможность, то лучше отказаться от phpexcel. Использовать парсер, например, на питоне (пример http://strife.pl/2014/12/converting-large-xls-xlsx-files-to-csv-using-python/).
И парсить в csv.
Если же нет, то xls с помощью phpexcel парсим сразу в csv. В phpexcel есть класс PHPExcel_Writer_CSV.
2. В бд создаем промежуточную таблицу. По структуре такую же, как таблица назначения + доп колонки: flag (см п.5), error. Таблица не временная, чтобы можно было показать промежуточный результат оператору/администратору (как минимум показать записи с ошибками).
3. Парсим xls в csv. Далее построчно читаем файл с помощью fgetcsv, проверяем данные, записываем строчку в другой csv файл! Если есть ошибки, то добавляем еще сообщение об ошибке (которое должно в п.4 попасть в колонку error).
4. После того как проверили прошли по всем строчкам, загружаем с помощью LOAD DATA INFILE в промежуточную таблицу.
Пункты 3 и 4 работают быстрее чем, если бы писали построчно в бд.
5. Далее нам надо определить какие данные вставлять, а какие обновлять. Если поле артикул - pk, то в этом случае проще. Можно использовать insert select on duplicate key update.
Если же нет, то необходимо сравнить данные в двух таблицах и выставить значение в колонке flag. Далее на основе flag, апдейтим и инсертим записи.
|