Импорт прайс-листа из Excel файла

Использование:

$PriceImporter = new PriceImporter();
$PriceImporter->import('path/file.xls');
PriceImporter.php
class PriceImporter {
  public function __construct() {
    require_once('phpexcel/PHPExcel/IOFactory.php');
  }
 
  public function import($file) {
    $this->loadXLS($file);
    $isValid = $this->isValidFormat();
    if(!$isValid) return false;
    return $this->processWorkbook();
  }
 
  private $objReader, $objPHPExcel;
  private function loadXLS($fileName) {
    $inputFileType = PHPExcel_IOFactory::identify($fileName);
    $this->objReader = PHPExcel_IOFactory::createReader($inputFileType);
    $this->objReader->setReadDataOnly(true);
    $this->objPHPExcel = $this->objReader->load($fileName);
    $this->objPHPExcel->setActiveSheetIndex(0);
    $this->aSheet = $this->objPHPExcel->getActiveSheet();
  }
 
  // проверка на соответствие формату
  private function isValidFormat() {
    return
      $this->getCell('A4') == 'Номенклатура, Ед. изм.';
  }
 
  // парсинг страницы товаров
  private function processWorkbook() {
    $lineNumber = 8; // начальный номер строки, от которой идет парсинг
    $linesProcessed = 0;
 
    while ($data = $this->getData($lineNumber)) {
      if ($data['isCorrect']) {
        $ShopItem = new ShopItem($data); // ShopItem - по типу Active Record
        $linesProcessed += $ShopItem->store();
      }
      $lineNumber++;
    }
    return $linesProcessed;
  }
 
  // получение данных о товаре из одной строки
  private function getData($lineNumber) {
    if ($lineNumber > $this->aSheet->getHighestRow()) return false;
    $name = $this->getCell('A'.$lineNumber);
    $sku = $this->getCell('E'.$lineNumber);
    $option = $this->getCell('F'.$lineNumber);
    $price = $this->getCell('G'.$lineNumber);
    $bar = $this->getCell('H'.$lineNumber);
    $balance = $this->getCell('I'.$lineNumber);
 
    return array(
      'isCorrect' => $name && $sku && $price,
      'name' => $name,
      'sku' => $sku,
      'option' => $option,
      'price' => $price
      'bar' => $bar ,
      'balance' => $balance
    );
  }
 
  // получаем значение или вычисленное значение
  private function getCell($cell) {
    $_cell = $this->aSheet->getCell($cell);
    $text = $_cell->getValue();
    if((substr($text,0,1) === '=' ) && (strlen($text) > 1)) {
      $text = $_cell->getOldCalculatedValue();
    }
    return trim($text);
  }
 
}

ShopItem - Active Record.

ShopItem.php
class ShopItem {
  private $data, $isNew = false;
  public function __construct(array $data, $db) {
    $this->db = $db;
    $this->data = $data;
    $this->getId($this->data['sku']);
  }
 
  public function store() {
    // не добавляем новые товары, только обновляем старые
    // если требуется добавление - доработать
    if ($this->isNew) return 0;
    $query = "UPDATE `shop_items` SET "
      // .($this->isNew ? "`name` = '".addslashes($this->data['name'])."', " : null)
      ."`price` = '".addslashes($this->data['price'])."', "
      ."`balance` = '".addslashes($this->data['balance'])."' "
      ."WHERE `id` = ".$this->id;
    $this->db->Query($query);
    return $this->db->SelectAffectedRows();
  }
 
  public function getId($sku) {
    $this->id = $this->db->SelectValue("SELECT `id` FROM `shop_items` WHERE `sku` = '".addslashes($sku)."'");
    if ($this->id == 0) {
      $this->isNew = true;
      return;
      // если требуется добавление - расскоментировать
      $query = "INSERT INTO `shop_items` (`sku`) VALUES ('".addslashes($sku)."')";
      $this->db->Query($query);
      $this->id = $this->db->SelectLastInsertId();
    }
  }
}
Печать/экспорт