Генерация xls
Простое и легковесное создание xls без сторонних библиотек. С поддержкой стилей
static array $statuses = [
0 => ['text' => '', 'color' => 'FFFFFF'],
2 => ['text' => 'Новый клиент с суммой всех заказов более 6000 рублей', 'color' => '9DD9A7'],
3 => ['text' => 'Новый клиент с суммой всех заказов менее 6000 рублей', 'color' => 'C2DFC7'],
4 => ['text' => 'Вернувшийся клиент с суммой всех заказов более 6000 рублей', 'color' => 'D3D99D'],
5 => ['text' => 'Вернувшийся клиент с суммой всех заказов менее 6000 рублей', 'color' => 'E5E9C2'],
];
$str = '<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Styles>
<Style ss:ID="s1">
<Font ss:Bold="1"/>
<Borders>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2"/>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2"/>
<Border ss:Position="InsideHorizontal" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="InsideVertical" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
</Style>';
foreach (self::$statuses as $i => $status) {
$str .= '<Style ss:ID="s' . $i .'"><Interior ss:Color="#' . $status['color'] . '" ss:Pattern="Solid" ss:Weight="0"/>
<Borders>
<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="0"/>
<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="0"/>
<Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="0"/>
<Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="0"/>
<Border ss:Position="InsideHorizontal" ss:LineStyle="Continuous" ss:Weight="1"/>
<Border ss:Position="InsideVertical" ss:LineStyle="Continuous" ss:Weight="1"/>
</Borders>
</Style>';
}
$str .= '
</Styles>
<Worksheet ss:Name="Sheet1"><Table>';
$str .= "<Row>
<Cell ss:StyleID='s1'><Data ss:Type='String'>Номер заказа</Data></Cell>
...
<Cell ss:StyleID='s1'><Data ss:Type='String'>Статус клиента</Data></Cell>
</Row>";
foreach ($data as $row) {
$first = true;
foreach ($row['products'] as $product) {
$str .= '<Row>';
$str .= "
<Cell ss:StyleID='s".$row['is_new']."'><Data ss:Type='String'>${row['id']}</Data></Cell>
...
<Cell ss:StyleID='s".$row['is_new']."'><Data ss:Type='String'>" . self::$statuses[$row['is_new']]['text'] . "</Data></Cell>
</Row>";
}
}
$str .= "<Row></Row><Row><Cell ss:MergeAcross='7' ss:StyleID='s0'><Data ss:Type='String'>Статусы заказов:</Data></Cell></Row>";
foreach (self::$statuses as $i => $status) {
$str .= "<Row><Cell ss:MergeAcross='7' ss:StyleID='s" . $i . "'><Data ss:Type='String'>" . $status['text'] . "</Data></Cell></Row>";
}
$str .= "</Table></Worksheet></Workbook>";
$fp = fopen($fileName, 'w');
fwrite($fp, $str);
fclose($fp);