Как сделать выгрузку чего либо из Opencart в Excel (xlsx)

Выгрузка данных в Excel файл - простой и эффективный способ

август 22 , 2017

Часто так бывает что нам надо выгрузить какие-то данные из магазина Opencart  в excel таблицу (файл xlsx).

Да, можно поискать модули, которые смогут это сделать. Но как правило готовые решения дорого стоят и это будет большой комбайн который будем использовать всего на 5%. Зачем все это придумывать, если имея прямые руки можно сделать выгрузку любых товаров в таблицу эксель.

Да и по моим наблюдениям того что хотят заказчики выгружать в файл как правило нет в готовых модулях. Ну что же нет, так нет. Будем делать свою "кастом" выгрузку :)

Для этого нам понадобится библиотека PHPExcel с помощью которой мы создадим файл excel и запишем в него любые данные из нашего магазина. Скачать PHP Excel.

После того как скачали, все содержимое архива загружаем в корень сайта (там где файл index.php). После этого идем в админку и делаем ссылку на выгрузку. Для этого открываем файл admin/view/template/common/header.tpl или admin/view/template/common/menu.tpl и в нужном месте прописываем ссылку

<a href="index.php?route=catalog/product/downexp&token=<?php echo $token; ?>">Скачать данные</a>

Где index.php?route=catalog/product/downexp - это путь к функции выгрузки, а именно функция downexp в файле admin/controller/catalog/product.php

Примечание. Если в ссылке будет ругаться на token, а именно undefined index token это означает что переменная token неопределена. В таком случае надо зайти в контроллер admin/controller/common/header.php (menu.php) и добавить в функцию index строку:

$data['token'] = $this->session->data['token']; //($this->data['token'] = $this->session->data['token']; - для Opencart 1.5)

После добавления ссылки на скачивание нам надо создать функцию для генерации xlsx. Для этого открываем файл admin/catalog/product.php и вставляем функцию:

    public function downexp() {
        $cwd = getcwd();
        chdir( DIR_SYSTEM.'PHPExcel' );
        require_once( 'Classes/PHPExcel.php' );
        chdir( $cwd ); //подключили библиотеку
        $phpexcel = new PHPExcel();
       
        $this->load->model('catalog/product');
        $this->load->model('catalog/category');
        $this->load->model('catalog/manufacturer'); //подключили нужные для выгрузки модели

        $filter = array(
            'start' => 0,
            'limit' => 9999999999999
        );
        $products = $this->model_catalog_product->getProducts($filter); //берем все продукты

        $page = $phpexcel->setActiveSheetIndex(0); //создаем вкладку

        $page->getColumnDimensionByColumn("0")->setWidth(40);
        $page->getColumnDimensionByColumn("1")->setWidth(70);
        $page->getColumnDimensionByColumn("2")->setWidth(20);
        $page->getColumnDimensionByColumn("3")->setWidth(20);
        $page->getColumnDimensionByColumn("4")->setWidth(8);
        $page->getColumnDimensionByColumn("5")->setWidth(6);
        $page->getColumnDimensionByColumn("6")->setWidth(12); //задаем ширину столбцов
       
        $page->setCellValue("A1", "Категория");
        $page->setCellValue("B1", "Товар");
        $page->setCellValue("C1", "Производитель");
        $page->setCellValue("D1", "Модель");
        $page->setCellValue("E1", "Артикул");
        $page->setCellValue("F1", "Цена");
        $page->setCellValue("G1", "Количество"); //прописали в первой строке название столбцов
       
        $i=2;
         foreach($products as $product){ //перебираем массив продуктов и записываем в файл
            $cats = $this->getPathByProduct($product['product_id']);

            $cat_text = '';
           
            $cats_arr = explode("_", $cats);
            foreach($cats_arr as $category_id){
                $category_info = $this->model_catalog_category->getCategory($category_id);
                $cat_text .= $category_info['name'] . '/';
            }
           
            $cat_text = rtrim($cat_text, "/");
           
            $manufacturer = $this->model_catalog_manufacturer->getManufacturer($product['manufacturer_id']);
           
            $page->setCellValue("A$i", $cat_text);
            $page->setCellValue("B$i", $product['name']);
            $page->setCellValue("C$i", $manufacturer['name']);
            $page->setCellValue("D$i", $product['model']);
            $page->setCellValue("E$i", $product['sku']);
            $page->setCellValue("F$i", $product['special']?$product['special']:$product['price']);
            $page->setCellValue("G$i", $product['quantity']);
             
            $i++;           
        }
       
        $page->setTitle("Товары");
           
        $filename = 'products.xlsx';
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="'.$filename.'"');
        header('Cache-Control: max-age=0');
        $objWriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel2007');
        $objWriter->setPreCalculateFormulas(false);
        $objWriter->save('php://output'); //отдаем файл в браузер по ссылке
    }

Где у меня в файле есть функции из seopro getPathByProduct и getPathByCategory они в примере нужны для формирования правильной вложенности категорий.

После нажатия на ссылку Скачать данные у нас функция downexp генерирует файл в формате xlsx в котором выгружаются все товары.

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

Если будут вопросы - спрашивайте в комментариях, подскажу по мере возможности. Также если нужна будет такая выгрузка обращайтесь смогу написать под заказ.