В нашем, упрощенном варианте, мы просто создадим 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();
Вот такая нехитрая конструкция позволяет сделать жизнь менеджеров немного проще.