Загрузка данных из Excel в MySQL с помощью PHP

Не так давно появилась задача – загрузить данные из Ecxel файла в базу сайта, и реализовать механизм так, чтобы быстро можно было обновлять эти данные, т.е. загружать новый файл. Решил попробовать парсер Excel-файлов phpExcelReader, но сколько не бился с ним, получал ошибку типа “… is not readable”. Поэтому решил использовать библиотеку PHPExcel.

Загружать будем прайс-лист:

Артикул Наименование Количество Цена Валюта Единица
123456 Апельсин 20 50000 руб килограмм
123457 Мандарин 20 54000 руб килограмм
123458 Яблоко 50 23500 руб килограмм

В таблицу со структурой:

id article name
quantity
price
currency
unit

Скачав архив с библиотекой и открыв его вы увидите несколько папок и файлов – это описание и примеры использования библиотеки. Нам понадобится папка “Classes” – распаковываем архив и загружаем её, например, в корень сайта.

Файл excel можно загрузить в нужную папку на сервере, например uploads, через ftp сервер или создать страницу загрузки с <input type="file" name="upload_file". Для меня конечно второй вариант был в приоритете (как реализовать загрузку файла на сервер я писал в статье «Отправка формы и файлов через Ajax»).

Итак, предположим, что форму загрузки мы сделали, библиотеку подключили, начнем писать скрипт обработки файла и загрузки в базу данных.

include 'db_conn.php'; // подключаемся к базе данных
$loadfile = $_POST['file_name']; // получаем имя загруженного файла
require_once $_SERVER['DOCUMENT_ROOT']."/Classes/PHPExcel/IOFactory.php"; // подключаем класс для доступа к файлу
$objPHPExcel = PHPExcel_IOFactory::load($_SERVER['DOCUMENT_ROOT']."/uploads/".$loadfile);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) // цикл обходит страницы файла
{
  $highestRow = $worksheet->getHighestRow(); // получаем количество строк
  $highestColumn = $worksheet->getHighestColumn(); // а так можно получить количество колонок

  for ($row = 1; $row <= $highestRow; ++ $row) // обходим все строки
  {
    $cell1 = $worksheet->getCellByColumnAndRow(0, $row); //артикул
    $cell2 = $worksheet->getCellByColumnAndRow(1, $row); //наименование
    $cell3 = $worksheet->getCellByColumnAndRow(2, $row); //количество
    $cell4 = $worksheet->getCellByColumnAndRow(3, $row); //цена
    $cell5 = $worksheet->getCellByColumnAndRow(4, $row); //валюта
    $cell6 = $worksheet->getCellByColumnAndRow(5, $row); //единица измерения
    $sql = "INSERT INTO `price` (`article`,`name`,`quantity`,`price`,`currency`,`unit`) VALUES
('$cell1','$cell2','$cell3','$cell4','$cell5','$cell6')";
    $query = mysql_query($sql) or die('Ошибка чтения записи: '.mysql_error());
  }
}

 

В принципе, второй цикл можно усовершенствовать, используя количество колонок, но у меня файл всегда будет стандартный, поэтому не вижу в этом смысла.

На CyberForum.ru нашел перевод документации к PHPExcel, который сделал SrgKord скачать можно тут: Документация разработчика PHPExcel (RUS).7z

6 ответов к «Загрузка данных из Excel в MySQL с помощью PHP»

  1. >>но сколько не бился с ним, получал ошибку типа «… is not readable»

    phpExcelReader чувствителен к кодировке, в моем случае я кинул в папку со скриптом .htaccess с php_value mbstring.internal_encoding windows-1251 и заработало. Кому то еще помогает php_value mbstring.func_overload 2.
    Всем удачи =)

  2. Задача: excel файл с google docs, конвертирую в нужный формат и заливаю на сайт вордпресс через плагин алл импорт в карточку товара. Практически срабатывает, но не погружает изображения (указаны ссылкой на гугл фото). Я так понимаю что система не работает так необходимор указывать изображения на прямую (предварительно залив их на сайт). Но мало ли – есть возможность это реализовать (загрузка изображений из екселя через ссылку на гугл фото)? Или в какую сторону копать?

  3. Не совсем правильно обращаться к полям как getCellByColumnAndRow(0, $row); тем более что создатель прайса может добавить новую колонку и тогда где 1, 2, 3 уже не ясно.
    В работе с гугл таблицами “asimlqt/php-google-spreadsheet-client”: “3.0.*” все строки возвращаются в виде ассоциативного массива где ключи это значениеиз первой строки. Получаются массивы вида:
    [
    ‘id’ => 1
    ‘name’ => name
    ….
    ]

    Второй момент когда записей 100 000. Тогда может не хватить памяти, времени для вставки всех значений, что тогда? Всё заново запускать?

  4. Без использования библиотек, excel прайс сохраняем в csv, бьем по указанному разделителю и все, проще и быстрее, в общем виде:
    $file_name = isset($argv[1]) ? $argv[1] : ‘for_test.csv’; // имя файла csv
    $col = isset($argv[2]) ? $argv[2] : 2; //количество столбцов в таблице
    $file = explode(“;”, file_get_contents($file_name)); // разделитель ;

    for ( $f = 0; $f < count($file) – $col + 1; $f++){
    if ($f < $col) {
    continue;
    }
    for ( $ff = 0; $ff < $col; $ff++){
    $file[$ff] // Пишем в БД
    }
    $f += $col – 1;
    }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *