Excel

Migrate: Импорт из Excel


85

Снова возвращаемся к migrate. Довольно удобный фреймворк для импорта данных в Друпал. Один из распространенных форматов источника для импорта - CSV. Поддерживается migrate из коробки. Описание и примеры работы с классом MigrateSourceCSV можно найти на drupal.org.

Есть один большой недостаток при импорте из CSV - подготовка файла для импорта: 

  • при сохранении в CSV из Excell Вы не получите необходимую нам кодировку utf-8; 
  • если в поле длинный текст (например, описание товара), то неодходимо перед сохранением заменить встречающиеся символы перевода строки, иначе можно получить вместо 5000 строк с товарами - 65000. Проверено на личном опыте...; 

В принципе, в сети есть довольно много программ, для корректной конвертации из xls в csv c дополнительными опциями. Все решаемо :-) Осталось только научить "человека" подготавливать файлы для импорта...

Итак, давайте попробуем делать импорт прямо из xls.

Незнаю, может я просто разучился пользоваться поиском, но ничего путно найти не смог. День ходил, обдумывал возможные решения. Решил, что стоит написать свой плагин для migrate, так сказать, научить его считывать данные из xls. Начал изучать source-плагины "из коробки". И, о чудо - class MigrateSourceSpreadsheet. В принципе, на этом моменте можно закончить статью...

/**
 * @file
 * Define a MigrateSource for importing from spreadsheet files.
 *
 * Requires the PHPExcel library to be installed.
 * - Download PHPExcel at http://phpexcel.codeplex.com/.
 * - Extract the archive to a temporary folder.
 * - Ensure the hosting environment fulfills the requirements found in
 *   install.txt.
 * - Copy the contents of the Classes folder to an appropriate location
 *   (sites/all/libraries/PHPExcel).
 */

Данный класс работает с библиотекой PHPExcel.

Зависимости:

  • Модуль libraries
  • Модуль phpexcel
  • Библиотека PHPExcel

Модуль phpexcel предоставляет API для работы с xls файлами в своих модулях. Кстати, в реализации класса MigrateSourceSpreadsheet я не увидел использования этих методов, но вот проверку на наличие данного модуля нашел. Возможно, это связано с настройками кеширования. Дело в том, что у библиотеки PHPExcel есть один известный недостаток - большое потребление памяти во время обработки файлов. Для решения этой проблемы были разработаны различные механизмы кеширования. Модуль phpexcel предоставляет возможность из админки сайта ('admin/config/system/phpexcel') менять режим кеширования.

Самый простой пример использования класса MigrateSourceSpreadsheet:

$this->source = new MigrateSourceSpreadsheet('путь к файлу xls или xlsx', 'имя листа');

В Вашем файле для импорта переименуйте лист в какое-то удобное название,  например "import", в первой строке листа задайте имена колонкам на английском языке. Migrate считает эти имена и создат на их основе список полей, доступных для импорта.

class ProductsMigration extends Migration {
  public function __construct($arguments) {
    parent::__construct($arguments);

    $columns = array();
//Укажем, что в первой строке таблицы находятся заголовки 
//Данные заголовки станут ключами в массиве с данными
    $options = array(
      'header_rows' => 1,
    );
//Имя листа
    $sheet_name = 'imp';

//  $this->source = new MigrateSourceCSV('http://uber.new/import.csv', $columns, $options);
    $this->source = new MigrateSourceSpreadsheet(DRUPAL_ROOT . '/import.xlsx', $sheet_name, $columns, $options);

// Destination
    $this->destination = new MigrateDestinationProductNode('product');

// Key schema
    $source_key_schema = array(
      'model' => array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'description' => 'Source ID',
      )
    );

    $this->map = new MigrateSQLMap($this->machineName, $source_key_schema, MigrateDestinationProductNode::getKeySchema());

    // Mapping
    $this->addFieldMapping('title', 'title');
    $this->addFieldMapping('body', 'body')->defaultValue(NULL);
    $this->addFieldMapping('body:format')->defaultValue('full_html');
    $this->addFieldMapping('status')->defaultValue(TRUE);
    $this->addFieldMapping('promote')->defaultValue(FALSE);
    $this->addFieldMapping('sticky')->defaultValue(FALSE);
    $this->addFieldMapping('uid')->defaultValue(1);
    $this->addFieldMapping('field_brand', 'brand')->separator(',');
    $this->addFieldMapping('field_brand:source_type')->defaultValue('name');
    $this->addFieldMapping('field_brand:create_term')->defaultValue(TRUE);

    $this->addFieldMapping('taxonomy_catalog', 'catalog');
    $this->addFieldMapping('taxonomy_catalog:source_type')->defaultValue('tid');
    $this->addFieldMapping('taxonomy_catalog:create_term')->defaultValue(TRUE);

    $this->addFieldMapping('sell_price', 'price')->defaultValue(0);
    $this->addFieldMapping('model', 'model')->defaultValue(0);
  }
}

Актуально для: 
migrate7.x-2.8

Drupal Drupal 7 — Статьи проmigrateExcelphpExcel
Добавить комментарий
Может быть интересно

Данный скрипт поможет пересохранить файлы Excel в csv. Может быть полезно перед отправкой прайсов на хостинг для дальнейшей обработки

5

Порядок действий для установки Solr на сервере с Centos 7

4
Модуль Migrate это фреймворк для миграции (импорта) данных в Drupal из любых источников.
1

В данной статье будет теория про механизм, который использует модуль migrate при импорте материалов в Друпал из различных источников.

2

В операционной системе Windows, как и в других операционных системах, интерактивные (набираемые с клавиатуры и сразу же выполняемые) команды выполняются с помощью так называемого командного интерпретатора, иначе называемого командным процессором или оболочкой командной строки (command shell).

3