Битрикс — экспорт каталога товаров с торговыми предложениями в XLSX

11.07.2018  07:18

Задача: на сайте под управлением 1С-Битрикс сделать экспорт каталога товаров с торговыми предложениями в XLSX. Выбрав библиотеку, генерирующую валидный XLSX скрипт экспорта товаров в эксель будет таким:

$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
if(empty($DOCUMENT_ROOT)) $DOCUMENT_ROOT = '/home/bitrix/www';
require($DOCUMENT_ROOT."/bitrix/modules/main/include/prolog_before.php");
include_once($DOCUMENT_ROOT."/scripts/classes/xlsxwriter.class.php");
$file = $DOCUMENT_ROOT."/upload/prices_full.xlsx";
// стили ячеек:
//, 'halign'=>'center' - выравнивание внутри ячейки по высоте
$styles1 = array('font-size'=>12,'font-style'=>'bold', 'fill'=>'#eee', 'border'=>'left,right,top,bottom');//,'widths'=>[300,10,10]
$styles2 = array('font-size'=>12,'font-style'=>'bold', 'border'=>'left,right,top,bottom','wrap_text'=>false);
$styles3 = array('font-size'=>11,'border'=>'left,right,top,bottom');
$styles4 = array('font-size'=>11, 'border'=>'left,right,top,bottom'=);
// set_time_limit(0);
// ini_set('max_execution_time', '3600');
ini_set('memory_limit', '512M');
$IBLOCK_ID = 12;// Инфоблок товаров
$IBLOCK_ID_OFFERS = 13;// Инфоблок торговых предложений
$c = 0;
$c_empty = 0;
$PRICE_TYPE_ID = 1;
// подключим необходимые модули Битрикса
CModule::IncludeModule("iblock");
CModule::IncludeModule("catalog");
CModule::IncludeModule("sale");
$obE = new CIBlockElement();
global $USER;
if (!$USER->IsAdmin()){
// exit;// если надо ограничить доступ к скрипту и запускать вручную из-под админа
}
//артикул / название товара / цена
$date = date("d.m.Y");
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', array(' '=>'string',' '=>'string',' '=>'string'), ['widths'=>[100,15,30]] );//сделаем первую колонку шире
$writer->writeSheetRow('Sheet1', $rowdata = array('Название Компании','',''), $styles2 );
$writer->writeSheetRow('Sheet1', $rowdata = array('7 (000) 000-00-00','',''), $styles2 );
$writer->writeSheetRow('Sheet1', $rowdata = array('Цены указаны на '.$date,'',''), $styles2 );
$writer->writeSheetRow('Sheet1', $rowdata = array('Цены могут меняться в связи с колебаниями курса валют.  Рекомендуем уточнять актуальность цен у менеджеров.','',''), $styles2 );
$writer->writeSheetRow('Sheet1', $rowdata = array('Ценовая группа/ Номенклатура','Цена','Артикул'), $styles1 );
$arFilterSect = array('IBLOCK_ID' => $IBLOCK_ID, "ACTIVE" => "Y"
/*,"ID"=>1162, "GLOBAL_ACTIVE" => "Y" выгрузить 1 конкретный раздел */
);
$arSelectSect = array('ID', 'NAME', 'DEPTH_LEVEL', 'SECTION_ID');
$rsSectionSect = CIBlockSection::GetList(Array(),$arFilterSect, false, $arSelectSect, false);
while($arSection = $rsSectionSect->Fetch()) {
$table_rows[$arSection['ID']] = Array($arSection['NAME'],'','');
$arSelect = array(
		"ID",
		"NAME",
		"IBLOCK_ID",
		"IBLOCK_SECTION_ID",//added
		// "*",//added
		"ACTIVE",
		"ACTIVE_DATE",
		"SORT",
		"CATALOG_QUANTITY",// если потребуется ещё и количество
		"PROPERTY_CML2_ARTICLE",
	);
	$arFilter = array(
		"IBLOCK_ID" => $IBLOCK_ID,
		"IBLOCK_ACTIVE" => "Y",
		"SECTION_ID" => $arSection["ID"],
		"IBLOCK_SECTION_ID" => $arSection["ID"],
		// "ID" => "11504",//выгрузить 1 товар, для проверки
		"ACTIVE" => "Y",
	);
	$r = CIBlockElement::GetList(
		array(), 
		$arFilter, 
		false, 
		false, 
		$arSelect
	);
	while ( $arCurrentItem = $r->GetNext() ) {
	$res = CPrice::GetList(
		array(),
		array(
			"PRODUCT_ID" => $arCurrentItem['ID'],
			"CATALOG_GROUP_ID" => $PRICE_TYPE_ID
		)
    );
	if ($arr = $res->Fetch())
	{
		// print_r($arCurrentItem);
		// print_r($arr);
		// exit;
	}
	////// offers $IBLOCK_ID_OFFERS	CML2_LINK
	$arSelectOffers = array(
		"ID",
		"NAME",
		"IBLOCK_ID",
		"ACTIVE",
		"ACTIVE_DATE",
		"SORT",
		"CATALOG_QUANTITY",
		"PROPERTY_CML2_ARTICLE",
	);
	$arFilterOffers = array(
		"IBLOCK_ID" => $IBLOCK_ID_OFFERS,
		"IBLOCK_ACTIVE" => "Y",
		"=PROPERTY_118" => $arCurrentItem["ID"],//привязка торгового предложения к товару, свойство CML2_LINK
		"ACTIVE_DATE" => "Y",
		"ACTIVE" => "Y",
	);
	$rOffers = CIBlockElement::GetList(
		array(), 
		$arFilterOffers, 
		false, 
		false, 
		$arSelectOffers
	);
	while ( $arCurrentItemOffers = $rOffers->GetNext() ) {
	$resOffers = CPrice::GetList(
	array(),
	array(
		"PRODUCT_ID" => $arCurrentItemOffers['ID'],
		"CATALOG_GROUP_ID" => $PRICE_TYPE_ID
	)
    );
	if ($arrOffers = $resOffers->Fetch())
	{
		// print_r($arr);
		// exit;
	}
if (!empty($arrOffers['PRICE'])) $arrOffers['PRICE'] .= ' р.';
$offers[$arCurrentItem["ID"]][] = Array($arCurrentItemOffers['NAME'],$arrOffers['PRICE'],$arCurrentItemOffers["PROPERTY_ARTNUMBER_VALUE"]);
$offers_tmp[$arSection["ID"]][] = 'ok';
}
	////// offers END
if (!empty($arr['PRICE'])) $arr['PRICE'] .= ' р.';
$table_items[$arSection['ID']][$arCurrentItem["ID"]] = Array($arCurrentItem['NAME'],$arr['PRICE'],$arCurrentItem["PROPERTY_CML2_ARTICLE_VALUE"]);
$c++;
	}
}
foreach($table_rows as $k => $v) {
	if(!empty($table_items[$k]) || !empty($offers_tmp[$k])) {}
	else unset($table_rows[$k]);// удаление разделов в которых нет товаров
}
foreach($table_rows as $k => $v) {
	$writer->writeSheetRow('Sheet1', $rowdata = $v, $styles1 );
	foreach($table_items[$k] as $k2 => $v2) {
		if (empty($offers[$k2])) $writer->writeSheetRow('Sheet1', $rowdata = $v2, $styles4 );
		foreach($offers[$k2] as $k3 => $v3) {
			$writer->writeSheetRow('Sheet1', $rowdata = $v3, $styles3 );
		}
	}
	// $table_fin .= $v;
}
// запись в файл
$writer->writeToFile($file);
echo 'Товаров: '.$c;
echo 'fin';



перейти в Блог

Ударим лайками по бездорожью, разгильдяйству и бюрократизму!


Ключевые слова (тэги): 1С-Битрикс 43  PHP 55  web-программирование 79  

Вам есть что сказать — ну я же чую.
Высказаться о наболевшем, я выслушаю:
Имя


email (не публикуется)