Генерация псевдо-xls-файла с заказами

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

Если нужно сгенерировать файл со стилями, с функциями, со сложными обработками - тут, конечно же не обойтись без специальных библиотек, вродe PHPExcel. Но если нужны просто данные, которые можно открыть в экселе, как нужно подправить и отправить на печать - тут можно обойтись и без сторонних библиотек.

В нашем, упрощенном варианте, мы просто создадим html-файл с таблицей, который сохраним как .xls. А при открытии экселем данный файл автоматически будет прочитан в таблицу.

Итак, для начала получаем всю необходимую информацию по заказам:

use Bitrix\Main\IO;
use Bitrix\Main\Application;
\Bitrix\Main\Loader::includeModule('sale');

	$orders = array(XXX.....);  // - массив из идентификаторов заказов, которые нужно выгрузить
if(!empty($orders))
{
	$arOrdersList = array();
	foreach ($orders as $orderID)
	{
		$order = Bitrix\Sale\Order::load(intval($orderID));
		$propertyCollection = $order->getPropertyCollection();
		$arProperties = array();
		foreach ($propertyCollection->getArray()['properties'] as $property)
		{
			$arProperties[$property['CODE']] = array(
				'NAME'=>$property['NAME'],
				'VALUE'=>$property['VALUE'][0]
			);
		}

		$arBasket = array();
		$basketItems = $order->getBasket()->getBasketItems();
		foreach ($basketItems as $basketItem)
		{
			$arBasket[] = array(
				'ID'=>$basketItem->getId(),
				'PRODUCT_ID'=>$basketItem->getProductId(),
				'NAME'=>$basketItem->getField('NAME'),
				'PRICE'=>$basketItem->getPrice(),
				'QUANTITY'=>$basketItem->getQuantity(),
				'FINAL_PRICE'=>$basketItem->getFinalPrice()
			);
		}

		$arOrdersList[] = array(
			'ID'=>$order->getId(),
			'NUMBER'=>$order->getField('ACCOUNT_NUMBER'),
			'OWNER'=>$arProperties['FIO']['VALUE'],
			'PHONE'=>$arProperties['PHONE']['VALUE'],
			'ADDR'=>$arProperties['ADDRESS']['VALUE'],
			'BASKET'=>$arBasket,
			'ORDER_SUM'=>$order->getPrice(),
			'ORDER_SUM_PAYD'=>$order->getSumPaid(),
			'USER_DESCRIPTION'=>$order->getField('USER_DESCRIPTION'),
			'COMMENTS'=>$order->getField('COMMENTS'),
			'ADDITIONAL_INFO'=>$order->getField('ADDITIONAL_INFO'),
		);
	}
}

Дальше - создаем файл, в который помещаем полученную информацию:

$resultFile = '/upload/data.xls';
$resultAbsFile = Application::getDocumentRoot().$resultFile;
$file = new IO\File($resultAbsFile);
$file->putContents('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="author" /&пt;
<title>Demo</title>
</head>
<body>
');
$file->putContents('<table border="1 cellspacing="0" cellpadding="0" class="ta1">',IO\File::APPEND);
$file->putContents('<tr>
	<th>№ заказа</th>
	<th>Покупатель</th>
	<th>Телефон</th>
	<th>Адрес доставки:<br> из поля коментарий</th>
	<th>Состав заказа</th>
	<th>Кол-во</th>
	<th>Цена<br>Цена в чек</th>
	<th>Итого к оплате <br>Наложенный платеж</th>

</tr>',IO\File::APPEND);

Помещаем в файл информацию по заказам:

foreach ($arOrdersList as $arOrder)
	{
		$addrLine = $arOrder['ADDR'];
		if(strlen($arOrder['COMMENTS'])>0) $addrLine .= '<br>'.$arOrder['COMMENTS'];
		if(strlen($arOrder['USER_DESCRIPTION'])>0 && $arOrder['USER_DESCRIPTION']!==$arOrder['COMMENTS']) $addrLine .= '<br>'.$arOrder['USER_DESCRIPTION'];
		$basketLine = '<td>';
		foreach ($arOrder['BASKET'] as $num=>$arBasketItem)
		{
			$basketLine.=$arOrder['BASKET'][$num]['NAME'].(count($arOrder['BASKET'])>0 ? '<br>' : '');
		}
		$basketLine .= '</td>';
		$basketLine.='<td>';
		foreach ($arOrder['BASKET'] as $num=>$arBasketItem)
		{
			$basketLine.=$arOrder['BASKET'][$num]['QUANTITY'].(count($arOrder['BASKET'])>0 ? '<br>' : '');
		}
		$basketLine.='</td>';

		$basketLine.='<td>';
		foreach ($arOrder['BASKET'] as $num=>$arBasketItem)
		{
			$basketLine.=$arOrder['BASKET'][$num]['PRICE'].(count($arOrder['BASKET'])>0 ? '<br>' : '');
		}
		$basketLine.='</td>';

		$file->putContents('<tr>',IO\File::APPEND);
		$file->putContents('
			<td>'.$arOrder['NUMBER'].'</td>
			<td>'.$arOrder['OWNER'].'</td>
			<td>'."'".$arOrder['PHONE']." ".'</td>
			<td>'.$addrLine.'</td>'
			.$basketLine.
			'<td>'.(floatval($arOrder['ORDER_SUM'])-floatval($arOrder['ORDER_SUM_PAYD'])).'</td>
			',IO\File::APPEND);
		$file->putContents('</tr>',IO\File::APPEND);
	}

и завершаем файл:

$file->putContents('</table>',IO\File::APPEND);
	$file->putContents('</body></html>',IO\File::APPEND);
	$APPLICATION->RestartBuffer();
		header('Content-type: application/json');
		echo \Bitrix\Main\Web\Json::encode(array('url'=>$resultFile));
		exit();

Вот такая нехитрая конструкция позволяет сделать жизнь менеджеров немного проще.

Количество показов: 3294
06.06.2018

Возврат к списку

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.