Генерация 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);