Создание товарной накладной в PHPExcel

Пример, как сформировать товарную накладную с помощью библиотеки PHPExcel. В результате получится файл в формате xlsx (Excel 2007):

Товарная накладная в Exel
1
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel/Classes/PHPExcel/Writer/Excel2007.php';
PHP

Создаем экземпляр класса PHPExcel.

$xls = new PHPExcel();
PHP

Писать будем в первый лист.

$xls->setActiveSheetIndex(0);
$sheet = $xls->getActiveSheet();
PHP
2

Ширина задается в количестве символов.

$sheet->getColumnDimension('A')->setWidth(12);
$sheet->getColumnDimension('B')->setWidth(17);
$sheet->getColumnDimension('C')->setWidth(60);
$sheet->getColumnDimension('D')->setWidth(10);
$sheet->getColumnDimension('E')->setWidth(6);
$sheet->getColumnDimension('F')->setWidth(10);
$sheet->getColumnDimension('G')->setWidth(10);
PHP
3

Для удобства заводим переменную $line, в ней будем считать номер строки.

$line = 1;
$sheet->setCellValue("A{$line}", 'Товарная накладная № 1 от ' . date('d.m.Y H:i'));
PHP

Объединяем ячейки по горизонтали.

$sheet->mergeCells("A{$line}:G{$line}");
PHP

Делаем выравнивание по центру вертикали и горизонтали.

$sheet->getStyle("A{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$sheet->getStyle("A{$line}")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
PHP

Делаем текст жирным и увеличиваем шрифт.

$sheet->getStyle("A{$line}")->getFont()->setBold(true);
$sheet->getStyle("A{$line}")->getFont()->setSize(18);
PHP

Пропускаем строку после заголовка.

$line++;
$sheet->setCellValue("A{$line}", '');
$sheet->mergeCells("A{$line}:G{$line}");
PHP
4
$line++;
$sheet->setCellValue("A{$line}", 'Поставщик:');
$sheet->setCellValue("B{$line}", htmlspecialchars_decode('ООО Рога'));
$sheet->getStyle("B{$line}")->getFont()->setBold(true);
$sheet->mergeCells("B{$line}:G{$line}");

$line++;
$sheet->setCellValue("B{$line}", 'Адрес: г. Москва, ул. Тверская, д.24, тел: 8 (923) 123-45-67'); 
$sheet->mergeCells("B{$line}:G{$line}");
PHP
5
$line++;
$sheet->setCellValue("A{$line}", 'Покупатель:');
$sheet->setCellValue("B{$line}", 'Иванов Иван Иванович');
$sheet->getStyle("B{$line}")->getFont()->setBold(true);
$sheet->mergeCells("B{$line}:G{$line}");

$line++;
$sheet->setCellValue("B{$line}", 'Тел 9 (999) 999-99-99');
$sheet->mergeCells("B{$line}:G{$line}");
PHP

Пропускаем строку.

$line++;
$sheet->setCellValue("A{$line}", '');
$sheet->mergeCells("A{$line}:G{$line}");
PHP
6

Запоминаем строку с которой начинается таблица чтобы потом сделать рамку.

$line++;
$start_table = $line;
PHP

Шапка таблицы

$sheet->setCellValue("A{$line}", 'п/п');
$sheet->setCellValue("B{$line}", 'Артикул');
$sheet->setCellValue("C{$line}", 'Название');
$sheet->setCellValue("D{$line}", 'Кол-во');
$sheet->setCellValue("E{$line}", 'Ед.');
$sheet->setCellValue("F{$line}", 'Цена');
$sheet->setCellValue("G{$line}", 'Сумма');
PHP

Стили для текста в шапки таблицы.

$sheet->getStyle("A{$line}:G{$line}")->getFont()->setBold(true); 
$sheet->getStyle("A{$line}:G{$line}")->getAlignment()->setWrapText(true);
$sheet->getStyle("A{$line}:G{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
$sheet->getStyle("A{$line}:G{$line}")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
PHP

В данном примере товары представлены в виде массива.

$prods = array(
	array(
		'sku'   => '8545775',
		'name'  => 'Боксерские перчатки GREEN HILL Super Star (без марки AIBA)',
		'price' => '6060',
		'count' => '2'
	),
	array(
		'sku'   => '865645',
		'name'  => 'Боксерский мешок 120X35, 46 кг',
		'price' => '9900',
		'count' => '1'
	),
	array(
		'sku'   => '865643',
		'name'  => 'Кронштейн для боксерского мешка',
		'price' => '4800',
		'count' => '3'
	),
);
PHP

Далее в цикле выводим товары.

foreach ($prods as $i => $prod) {
	$line++;
	$sheet->setCellValue("A{$line}", ++$i);
	$sheet->setCellValue("B{$line}", $prod['sku']);
	$sheet->setCellValue("C{$line}", $prod['name']);
	$sheet->setCellValue("D{$line}", $prod['count']);
	$sheet->setCellValue("E{$line}", 'шт.');
	$sheet->setCellValue("F{$line}", number_format($prod['price'], 2, ',', ' '));
	$sheet->setCellValue("G{$line}", number_format($prod['price'] * $prod['count'], 2, ',', ' '));

	// Выравнивание текста в ячейках.
	$sheet->getStyle("A{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
	$sheet->getStyle("B{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
	$sheet->getStyle("C{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
	$sheet->getStyle("D{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
	$sheet->getStyle("E{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
	$sheet->getStyle("F{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
	$sheet->getStyle("G{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

	// Подсчет "Итого".
	@$total += $prod['price'] * $prod['count'];
}
PHP

Добавляем рамку к таблице.

$sheet->getStyle("A{$start_table}:G{$line}")->applyFromArray(
	array(
		'borders' => array(
			'allborders' => array(
				'style' => PHPExcel_Style_Border::BORDER_THIN
			)
		)
	)
);
PHP
7
$line++;
$sheet->setCellValue("A{$line}", 'Итого:');
$sheet->mergeCells("A{$line}:F{$line}");

$sheet->setCellValue("G{$line}", number_format($total, 2, ',', ' '));
$sheet->getStyle("A{$line}:G{$line}")->getFont()->setBold(true);
$sheet->getStyle("A{$line}:G{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
PHP
8
$line++;
$sheet->setCellValue("A{$line}", 'В том числе НДС:');
$sheet->mergeCells("A{$line}:F{$line}");

$sheet->setCellValue("G{$line}", number_format(($total / 100) * 20, 2, ',', ' '));
$sheet->getStyle("A{$line}:G{$line}")->getFont()->setBold(true);
$sheet->getStyle("A{$line}:G{$line}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
PHP
9
$line++;
$sheet->setCellValue(
	"A{$line}",
	'Всего наименований ' . count($prods) . ', на сумму ' . number_format($total, 2, ',', ' ') . ' руб.'
);
$sheet->mergeCells("A{$line}:G{$line}");
PHP
10

Здесь используется функция num2str() для получение суммы прописью, взято с https://habrahabr.ru/post/53210/.

Еще нужно у суммы прописью сделать первую букву заглавной. Т.к. скрипт в UTF-8 функция ucfirst не работает, поэтому используется аналог – mb_ucfirst().

$line++;
$sheet->setCellValue("A{$line}", mb_ucfirst(num2str($total)));
$sheet->getStyle("A{$line}")->getFont()->setBold(true);
$sheet->mergeCells("A{$line}:G{$line}");
PHP
11

Отдаем его браузеру на скачивание

header("Expires: Mon, 1 Apr 1974 05:00:00 GMT");
header("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-type: application/vnd.ms-excel" );
header("Content-Disposition: attachment; filename=order.xlsx");

$objWriter = new PHPExcel_Writer_Excel2007($xls);
$objWriter->save('php://output'); 
PHP

Или сохраняем на сервере

$objWriter = new PHPExcel_Writer_Excel2007($xls);
$objWriter->save(__DIR__ . '/order.xlsx');
PHP
27.01.2017, обновлено 17.12.2022
20810

Комментарии

, чтобы добавить комментарий.

Другие публикации

Обзор PHP расширений для чтения файлов Excel
В статье представлены различные PHP-расширения для чтения файлов XLS, XLSX, описаны их плюсы и минусы, а также примеры...
60606
+2
Excel: Как умножить все выделенные ячейки на число
Задача: В прайс-листе необходимо увеличить цены на 20%, при этом чтобы в листе не было формул.
23677
+4
Редактирование файла в PHPExcel
Иногда бывают случаи, когда нужно заполнить некий уже сформатированный xls-файл в PHP. Библиотека PHPExcel тоже это...
5078
0
Чтение Google таблиц в PHP
Как получить данные из Google spreadsheets в виде массива PHP? Очень просто, Google docs позволяет экспортировать лист в формате CSV, главное чтобы файл был в общем доступе.
25365
+6
Пример парсинга html-страницы на phpQuery
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
68300
+27
Яндекс.Доставка работа с API в PHP
Примеры работы с API Яндекс.Доставки (для заказа перевозки грузов корпоративным клиентам).
10092
+5