Запись в файл excel php

К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной библиотекой которая выполняет свои задачи, последняя версия нормально работает на PHP 7.

Проект на GitHub.

1

Создание документа

require_once __DIR__ . '/PHPExcel-1.8/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel-1.8/Classes/PHPExcel/Writer/Excel2007.php';

$xls = new PHPExcel();

PHP

Если нужно открыть существующий файл:

require_once __DIR__ . '/PHPExcel-1.8/Classes/PHPExcel.php';
require_once __DIR__ . '/PHPExcel-1.8/Classes/PHPExcel/Writer/Excel2007.php';
require_once __DIR__ . '/PHPExcel-1.8/Classes/PHPExcel/IOFactory.php';

$xls = PHPExcel_IOFactory::load(__DIR__ . '/file.xlsx');

PHP

Установка сводки документа:

$xls->getProperties()->setTitle("Название");
$xls->getProperties()->setSubject("Тема");
$xls->getProperties()->setCreator("Автор");
$xls->getProperties()->setManager("Руководитель");
$xls->getProperties()->setCompany("Организация");
$xls->getProperties()->setCategory("Группа");
$xls->getProperties()->setKeywords("Ключевые слова");
$xls->getProperties()->setDescription("Примечания");
$xls->getProperties()->setLastModifiedBy("Автор изменений");
$xls->getProperties()->setCreated("25.03.2019");

PHP

Защита книги паролем:

$xls->getActiveSheet()->getProtection()->setSheet(true);
$xls->getActiveSheet()->getProtection()->setSort(true);
$xls->getActiveSheet()->getProtection()->setInsertRows(true);
$xls->getActiveSheet()->getProtection()->setFormatCells(true);
$xls->getActiveSheet()->getProtection()->setPassword('123456');

PHP

Создаем новый лист, далее работаем с ним через переменную $sheet.

$xls->setActiveSheetIndex(0);
$sheet = $xls->getActiveSheet();
$sheet->setTitle('Название листа');

PHP

Параметры печати

// Формат
$sheet->getPageSetup()->SetPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);

// Ориентация
// ORIENTATION_PORTRAIT — книжная
// ORIENTATION_LANDSCAPE — альбомная
$sheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT);

// Поля
$sheet->getPageMargins()->setTop(1);
$sheet->getPageMargins()->setRight(0.75);
$sheet->getPageMargins()->setLeft(0.75);
$sheet->getPageMargins()->setBottom(1);

// Верхний колонтитул
$sheet->getHeaderFooter()->setOddHeader("Название листа");

// Нижний колонтитул
$sheet->getHeaderFooter()->setOddFooter('&L&B Название листа &R Страница &P из &N');

PHP

Запись в ячейку и ее формат

$sheet->setCellValue("A1", "Значение");

PHP

Формат ячеек определяется автоматически, иногда это вызывает проблемы. Например, значения 1., 10.0, 0.1 выведутся как 1, 10, 0,1. Чтобы это исправить нужно использовать метод setCellValueExplicit() в место setCellValue().

$sheet->setCellValueExplicit("A1", '1.', PHPExcel_Cell_DataType::TYPE_STRING);
$sheet->setCellValueExplicit("A2", '10.0', PHPExcel_Cell_DataType::TYPE_STRING);
$sheet->setCellValueExplicit("A3", '0.1', PHPExcel_Cell_DataType::TYPE_STRING);

PHP

2

Размеры ячеек

Ширина столбцов

// Ширина столбца A 
$sheet->getColumnDimension("A")->setWidth(100);

// Авто ширина колонки по содержимому
$sheet->getColumnDimensionByColumn("A")->setAutoSize(true);

PHP

Высота строк

// Высота 1-й строки
$sheet->getRowDimension("1")->setRowHeight(50);

PHP

Вставленный в ячейку длинный текст будет выходить за ее пределы, переносы rn работать не будут.

$sheet->setCellValue("A1", "Excel — программа rn для работы с электронными таблицами");

PHP

Метод setWrapText(true) включает переносы строк и авто высоту.

$sheet->setCellValue("A1", "Excel — программа rn для работы с электронными таблицами");
$sheet->getStyle("A1")->getAlignment()->setWrapText(true);

PHP

3

Объединение ячеек

// Объединение ячеек в колонке
$sheet->mergeCells("A1:A6");
$sheet->setCellValue("A1", "A1:A6");

// Объединение ячеек в строке
$sheet->mergeCells("C2:I2");
$sheet->setCellValue("C2", "C2:I2");

// Объединение ячеек по диапазону
$sheet->mergeCells("C4:I6");
$sheet->setCellValue("C4", "C4:I6");

PHP

Объединение ячеек PHPExcel

4

Стили текста

// Шрифт Times New Roman
$sheet->getStyle('A1')->getFont()->setName('Times New Roman');

// Размер шрифта 18
$sheet->getStyle("A2")->getFont()->setSize(18);

// Цвет шрифта
$sheet->getStyle("A3")->getFont()->getColor()->setRGB('ff0000');

// Жирный
$sheet->getStyle("A4")->getFont()->setBold(true);

// Курсив
$sheet->getStyle("A5")->getFont()->setItalic(true);

// Подчеркнутый текст
$sheet->getStyle("A6")->getFont()->setUnderline(true);

// Зачеркнутый текст
$sheet->getStyle("A7")->getFont()->setStrikethrough(true);

PHP

Стили текста PHPExcel

Также можно задать сразу несколько стилей для ячейки, массивом:

$style = array(
	'font' => array(
		'name'      => 'Times New Roman',
		'size'      => 18,   
		'color'     => array('rgb' => 'FF0000'),              
		'bold'      => true,
		'italic'    => true,
		'underline' => true,
		'strike'    => true,
	)
);

$sheet->getStyle('A1')->applyFromArray($style);

PHP

Установить стили шрифта для всего документа:

$sheet->getDefaultStyle()->getFont()->setName('Times New Roman');
$sheet->getDefaultStyle()->getFont()->setSize(18);

PHP

Или:

$style = array(
	'font' => array(
		'name' => 'Times New Roman',
		'size' => 18,  
	)
);

$sheet->getDefaultStyle()->applyFromArray($style);

PHP

5

Выравнивание в ячейке

По горизонтали:

// По левому краю
$sheet->getStyle("A1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);

// По центру
$sheet->getStyle("A1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

// По правому краю
$sheet->getStyle("A1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

PHP

По вертикали:

// Сверху
$sheet->getStyle("A1")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_TOP);

// По центру
$sheet->getStyle("A1")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

// Снизу
$sheet->getStyle("A1")->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_BOTTOM);

PHP

6

Фон ячейки

Стили фона устанавливаются массивом значений, type – определяет стиль заливки, далее в зависимости от выбранного стиля задаются его настройки в параметрах color, startcolor, endcolor, rotation.

PHPExcel_Style_Fill::FILL_SOLID

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_SOLID,
		'color' => array('rgb' => '01B050')
	)
);
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_SOLID

PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
		'rotation' => 90
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR

PHPExcel_Style_Fill::FILL_GRADIENT_PATH

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_GRADIENT_PATH,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_GRADIENT_PATH

PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN

PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY

PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID

PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL

PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS

PHPExcel_Style_Fill::FILL_PATTERN_DARKUP

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_DARKUP,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_DARKUP

PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL

PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625

PHPExcel_Style_Fill::FILL_PATTERN_GRAY125

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_GRAY125,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_GRAY125

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL

PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY

$bg = array(
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY,
		'startcolor' => array('rgb' => '01B050'),
		'endcolor' => array('rgb' => 'f1ee3b'),
	)
);                 
$sheet->getStyle("B2")->applyFromArray($bg);

PHP

PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY

7

Границы

Стили линий задаются костантами:

Вид Константа
PHPExcel_Style_Border::BORDER_NONE
PHPExcel_Style_Border::BORDER_THIN
PHPExcel_Style_Border::BORDER_MEDIUM
PHPExcel_Style_Border::BORDER_THICK
PHPExcel_Style_Border::BORDER_DOUBLE
PHPExcel_Style_Border::BORDER_HAIR
PHPExcel_Style_Border::BORDER_DOTTED
PHPExcel_Style_Border::BORDER_DASHED
PHPExcel_Style_Border::BORDER_DASHDOT
PHPExcel_Style_Border::BORDER_DASHDOTDOT
PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT
PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT
PHPExcel_Style_Border::BORDER_MEDIUMDASHED
PHPExcel_Style_Border::BORDER_SLANTDASHDOT

Внешняя рамка у ячеек

$border = array(
	'borders'=>array(
		'outline' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		),
	)
);

$sheet->getStyle("B2:J5")->applyFromArray($border);

PHP

Внешняя рамка у ячеек

Внутриния рамка у ячеек

$border = array(
	'borders'=>array(
		'inside' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		),
	)
);

$sheet->getStyle("B2:J5")->applyFromArray($border);

PHP

Внутриния рамка у ечеек

Таблица

$border = array(
	'borders'=>array(
		'allborders' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		)
	)
);

$sheet->getStyle("B2:J5")->applyFromArray($border);

PHP

Таблица

Таблица с жирной рамкой

$border = array(
	'borders'=>array(
		'outline' => array(
			'style' => PHPExcel_Style_Border::BORDER_THICK,
			'color' => array('rgb' => '000000')
		),
		'allborders' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		)
	)
);

$sheet->getStyle("B2:J5")->applyFromArray($border);

PHP

Таблица с жирной рамкой

Отдельные линии

            case '':
			case 'bottom':
			case 'diagonal':
			case 'horizontal':
			case '':
			case 'left':
			case '':
			case 'right':
			case 'top':
			case 'vertical':

Сверху:

$border = array(
	'borders'=>array(
		'top' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		)
	)
);
$sheet->getStyle("B2")->applyFromArray($border);

PHP

Снизу:

$border = array(
	'borders'=>array(
		'bottom' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		)
	)
);
$sheet->getStyle("B4")->applyFromArray($border);

PHP

Слева:

$border = array(
	'borders'=>array(
		'left' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		)
	)
);
$sheet->getStyle("B6")->applyFromArray($border);

PHP

Справа:

$border = array(
	'borders'=>array(
		'right' => array(
			'style' => PHPExcel_Style_Border::BORDER_THIN,
			'color' => array('rgb' => '000000')
		)
	)
);
$sheet->getStyle("B8")->applyFromArray($border);

PHP

Отдельные линии

8

Изображения

$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setResizeProportional(false);  
$objDrawing->setName('Название картинки');
$objDrawing->setDescription('Описание картинки');
$objDrawing->setPath(__DIR__ . '/logo.png');
$objDrawing->setCoordinates('B2');                      
$objDrawing->setOffsetX(10); 
$objDrawing->setOffsetY(10);                
$objDrawing->setWidth(163); 
$objDrawing->setHeight(50); 
$objDrawing->setWorksheet($sheet);

PHP

Изображения в PHPExcel

9

$sheet->setCellValue("A1", "Ссылка на example.com");
$sheet->getCell("A1")->getHyperlink()->setUrl("http://example.com");
$sheet->getCell("A1")->getHyperlink()->setTooltip('Подсказка');

// У текста нужно сделать синий цвет и подчеркивание
$sheet->getStyle("A1")->applyFromArray(
	array(
		'font' => array(
			'color' => array(
				'rgb' => '0000FF'
			), 
			'underline' => 'single'
		)
	)
);

PHP

Гиперссылка в PHPExcel

10

Формулы

Русские названия функций не поддерживаются, придется использовать латинские аналоги.

$sheet->setCellValue("A3", "=SUM(A1:A2)");

PHP

СУММ SUM Cуммирование значений в ячейках
ЕСЛИ IF Условие
ПРОСМОТР LOOKUP Поиск по значению
ВПР VLOOKUP Поиск значения по диапазону
ПОИСКПОЗ MATCH Поиск положенияв диапазоне ячеек
ВЫБОР CHOOSE Выбор одного значения из списка
ДАТА DATE Возвращает порядковый номер определенной даты
ДНИ DAYS Возвращает число дней между двумя датами
НАЙТИ, НАЙТИБ FIND, FINDB Поиск вхождения одной строки в другую
ИНДЕКС INDEX Возвращает значение или ссылку на него из таблицы или диапазона

11

Сохранение

XLSX

Отдача на скачивание:

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.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment; filename=file.xlsx");

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

PHP

Если возникает ошибка – «Uncaught exception 'PHPExcel_Writer_Exception' with message 'Could not close zip file php://output.'», то следует сделать скачивание через временный файл:

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.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment; filename=file.xlsx");

$file_path = __DIR__ . "/xlsx.tmp";
$objWriter = new PHPExcel_Writer_Excel2007($xls);
$objWriter->save($file_path);
readfile($file_path);
unlink($file_path);
exit();

PHP

Сохранение в файл:

$objWriter = new PHPExcel_Writer_Excel2007($xls);
$objWriter->save(__DIR__ . '/file.xlsx');

PHP

XLS (Excel 97-2004)

Отдача на скачивание:

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=file.xls");
	
$objWriter = new PHPExcel_Writer_Excel5($xls);
$objWriter->save('php://output'); 
exit();	

PHP

Сохранение в файл:

$objWriter = new PHPExcel_Writer_Excel5($xls);
$objWriter->save(__DIR__ . '/file.xls');

PHP

Время на прочтение
16 мин

Количество просмотров 240K

Не редко при разработке некоего проекта, возникает необходимость в формировании отчетной статистики. Если проект разрабатывается на Delphi, C# или к примеру, на С++ и под Windows, то тут проблем нет. Всего лишь необходимо воспользоваться COM объектом. Но дела обстоят иначе, если необходимо сформировать отчет в формате excel на PHP. И чтобы это творение функционировало на UNIX-подобных системах. Но, к счастью, не так все плохо. И библиотек для этого хватает. Я свой выбор остановил на PHPExcel. Я уже пару лет работаю с этой библиотекой, и остаюсь доволен. Поскольку она является кроссплатформенной, то не возникает проблем с переносимостью.

PHPExcel позволяет производить импорт и экспорт данных в excel. Применять различные стили оформления к отчетам. В общем, все на высоте. Даже есть возможность работы с формулами. Только необходимо учитывать, что вся работа (чтение и запись) должна вестись в кодировке utf-8.

Установка библиотеки

Для работы необходима версия PHP 5.2.0 или выше. А также необходимы следующие расширения: php_zip, php_xml и php_gd2. Скачать библиотеку можно отсюда.

С помощью библиотеки PHPExcel можно записывать данные в следующие форматы:

  • Excel 2007;
  • Excel 97 и поздние версии;
  • PHPExcel Serialized Spreadshet;
  • HTML;
  • PDF;
  • CSV.

Импорт данных из PHP в Excel

Рассмотрим пример по формированию таблицы умножения.

// Подключаем класс для работы с excel
require_once('PHPExcel.php');
// Подключаем класс для вывода данных в формате excel
require_once('PHPExcel/Writer/Excel5.php');

// Создаем объект класса PHPExcel
$xls = new PHPExcel();
// Устанавливаем индекс активного листа
$xls->setActiveSheetIndex(0);
// Получаем активный лист
$sheet = $xls->getActiveSheet();
// Подписываем лист
$sheet->setTitle('Таблица умножения');

// Вставляем текст в ячейку A1
$sheet->setCellValue("A1", 'Таблица умножения');
$sheet->getStyle('A1')->getFill()->setFillType(
    PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyle('A1')->getFill()->getStartColor()->setRGB('EEEEEE');

// Объединяем ячейки
$sheet->mergeCells('A1:H1');

// Выравнивание текста
$sheet->getStyle('A1')->getAlignment()->setHorizontal(
    PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

for ($i = 2; $i < 10; $i++) {
	for ($j = 2; $j < 10; $j++) {
        // Выводим таблицу умножения
        $sheet->setCellValueByColumnAndRow(
                                          $i - 2,
                                          $j,
                                          $i . "x" .$j . "=" . ($i*$j));
	    // Применяем выравнивание
	    $sheet->getStyleByColumnAndRow($i - 2, $j)->getAlignment()->
                setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
	}
}

Далее нам необходимо получить наш *.xls файл. Здесь можно пойти двумя путями. Если предположим у вас интернет магазин, и клиент хочет скачать прайс лист, то будет лучше прибегнуть к такому выводу:

// Выводим HTTP-заголовки
 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=matrix.xls" );

// Выводим содержимое файла
 $objWriter = new PHPExcel_Writer_Excel5($xls);
 $objWriter->save('php://output');

Здесь сформированные данные сразу “выплюнутся” в браузер. Однако, если вам нужно файл сохранить, а не “выбросить” его сразу, то не нужно выводить HTTP-заголовки и вместо “php://output” следует указать путь к вашему файлу. Помните что каталог, в котором предполагается создание файла, должен иметь права на запись. Это касается UNIX-подобных систем.

Рассмотрим еще на примере три полезные инструкции:

  • $sheet->getColumnDimension(‘A’)->setWidth(40) – устанавливает столбцу “A” ширину в 40 единиц;
  • $sheet->getColumnDimension(‘B’)->setAutoSize(true) – здесь у столбца “B” будет установлена автоматическая ширина;
  • $sheet->getRowDimension(4)->setRowHeight(20) – устанавливает четвертой строке высоту равную 20 единицам.

Также обратите внимание на следующие необходимые для работы с отчетом методы:

  • Методы для вставки данных в ячейку:
    • setCellValue([$pCoordinate = ‘A1’ [, $pValue = null [, $returnCell = false]]]) — принимает три параметра: координату ячейки, данные для вывода в ячейку и третий параметр эта одна из констант типа boolean: true или false (если передать значение true, то метод вернет объект ячейки, иначе объект рабочего листа);
    • setCellValueByColumnAndRow([$pColumn = 0 [, $pRow = 1 [, $pValue = null [, $returnCell = false]]]]) — принимает четыре параметра: номер столбца ячейки, номер строки ячейки, данные для вывода в ячейку и четвертый параметр действует по аналогии с третьим параметром метода setCellValue().
  • Методы для получения ячейки:
    • getCell([$pCoordinate = ‘A1’]) — принимает в качестве параметра координату ячейки;
    • getCellByColumnAndRow([$pColumn = 0 [, $pRow = 1]]) — принимает два параметра в виде номеров столбца и строки ячейки.

Как мы видим, вышеприведенные методы являются парными. Поэтому мы можем работать с ячейками используя строковое или числовое представление координат. Что конечно же является дополнительным преимуществом в работе.

Оформление отчета средствами PHP в Excel

Очень часто возникает необходимость выделить в отчете некоторые данные. Сделать выделение шрифта или применить рамку с заливкой фона для некоторых ячеек и т.д. Что позволяет сконцентрироваться на наиболее важной информации (правда может и наоборот отвлечь). Для этих целей в библиотеке PHPExcel есть целый набор стилей, которые можно применять к ячейкам в excel. Есть конечно в этой библиотеке небольшой “минус” – нельзя применить стиль к нескольким ячейкам одновременно, а только к каждой индивидуально. Но это не создает дискомфорта при разработке web-приложений.

Назначить стиль ячейке можно тремя способами:

  • Использовать метод applyFromArray, класса PHPExcel_Style. В метод applyFromArray передается массив со следующими параметрами:
    • fill — массив с параметрами заливки;
    • font — массив с параметрами шрифта;
    • borders — массив с параметрами рамки;
    • alignment — массив с параметрами выравнивания;
    • numberformat — массив с параметрами формата представления данных ячейки;
    • protection — массив с параметрами защиты ячейки.
  • Применить метод duplicateStyle, класса PHPExcel_Style. Этот метод может оказаться весьма полезным, если предстоит работа с заранее загруженным файлом (шаблоном), где удобнее будет продублировать стиль некой ячейки, чем самостоятельно его определять. Данный метод принимает два параметра:
    • pCellStyle – данный параметр является экземпляром класса PHPExcel_Style;
    • pRange – диапазон ячеек.
  • Использовать методы класса PHPExcel_Style для каждого из стилей в отдельности. К примеру, назначить ячейке шрифт можно так: $sheet->getStyle(‘A1’)->getFont()->setName(‘Arial’) .

Заливка

Значением параметра fill является массив со следующими необязательными параметрами:

  • type — тип заливки;
  • rotation — угол градиента;
  • startcolor — значение в виде массива с параметром начального цвета в формате RGB;
  • endcolor — значение в виде массива с параметром конечного цвета в формате ARGB;
  • color — значение в виде массива с параметром начального цвета в формате RGB.

Стили заливки

FILL_NONE none
FILL_SOLID solid
FILL_GRADIENT_LINEAR linear
FILL_GRADIENT_PATH path
FILL_PATTERN_DARKDOWN darkDown
FILL_PATTERN_DARKGRAY darkGray
FILL_PATTERN_DARKGRID darkGrid
FILL_PATTERN_DARKHORIZONTAL darkHorizontal
FILL_PATTERN_DARKTRELLIS darkTrellis
FILL_PATTERN_DARKUP darkUp
FILL_PATTERN_DARKVERTICAL darkVertical
FILL_PATTERN_GRAY0625 gray0625
FILL_PATTERN_GRAY125 gray125
FILL_PATTERN_LIGHTDOWN lightDown
FILL_PATTERN_LIGHTGRAY lightGray
FILL_PATTERN_LIGHTGRID lightGrid
FILL_PATTERN_LIGHTHORIZONTAL lightHorizontal
FILL_PATTERN_LIGHTTRELLIS lightTrellis
FILL_PATTERN_LIGHTUP lightUp
FILL_PATTERN_LIGHTVERTICAL lightVertical
FILL_PATTERN_MEDIUMGRAY mediumGray

Пример указания настроек для заливки:

array(
	'type'       => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR,
	'rotation'   => 0,
	'startcolor' => array(
		'rgb' => '000000'
	),
	'endcolor'   => array(
		'argb' => 'FFFFFFFF'
	),
	'color'   => array(
		'rgb' => '000000'
	)
);

Или можно использовать следующие методы:

$PHPExcel_Style->getFill()->setFillType(PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR);

$PHPExcel_Style->getFill()->setRotation(0);

$PHPExcel_Style->getFill()->getStartColor()->applyFromArray(array(‘rgb’ => ‘C2FABD’));

$PHPExcel_Style->getFill()->getEndColor()->applyFromArray(array(‘argb’ => ‘FFFFFFFF’)).

Вставка изображений

Довольно редко, но бывает полезным произвести вставку изображения в отчет. Это может быть логотип, схема и т.д. Для работы нам понадобятся следующие методы:

  • setPath([$pValue = », [$pVerifyFile = true]]) — данный метод принимает два параметра. В качестве первого параметра указывается путь к файлу с изображением. А второй параметр имеет смысл указывать, если необходимо осуществлять проверку существования файла (может принимать одно из значений true или false).
  • setCoordinates([$pValue = ‘A1’])) — принимает на вход один параметр в виде строки с координатой ячейки.
  • setOffsetX([$pValue = 0]) — принимает один параметр со значением смещения по X от левого края ячейки.
  • setOffsetY([$pValue = 0]) — принимает один параметр со значением смещения по Y от верхнего края ячейки.
  • setWorksheet([$pValue = null, [$pOverrideOld = false]]) — этот метод принимает на вход два параметра. Первый является обязательным, а второй нет. В качестве первого параметра указывается экземпляр класса PHPExcel_Worksheet (текущий активный лист). Если в качестве значения второго параметра передать true, то если лист уже был назначен ранее – произойдет его перезапись и соответственно изображение удалится.

Код демонстрирующий алгоритм вставки изображения приведен ниже:

...
	
$sheet->getColumnDimension('B')->setWidth(40);

$imagePath = dirname ( __FILE__ ) . '/excel.png';
		
		
if (file_exists($imagePath)) {
	$logo = new PHPExcel_Worksheet_Drawing();
	$logo->setPath($imagePath);
	$logo->setCoordinates("B2");				
	$logo->setOffsetX(0);
	$logo->setOffsetY(0);	
	$sheet->getRowDimension(2)->setRowHeight(190);
	$logo->setWorksheet($sheet);
} 

...

Вот так выглядит отчет со вставленным изображением:

Шрифт

В качестве значения параметра font указывается массив, который содержит следующие необязательные параметры:

  • name — имя шрифта;
  • size — размер шрифта;
  • bold — выделять жирным;
  • italic — выделять курсивом;
  • underline — стиль подчеркивания;
  • strike — перечеркнуть;
  • superScript — надстрочный знак;
  • subScript — подстрочный знак;
  • color — значение в виде массива с параметром цвета в формате RGB.

Стили подчеркивания

UNDERLINE_NONE нет
UNDERLINE_DOUBLE двойное подчеркивание
UNDERLINE_SINGLE одиночное подчеркивание

Пример указания параметров настроек для шрифта:

array(
	'name'      	=> 'Arial',
	'size'     	=> 12,
	'bold'      	=> true,
	'italic'    	=> false,
	'underline' 	=> PHPExcel_Style_Font::UNDERLINE_DOUBLE,
	'strike'    	=> false,
	'superScript' 	=> false,
	'subScript' 	=> false,
	'color'     	=> array(
		'rgb' => '808080'
	)
);

Или воспользоваться следующими методами:

$PHPExcel_Style->getFont()->setName(‘Arial’);

$PHPExcel_Style->getFont()->setBold(true);

$PHPExcel_Style->getFont()->setItalic(false);

$PHPExcel_Style->getFont()->setSuperScript(false);

$PHPExcel_Style->getFont()->setSubScript(false);

$PHPExcel_Style->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE);

$PHPExcel_Style->getFont()->setStrikethrough(false);

$PHPExcel_Style->getFont()->getColor()->applyFromArray(array(‘rgb’ => ‘808080’));

$PHPExcel_Style->getFont()->setSize(12).

Рамка

В качестве значения параметра borders указывается массив, который содержит следующие необязательными параметры:

  • тип рамки — (top|bootom|left|right|diagonal|diagonaldirection);
  • style — стиль рамки;
  • color — значение в виде массива с параметром цвета в формате RGB.

Стили линий

BORDER_NONE нет
BORDER_DASHDOT пунктирная с точкой
BORDER_DASHDOTDOT пунктирная с двумя точками
BORDER_DASHED пунктирная
BORDER_DOTTED точечная
BORDER_DOUBLE двойная
BORDER_HAIR волосная линия
BORDER_MEDIUM средняя
BORDER_MEDIUMDASHDOT пунктирная с точкой
BORDER_MEDIUMDASHDOTDOT утолщенная пунктирная линия с двумя точками
BORDER_MEDIUMDASHED утолщенная пунктирная
BORDER_SLANTDASHDOT наклонная пунктирная с точкой
BORDER_THICK утолщенная
BORDER_THIN тонкая

Пример указания параметров настроек для рамки:

array(
	'bottom'     => array(
		'style' => PHPExcel_Style_Border::BORDER_DASHDOT,
		'color' => array(
		'	rgb' => '808080'
		)
	),
	'top'     => array(
		'style' => PHPExcel_Style_Border::BORDER_DASHDOT,
		'color' => array(
			'rgb' => '808080'
		)
	)
);

Так же можно прибегнуть к использованию следующих методов:

$PHPExcel_Style->getBorders()->getLeft()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080′)));

$PHPExcel_Style->getBorders()->getRight()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080′)));

$PHPExcel_Style->getBorders()->getTop()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080′)));

$PHPExcel_Style->getBorders()->getBottom()->applyFromArray(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080′)));

$PHPExcel_Style->getBorders()->getDiagonal()->applyFromArray(array(‘style’ => PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080′)));

$PHPExcel_Style->getBorders()->setDiagonalDirection(array(‘style’ =>PHPExcel_Style_Border::BORDER_DASHDOT,’color’ => array(‘rgb’ => ’808080′))).

Выравнивание

Значением параметра alignment является массив, который принимает на вход четыре необязательных параметра:

  • horizontal — константа горизонтального выравнивания;
  • vertical — константа вертикального выравнивания;
  • rotation — угол поворота текста;
  • wrap — разрешить перенос текста;
  • shrinkToFit — изменять ли размер шрифта при выходе текста за область ячейки;
  • indent — отступ от левого края.

Выравнивание по горизонтали

HORIZONTAL_GENERAL основное
HORIZONTAL_LEFT по левому краю
HORIZONTAL_RIGHT по правому краю
HORIZONTAL_CENTER по центру
HORIZONTAL_CENTER_CONTINUOUS по центру выделения
HORIZONTAL_JUSTIFY по ширине

Выравнивание по вертикали

VERTICAL_BOTTOM по нижнему краю
VERTICAL_TOP по верхнему краю
VERTICAL_CENTER по центру
VERTICAL_JUSTIFY по высоте

Пример параметров настройки стилей выравнивания:

array(
	'horizontal' 	=> PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
	'vertical'   	=> PHPExcel_Style_Alignment::VERTICAL_CENTER,
	'rotation'   	=> 0,
	'wrap'       	=> true,
	'shrinkToFit'	=> false,
	'indent'	=> 5
)

Или использовать следующие методы:

$PHPExcel_Style->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

$PHPExcel_Style->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_JUSTIFY);

$PHPExcel_Style->getAlignment()->setTextRotation(10);

$PHPExcel_Style->getAlignment()->setWrapText(true);

$PHPExcel_Style->getAlignment()->setShrinkToFit(false);

$PHPExcel_Style->getAlignment()->setIndent(5).

Формат представления данных

Параметр numberformat представляет собой массив, который включает только один параметр: code — формат данных ячейки.

Список возможных форматов

FORMAT_GENERAL General
FORMAT_TEXT @
FORMAT_NUMBER 0
FORMAT_NUMBER_00 0.00
FORMAT_NUMBER_COMMA_SEPARATED1 #,##0.00
FORMAT_NUMBER_COMMA_SEPARATED2 #,##0.00_-
FORMAT_PERCENTAGE 0%
FORMAT_PERCENTAGE_00 0.00%
FORMAT_DATE_YYYYMMDD2 yyyy-mm-dd
FORMAT_DATE_YYYYMMDD yy-mm-dd
FORMAT_DATE_DDMMYYYY dd/mm/yy
FORMAT_DATE_DMYSLASH d/m/y
FORMAT_DATE_DMYMINUS d-m-y
FORMAT_DATE_DMMINUS d-m
FORMAT_DATE_MYMINUS m-y
FORMAT_DATE_XLSX14 mm-dd-yy
FORMAT_DATE_XLSX15 d-mmm-yy
FORMAT_DATE_XLSX16 d-mmm
FORMAT_DATE_XLSX17 mmm-yy
FORMAT_DATE_XLSX22 m/d/yy h:mm
FORMAT_DATE_DATETIME d/m/y h:mm
FORMAT_DATE_TIME1 h:mm AM/PM
FORMAT_DATE_TIME2 h:mm:ss AM/PM
FORMAT_DATE_TIME3 h:mm
FORMAT_DATE_TIME4 h:mm:ss
FORMAT_DATE_TIME5 mm:ss
FORMAT_DATE_TIME6 h:mm:ss
FORMAT_DATE_TIME7 i:s.S
FORMAT_DATE_TIME8 h:mm:ss
FORMAT_DATE_YYYYMMDDSLASH yy/mm/dd; @
FORMAT_CURRENCY_USD_SIMPLE «$»#,##0.00_-;@
FORMAT_CURRENCY_USD $#,##0_-
FORMAT_CURRENCY_EUR_SIMPLE [$EUR ]#,##0.00_-

Пример настройки для формата данных ячейки:

array(
	'code' => PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE
);

А можно и воспользоваться методом:

$PHPExcel_Style->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);

Защита ячеек

В качестве значения параметра protection выступает массив, который содержит два необязательных параметра:

  • locked — защитить ячейку;
  • hidden — скрыть формулы.

Пример настройки параметров для защиты ячейки:

array(
	'locked' => true,
	'hidden' => false
);

Или использовать следующие методы:

$PHPExcel_Style->getProtection()->setLocked(true);

$PHPExcel_Style->getProtection()->setHidden(false);

Теперь мы знаем, какие есть настройки стилей и какие присутствуют параметры у каждого стиля. Сейчас мы к ячейкам таблицы применим стиль оформления, но проделаем это тремя способами. Первый способ заключается в создании массива настроек, который в качестве параметра мы передадим в метод applyFromArray, класса PHPExcel_Style.

$style = array(
	'font' => array(
		'name' => 'Arial',
	),
	'fill' => array(
		'type' => PHPExcel_Style_Fill::FILL_SOLID,
		'color' => array (
				'rgb' => 'C2FABD'
		)
	),
	'alignment' => array (
			'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER
	)
);

Далее мы применим созданный нами стиль к ячейкам excel.

$sheet->getStyleByColumnAndRow($i - 2, $j)->applyFromArray($style);

Сейчас применим тот же стиль, но используя другую методику.

//Устанавливаем выравнивание
$sheet->getStyleByColumnAndRow($i - 2, $j)->getAlignment()->setHorizontal(
    PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
// Устанавливаем шрифт
$sheet->getStyleByColumnAndRow($i - 2, $j)->getFont()->setName('Arial');
// Применяем заливку
$sheet->getStyleByColumnAndRow($i - 2, $j)->getFill()->
    setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$sheet->getStyleByColumnAndRow($i - 2, $j)->getFill()->
    getStartColor()->applyFromArray(array('rgb' => 'C2FABD'));

Вот что у нас получилось:

Для получения данных о стиле конкретной ячейки необходимо использовать один из следующих методов, который вернет экземпляра класса PHPExcel_Style:

  • getStyleByColumnAndRow([$pColumn = 0 [, $pRow = 1]]) – применяется если требуется обратиться к ячейке по числовым координатам. Методу необходимо передать два параметра в виде номеров столбца и строки ячейки;
  • getStyle([pCellCoordinate = ‘A1’]) – используется для обращения по строковой координате ячейки. Методу требуется передать один параметр, это строковое представление координаты.

А теперь рассмотрим третий способ назначения стиля ячейкам путем дублирования стиля. Пример использования представлен ниже (предполагается, что к ячейке “B2” применен некий стиль и мы его хотим продублировать для диапазона ячеек “F2:F10”):

$sheet->duplicateStyle($sheet->getStyle('B2'), 'F2:F10');

Добавление комментариев

Я думаю, что не часто кто-то пользуется возможностью добавления комментариев к ячейкам, но это сугубо мое личное мнение, однако такая возможность имеется. Добавить комментарий к ячейке довольно просто, что видно из примера ниже:

...
	
// Стили шрифтов
$fBold = array('name' => 'Tahoma',  'size' => 10, 'bold' => true);
$fNormal = array('name' => 'Tahoma',  'size' => 10);

$richText = $sheet->getComment('B2')->getText();
 
$richText->createTextRun("Lorem ipsum ")->getFont()->
   applyFromArray($fNormal);
$richText->createTextRun("dolor sit")->getFont()->
   applyFromArray($fBold);
$richText->createTextRun(" amet consectetuer")->getFont()->
   applyFromArray($fNormal);
// Ширина поля комментария
$sheet->getComment('B2')->setWidth('250');
// Высота поля комментария
$sheet->getComment('B2')->setHeight('25');

...

Следует заметить, что при повторном вызове метода createTextRun() новый комментарий добавится к уже существующему, а не заменит его. Следует отметить, что данный метод возвращает объект класса PHPExcel_RichText_Run, у которого имеются методы для установки и получения параметров шрифта:

  • getFont() – возвращает объект класса для работы со шрифтами PHPExcel_Style_Font.
  • setFont([$pFont = null]))]) – данному методу требуется передать в качестве параметра объект класса PHPExcel_Style_Font.

Вот какой комментарий мы должны получить:

Вставка ссылки

Вставка ссылок в ячейку тоже не вызывает каких-либо затруднений, что можно видеть из нижеописанного примера:

...
	
// Ссылка на веб-ресурс
$sheet->getCell('A2')->getHyperlink()->setUrl('http://www.phpexcel.net');
// Ссылка на ячейку листа с названием Sheet2
$sheet->getCell('A2')->getHyperlink()->setUrl("sheet://'Sheet2'!D5");

...

Так же в виде ссылки может быть использован, к примеру, email адрес: mailto:example@mail.com.

Чтение данных из Excel

Формировать отчеты и применять к ним стили это конечно отлично. Но на этом возможности библиотеки PHPExcel не заканчиваются. Ну что же, посмотрим на что она еще способна. А способна она еще и читать данные из файлов формата *.xls / *.xlsx.

С помощью библиотеки PHPExcel можно читать следующие форматы:

  • Excel 2007;
  • Excel 5.0/Excel 95;
  • Excel 97 и поздние версии;
  • PHPExcel Serialized Spreadshet;
  • Symbolic Link;
  • CSV.

Для работы нам понадобятся объекты двух классов:

  • PHPExcel_Worksheet_RowIterator – используется для перебора строк;
  • PHPExcel_Worksheet_CellIterator – используется для перебора ячеек.

Для демонстрации выведем данные из таблицы с информацией об автомобилях.

Пример чтения файла представлен ниже:

require_once ('PHPExcel/IOFactory.php');

// Открываем файл
$xls = PHPExcel_IOFactory::load('xls.xls');
// Устанавливаем индекс активного листа
$xls->setActiveSheetIndex(0);
// Получаем активный лист
$sheet = $xls->getActiveSheet();

Первый вариант

...

echo "<table>";

// Получили строки и обойдем их в цикле
$rowIterator = $sheet->getRowIterator();
foreach ($rowIterator as $row) {
	// Получили ячейки текущей строки и обойдем их в цикле
	$cellIterator = $row->getCellIterator();

	echo "<tr>";
		
	foreach ($cellIterator as $cell) {
		echo "<td>" . $cell->getCalculatedValue() . "</td>";
	}
	
	echo "</tr>";
}
echo "</table>";

Второй вариант

...

echo "<table>";

for ($i = 1; $i <= $sheet->getHighestRow(); $i++) {  
    echo "<tr>";
	
	$nColumn = PHPExcel_Cell::columnIndexFromString(
		$sheet->getHighestColumn());
	
	for ($j = 0; $j < $nColumn; $j++) {
		$value = $sheet->getCellByColumnAndRow($j, $i)->getValue();
		echo "<td>$value</td>";
	}
     
    echo "</tr>";
}
echo "</table>";

В первом варианте мы производим чтение данных, из ячеек используя итераторы. А во втором, мы используем индексную адресацию для обращения и получения данных из ячеек листа. Получить данные о количестве строк и столбцов, можно воспользовавшись следующими методами класса PHPExcel_Worksheet:

  • getHighestColumn() – возвращает символьное представление последнего занятого столбца в активном листе. Обратите внимание: не индекс столбца, а его символьное представление (A, F и т.д.);
  • getHighestRow() – возвращает количество занятых строк в активном листе.

Другие полезные методы

Возможностей по работе с отчетами формата excel с использованием PHP как мы видим, достаточно много. Но мы рассмотрим еще несколько полезных методов, которые могут оказаться весьма полезны в работе:

  • getMergeCells() – с помощью данного метода принадлежащего классу PHPExcel_Worksheet можно получить информацию обо всех объединенных ячейках в листе;
  • setPreCalculateFormulas([$pCellStyle = true]) – данный метод необходимо использовать если требуется произвести расчет формул в листе (он имеется у двух классов: PHPExcel_Writer_Excel5 и PHPExcel_Writer_Excel2007). В рассматриваемый метод передается параметр типа boolean: true или false (если передать значение true, то расчет формул произойдет перед сохранением файла автоматически, иначе расчета формул не последует). Использование данного метода может оказаться полезным если созданный файл потребуется загрузить, к примеру на Google Drive. Ведь в таком случае расчет формул не будет произведен автоматически указанным сервисом и здесь вся ответственность ложиться на нас;
  • stringFromColumnIndex([$pColumnIndex = 0]) – данный метод позволяет определить по номеру столбца его символьное представление, для этого в качестве параметра необходимо передать его номер;
  • columnIndexFromString([$pString = ‘A’]) – с помощью данного метода можно определить номер столбца по его символьному представлению, для этого в качестве единственного параметра необходимо передать его обозначение.

Примечание: Методы stringFromColumnIndex и columnIndexFromString примечательны тем, что их можно использовать без создания объекта класса. Пример использования представлен ниже:

PHPExcel_Cell::stringFromColumnIndex(15);
PHPExcel_Cell::columnIndexFromString('A1');

С помощью продемонстрированных возможностей, можно формировать и считывать любые отчеты в виде файлов, формата excel. А также были продемонстрированы почти все возможные методы для работы со стилями.

Reading and writing to file

As you already know from the architecture,
reading and writing to a persisted storage is not possible using the base PhpSpreadsheet classes.
For this purpose, PhpSpreadsheet provides readers and writers, which are
implementations of PhpOfficePhpSpreadsheetReaderIReader and
PhpOfficePhpSpreadsheetWriterIWriter.

PhpOfficePhpSpreadsheetIOFactory

The PhpSpreadsheet API offers multiple methods to create a
PhpOfficePhpSpreadsheetReaderIReader or
PhpOfficePhpSpreadsheetWriterIWriter instance:

Direct creation via PhpOfficePhpSpreadsheetIOFactory. All examples
underneath demonstrate the direct creation method. Note that you can
also use the PhpOfficePhpSpreadsheetIOFactory class to do this.

Creating PhpOfficePhpSpreadsheetReaderIReader using PhpOfficePhpSpreadsheetIOFactory

There are 2 methods for reading in a file into PhpSpreadsheet: using
automatic file type resolving or explicitly.

Automatic file type resolving checks the different
PhpOfficePhpSpreadsheetReaderIReader distributed with
PhpSpreadsheet. If one of them can load the specified file name, the
file is loaded using that PhpOfficePhpSpreadsheetReaderIReader.
Explicit mode requires you to specify which
PhpOfficePhpSpreadsheetReaderIReader should be used.

You can create a PhpOfficePhpSpreadsheetReaderIReader instance using
PhpOfficePhpSpreadsheetIOFactory in automatic file type resolving
mode using the following code sample:

$spreadsheet = PhpOfficePhpSpreadsheetIOFactory::load("05featuredemo.xlsx");

A typical use of this feature is when you need to read files uploaded by
your users, and you don’t know whether they are uploading xls or xlsx
files.

If you need to set some properties on the reader, (e.g. to only read
data, see more about this later), then you may instead want to use this
variant:

$reader = PhpOfficePhpSpreadsheetIOFactory::createReaderForFile("05featuredemo.xlsx");
$reader->setReadDataOnly(true);
$reader->load("05featuredemo.xlsx");

You can create a PhpOfficePhpSpreadsheetReaderIReader instance using
PhpOfficePhpSpreadsheetIOFactory in explicit mode using the following
code sample:

$reader = PhpOfficePhpSpreadsheetIOFactory::createReader("Xlsx");
$spreadsheet = $reader->load("05featuredemo.xlsx");

Note that automatic type resolving mode is slightly slower than explicit
mode.

Creating PhpOfficePhpSpreadsheetWriterIWriter using PhpOfficePhpSpreadsheetIOFactory

You can create a PhpOfficePhpSpreadsheetWriterIWriter instance using
PhpOfficePhpSpreadsheetIOFactory:

$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, "Xlsx");
$writer->save("05featuredemo.xlsx");

Excel 2007 (SpreadsheetML) file format

Xlsx file format is the main file format of PhpSpreadsheet. It allows
outputting the in-memory spreadsheet to a .xlsx file.

PhpOfficePhpSpreadsheetReaderXlsx

Reading a spreadsheet

You can read an .xlsx file using the following code:

$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$spreadsheet = $reader->load("05featuredemo.xlsx");

Read data only

You can set the option setReadDataOnly on the reader, to instruct the
reader to ignore styling, data validation, … and just read cell data:

$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("05featuredemo.xlsx");

Read specific sheets only

You can set the option setLoadSheetsOnly on the reader, to instruct the
reader to only load the sheets with a given name:

$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]);
$spreadsheet = $reader->load("05featuredemo.xlsx");

Read specific cells only

You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
PhpOfficePhpSpreadsheetReaderIReadFilter. By default, all cells are
read using the PhpOfficePhpSpreadsheetReaderDefaultReadFilter.

The following code will only read row 1 and rows 20 – 30 of any sheet in
the Excel file:

class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {

    public function readCell($columnAddress, $row, $worksheetName = '') {
        // Read title row and rows 20 - 30
        if ($row == 1 || ($row >= 20 && $row <= 30)) {
            return true;
        }
        return false;
    }
}

$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xlsx");

Read Filtering does not renumber cell rows and columns. If you filter to read only rows 100-200, cells that you read will still be numbered A100-A200, not A1-A101. Cells A1-A99 will not be loaded, but if you then try to call getCell() for a cell outside your loaded range, then PHPSpreadsheet will create a new cell with a null value.

Methods such as toArray() assume that all cells in a spreadsheet has been loaded from A1, so will return null values for rows and columns that fall outside your filter range: it is recommended that you keep track of the range that your filter has requested, and use rangeToArray() instead.

PhpOfficePhpSpreadsheetWriterXlsx

Writing a spreadsheet

You can write an .xlsx file using the following code:

$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->save("05featuredemo.xlsx");

Formula pre-calculation

By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:

$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.xlsx");

Note Formulas will still be calculated in any column set to be autosized
even if pre-calculated is set to false

Office 2003 compatibility pack

Because of a bug in the Office2003 compatibility pack, there can be some
small issues when opening Xlsx spreadsheets (mostly related to formula
calculation). You can enable Office2003 compatibility with the following
code:

$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->setOffice2003Compatibility(true);
$writer->save("05featuredemo.xlsx");

Office2003 compatibility option should only be used when needed because
it disables several Office2007 file format options, resulting in a
lower-featured Office2007 spreadsheet.

Form Control Fields

PhpSpreadsheet offers limited support for Forms Controls (buttons,
checkboxes, etc.). The support is available only for Excel 2007 format,
and is offered solely to allow loading a spreadsheet with such controls
and saving it as a new file.
Support is not available for adding such elements to the spreadsheet,
nor even to locate them to determine their properties
(so you can’t modify or delete them).
Modifications to a worksheet with controls are «caveat emptor»;
some modifications will work correctly,
but others are very likely to cause problems,
e.g. adding a comment to the worksheet,
or inserting or deleting rows or columns in a manner that would
cause the controls to change location.

Excel 5 (BIFF) file format

Xls file format is the old Excel file format, implemented in
PhpSpreadsheet to provide a uniform manner to create both .xlsx and .xls
files. It is basically a modified version of PEAR
Spreadsheet_Excel_Writer,
although it has been extended and has fewer limitations and more
features than the old PEAR library. This can read all BIFF versions that
use OLE2: BIFF5 (introduced with office 95) through BIFF8, but cannot
read earlier versions.

Xls file format will not be developed any further, it just provides an
additional file format for PhpSpreadsheet.

Excel5 (BIFF) limitations Please note that BIFF file format has some
limits regarding to styling cells and handling large spreadsheets via
PHP.

PhpOfficePhpSpreadsheetReaderXls

Reading a spreadsheet

You can read an .xls file using the following code:

$reader = new PhpOfficePhpSpreadsheetReaderXls();
$spreadsheet = $reader->load("05featuredemo.xls");

Read data only

You can set the option setReadDataOnly on the reader, to instruct the
reader to ignore styling, data validation, … and just read cell data:

$reader = new PhpOfficePhpSpreadsheetReaderXls();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("05featuredemo.xls");

Read specific sheets only

You can set the option setLoadSheetsOnly on the reader, to instruct the
reader to only load the sheets with a given name:

$reader = new PhpOfficePhpSpreadsheetReaderXls();
$reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]);
$spreadsheet = $reader->load("05featuredemo.xls");

Read specific cells only

You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
PhpOfficePhpSpreadsheetReaderIReadFilter. By default, all cells are
read using the PhpOfficePhpSpreadsheetReaderDefaultReadFilter.

The following code will only read row 1 and rows 20 to 30 of any sheet
in the Excel file:

class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {

    public function readCell($columnAddress, $row, $worksheetName = '') {
        // Read title row and rows 20 - 30
        if ($row == 1 || ($row >= 20 && $row <= 30)) {
            return true;
        }
        return false;
    }
}

$reader = new PhpOfficePhpSpreadsheetReaderXls();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xls");

PhpOfficePhpSpreadsheetWriterXls

Writing a spreadsheet

You can write an .xls file using the following code:

$writer = new PhpOfficePhpSpreadsheetWriterXls($spreadsheet);
$writer->save("05featuredemo.xls");

Excel 2003 XML file format

Excel 2003 XML file format is a file format which can be used in older
versions of Microsoft Excel.

Excel 2003 XML limitations Please note that Excel 2003 XML format
has some limits regarding to styling cells and handling large
spreadsheets via PHP.
Also, only files using charset UTF-8 are supported.

PhpOfficePhpSpreadsheetReaderXml

Reading a spreadsheet

You can read an Excel 2003 .xml file using the following code:

$reader = new PhpOfficePhpSpreadsheetReaderXml();
$spreadsheet = $reader->load("05featuredemo.xml");

Read specific cells only

You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
PhpOfficePhpSpreadsheetReaderIReadFilter. By default, all cells are
read using the PhpOfficePhpSpreadsheetReaderDefaultReadFilter.

The following code will only read row 1 and rows 20 to 30 of any sheet
in the Excel file:

class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {

    public function readCell($columnAddress, $row, $worksheetName = '') {
        // Read title row and rows 20 - 30
        if ($row == 1 || ($row >= 20 && $row <= 30)) {
            return true;
        }
        return false;
    }

}

$reader = new PhpOfficePhpSpreadsheetReaderXml();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xml");

Symbolic LinK (SYLK)

Symbolic Link (SYLK) is a Microsoft file format typically used to
exchange data between applications, specifically spreadsheets. SYLK
files conventionally have a .slk suffix. Composed of only displayable
ANSI characters, it can be easily created and processed by other
applications, such as databases.

SYLK limitations Please note that SYLK file format has some limits
regarding to styling cells and handling large spreadsheets via PHP.

PhpOfficePhpSpreadsheetReaderSlk

Reading a spreadsheet

You can read an .slk file using the following code:

$reader = new PhpOfficePhpSpreadsheetReaderSlk();
$spreadsheet = $reader->load("05featuredemo.slk");

Read specific cells only

You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
PhpOfficePhpSpreadsheetReaderIReadFilter. By default, all cells are
read using the PhpOfficePhpSpreadsheetReaderDefaultReadFilter.

The following code will only read row 1 and rows 20 to 30 of any sheet
in the SYLK file:

class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {

    public function readCell($columnAddress, $row, $worksheetName = '') {
        // Read title row and rows 20 - 30
        if ($row == 1 || ($row >= 20 && $row <= 30)) {
            return true;
        }
        return false;
    }

}

$reader = new PhpOfficePhpSpreadsheetReaderSlk();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.slk");

Open/Libre Office (.ods)

Open Office or Libre Office .ods files are the standard file format for
Open Office or Libre Office Calc files.

PhpOfficePhpSpreadsheetReaderOds

Reading a spreadsheet

You can read an .ods file using the following code:

$reader = new PhpOfficePhpSpreadsheetReaderOds();
$spreadsheet = $reader->load("05featuredemo.ods");

Read specific cells only

You can set the option setReadFilter on the reader, to instruct the
reader to only load the cells which match a given rule. A read filter
can be any class which implements
PhpOfficePhpSpreadsheetReaderIReadFilter. By default, all cells are
read using the PhpOfficePhpSpreadsheetReaderDefaultReadFilter.

The following code will only read row 1 and rows 20 to 30 of any sheet
in the Calc file:

class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {

    public function readCell($columnAddress, $row, $worksheetName = '') {
        // Read title row and rows 20 - 30
        if ($row == 1 || ($row >= 20 && $row <= 30)) {
            return true;
        }
        return false;
    }

}

$reader = new PhpOfficePhpSpreadsheetReaderOds();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.ods");

CSV (Comma Separated Values)

CSV (Comma Separated Values) are often used as an import/export file
format with other systems. PhpSpreadsheet allows reading and writing to
CSV files.

CSV limitations Please note that CSV file format has some limits
regarding to styling cells, number formatting, …

PhpOfficePhpSpreadsheetReaderCsv

Reading a CSV file

You can read a .csv file using the following code:

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$spreadsheet = $reader->load('sample.csv');

You can also treat a string as if it were the contents of a CSV file as follows:

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$spreadsheet = $reader->loadSpreadsheetFromString($data);

Setting CSV options

Often, CSV files are not really «comma separated», or use semicolon (;)
as a separator. You can set some options before reading a CSV
file.

The separator will be auto-detected, so in most cases it should not be necessary
to specify it. But in cases where auto-detection does not fit the use-case, then
it can be set manually.

Note that PhpOfficePhpSpreadsheetReaderCsv by default assumes that
the loaded CSV file is UTF-8 encoded. If you are reading CSV files that
were created in Microsoft Office Excel the correct input encoding may
rather be Windows-1252 (CP1252). Always make sure that the input
encoding is set appropriately.

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$reader->setInputEncoding('CP1252');
$reader->setDelimiter(';');
$reader->setEnclosure('');
$reader->setSheetIndex(0);

$spreadsheet = $reader->load("sample.csv");

You may also let PhpSpreadsheet attempt to guess the input encoding.
It will do so based on a test for BOM (UTF-8, UTF-16BE, UTF-16LE, UTF-32BE,
or UTF-32LE),
or by doing heuristic tests for those encodings, falling back to a
specifiable encoding (default is CP1252) if all of those tests fail.

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$encoding = PhpOfficePhpSpreadsheetReaderCsv::guessEncoding('sample.csv');
// or, e.g. $encoding = PhpOfficePhpSpreadsheetReaderCsv::guessEncoding(
//                      'sample.csv', 'ISO-8859-2');
$reader->setInputEncoding($encoding);
$reader->setDelimiter(';');
$reader->setEnclosure('');
$reader->setSheetIndex(0);

$spreadsheet = $reader->load('sample.csv');

You can also set the reader to guess the encoding
rather than calling guessEncoding directly. In this case,
the user-settable fallback encoding is used if nothing else works.

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$reader->setInputEncoding(PhpOfficePhpSpreadsheetReaderCsv::GUESS_ENCODING);
$reader->setFallbackEncoding('ISO-8859-2');  // default CP1252 without this statement
$reader->setDelimiter(';');
$reader->setEnclosure('');
$reader->setSheetIndex(0);

$spreadsheet = $reader->load('sample.csv');

The CSV reader will normally not load null strings into the spreadsheet.
To load them:

$reader->setPreserveNullString(true);

Finally, you can set a callback to be invoked when the constructor is executed,
either through new Csv() or IOFactory::load,
and have that callback set the customizable attributes to whatever
defaults are appropriate for your environment.

function constructorCallback(PhpOfficePhpSpreadsheetReaderCsv $reader): void
{
    $reader->setInputEncoding(PhpOfficePhpSpreadsheetReaderCsv::GUESS_ENCODING);
    $reader->setFallbackEncoding('ISO-8859-2');
    $reader->setDelimiter(',');
    $reader->setEnclosure('"');
    // Following represents how Excel behaves better than the default escape character
    $reader->setEscapeCharacter((version_compare(PHP_VERSION, '7.4') < 0) ? "x0" : '');
}

PhpOfficePhpSpreadsheetReaderCsv::setConstructorCallback('constructorCallback');
$spreadsheet = PhpSpreadsheetIOFactory::load('sample.csv');

Read a specific worksheet

CSV files can only contain one worksheet. Therefore, you can specify
which sheet to read from CSV:

$reader->setSheetIndex(0);

Read into existing spreadsheet

When working with CSV files, it might occur that you want to import CSV
data into an existing Spreadsheet object. The following code loads a
CSV file into an existing $spreadsheet containing some sheets, and
imports onto the 6th sheet:

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$reader->setDelimiter(';');
$reader->setEnclosure('"');
$reader->setSheetIndex(5);

$reader->loadIntoExisting("05featuredemo.csv", $spreadsheet);

Line endings

Line endings for Unix (n) and Windows (rn) are supported.

Mac line endings (r) are supported as long as PHP itself
supports them, which it does through release 8.0.
Support for Mac line endings is deprecated for 8.1,
and is scheduled to remain deprecated for all later PHP8 releases;
PhpSpreadsheet will continue to support them for 8.*.
Support is scheduled to be dropped with release 9;
PhpSpreadsheet will then no longer handle CSV files
with Mac line endings correctly.

You can suppress testing for Mac line endings as follows:

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$reader->setTestAutoDetect(false);

PhpOfficePhpSpreadsheetWriterCsv

Writing a CSV file

You can write a .csv file using the following code:

$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->save("05featuredemo.csv");

Setting CSV options

Often, CSV files are not really «comma separated», or use semicolon (;)
as a separator. You can set some options before writing a CSV
file:

$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setDelimiter(';');
$writer->setEnclosure('"');
$writer->setLineEnding("rn");
$writer->setSheetIndex(0);

$writer->save("05featuredemo.csv");

CSV enclosures

By default, all CSV fields are wrapped in the enclosure character,
which defaults to double-quote.
You can change to use the enclosure character only when required:

$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setEnclosureRequired(false);

$writer->save("05featuredemo.csv");

Write a specific worksheet

CSV files can only contain one worksheet. Therefore, you can specify
which sheet to write to CSV:

$writer->setSheetIndex(0);

Formula pre-calculation

By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:

$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.csv");

Writing UTF-8 CSV files

CSV files are written in UTF-8. If they do not contain characters
outside the ASCII range, nothing else need be done.
However, if such characters are in the file,
or if the file starts with the 2 characters ‘ID’,
it should explicitly include a BOM file header;
if it doesn’t, Excel will not interpret those characters correctly.
This can be enabled by using the following code:

$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setUseBOM(true);
$writer->save("05featuredemo.csv");

Writing CSV files with desired encoding

It can be set to output with the encoding that can be specified by PHP’s mb_convert_encoding.
This looks like the following code:

$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setUseBOM(false);
$writer->setOutputEncoding('SJIS-WIN');
$writer->save("05featuredemo.csv");

Decimal and thousands separators

If the worksheet you are exporting contains numbers with decimal or
thousands separators then you should think about what characters you
want to use for those before doing the export.

By default PhpSpreadsheet looks up in the server’s locale settings to
decide what characters to use. But to avoid problems it is recommended
to set the characters explicitly as shown below.

English users will want to use this before doing the export:

PhpOfficePhpSpreadsheetSharedStringHelper::setDecimalSeparator('.');
PhpOfficePhpSpreadsheetSharedStringHelper::setThousandsSeparator(',');

German users will want to use the opposite values.

PhpOfficePhpSpreadsheetSharedStringHelper::setDecimalSeparator(',');
PhpOfficePhpSpreadsheetSharedStringHelper::setThousandsSeparator('.');

Note that the above code sets decimal and thousand separators as global
options. This also affects how HTML and PDF is exported.

HTML

PhpSpreadsheet allows you to read or write a spreadsheet as HTML format,
for quick representation of the data in it to anyone who does not have a
spreadsheet application on their PC, or loading files saved by other
scripts that simply create HTML markup and give it a .xls file
extension.

HTML limitations Please note that HTML file format has some limits
regarding to styling cells, number formatting, …
Also, only files using charset UTF-8 are supported.

PhpOfficePhpSpreadsheetReaderHtml

Reading a spreadsheet

You can read an .html or .htm file using the following code:

$reader = new PhpOfficePhpSpreadsheetReaderHtml();

$spreadsheet = $reader->load("05featuredemo.html");

HTML limitations Please note that HTML reader is still experimental
and does not yet support merged cells or nested tables cleanly

PhpOfficePhpSpreadsheetWriterHtml

Please note that PhpOfficePhpSpreadsheetWriterHtml only outputs the
first worksheet by default.

Writing a spreadsheet

You can write a .htm file using the following code:

$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);

$writer->save("05featuredemo.htm");

Write all worksheets

HTML files can contain one or more worksheets. If you want to write all
sheets into a single HTML file, use the following code:

$writer->writeAllSheets();

Write a specific worksheet

HTML files can contain one or more worksheets. Therefore, you can
specify which sheet to write to HTML:

$writer->setSheetIndex(0);

Setting the images root of the HTML file

There might be situations where you want to explicitly set the included
images root. For example, instead of:

<img src="./images/logo.jpg">

You might want to see:

<img src="http://www.domain.com/images/logo.jpg">

You can use the following code to achieve this result:

$writer->setImagesRoot('http://www.example.com');

Formula pre-calculation

By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:

$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
$writer->setPreCalculateFormulas(false);

$writer->save("05featuredemo.htm");

Embedding generated HTML in a web page

There might be a situation where you want to embed the generated HTML in
an existing website. PhpOfficePhpSpreadsheetWriterHtml provides
support to generate only specific parts of the HTML code, which allows
you to use these parts in your website.

Supported methods:

  • generateHTMLHeader()
  • generateStyles()
  • generateSheetData()
  • generateHTMLFooter()
  • generateHTMLAll()

Here’s an example which retrieves all parts independently and merges
them into a resulting HTML page:

$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
$hdr = $writer->generateHTMLHeader();
$sty = $writer->generateStyles(false); // do not write <style> and </style>
$newstyle = <<<EOF
<style type='text/css'>
$sty
body {
    background-color: yellow;
}
</style>
EOF;
echo preg_replace('@</head>@', "$newstylen</head>", $hdr);
echo $writer->generateSheetData();
echo $writer->generateHTMLFooter();

Editing HTML during save via a callback

You can also add a callback function to edit the generated html
before saving. For example, you could change the gridlines
from a thin solid black line:

function changeGridlines(string $html): string
{
    return str_replace('{border: 1px solid black;}',
        '{border: 2px dashed red;}',
        $html);
}
$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
$writer->setEditHtmlCallback('changeGridlines');
$writer->save($filename);

Decimal and thousands separators

See section PhpOfficePhpSpreadsheetWriterCsv how to control the
appearance of these.

PDF

PhpSpreadsheet allows you to write a spreadsheet into PDF format, for
fast distribution of represented data.

PDF limitations Please note that PDF file format has some limits
regarding to styling cells, number formatting, …

PhpOfficePhpSpreadsheetWriterPdf

PhpSpreadsheet’s PDF Writer is a wrapper for a 3rd-Party PDF Rendering
library such as TCPDF, mPDF or Dompdf. You must now install a PDF
rendering library yourself; but PhpSpreadsheet will work with a number
of different libraries.

Currently, the following libraries are supported:

Library Downloadable from PhpSpreadsheet writer
TCPDF https://github.com/tecnickcom/tcpdf Tcpdf
mPDF https://github.com/mpdf/mpdf Mpdf
Dompdf https://github.com/dompdf/dompdf Dompdf

The different libraries have different strengths and weaknesses. Some
generate better formatted output than others, some are faster or use
less memory than others, while some generate smaller .pdf files. It is
the developers choice which one they wish to use, appropriate to their
own circumstances.

You can instantiate a writer with its specific name, like so:

$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Mpdf');

Or you can register which writer you are using with a more generic name,
so you don’t need to remember which library you chose, only that you want
to write PDF files:

$class = PhpOfficePhpSpreadsheetWriterPdfMpdf::class;
PhpOfficePhpSpreadsheetIOFactory::registerWriter('Pdf', $class);
$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Pdf');

Or you can instantiate directly the writer of your choice like so:

$writer = new PhpOfficePhpSpreadsheetWriterPdfMpdf($spreadsheet);

Custom implementation or configuration

If you need a custom implementation, or custom configuration, of a supported
PDF library. You can extends the PDF library, and the PDF writer like so:

class My_Custom_TCPDF extends TCPDF
{
	// ...
}

class My_Custom_TCPDF_Writer extends PhpOfficePhpSpreadsheetWriterPdfTcpdf
{
	protected function createExternalWriterInstance($orientation, $unit, $paperSize)
	{
		$instance = new My_Custom_TCPDF($orientation, $unit, $paperSize);

		// more configuration of $instance

		return $instance;
	}
}

PhpOfficePhpSpreadsheetIOFactory::registerWriter('Pdf', MY_TCPDF_WRITER::class);

Writing a spreadsheet

Once you have identified the Renderer that you wish to use for PDF generation, you can write a .pdf file using the following code:

$writer = new PhpOfficePhpSpreadsheetWriterPdfMpdf($spreadsheet);
$writer->save("05featuredemo.pdf");

Please note that PhpOfficePhpSpreadsheetWriterPdf only outputs the
first worksheet by default.

Write all worksheets

PDF files can contain one or more worksheets. If you want to write all sheets into a single PDF file, use the following code:

$writer->writeAllSheets();

Write a specific worksheet

PDF files can contain one or more worksheets. Therefore, you can specify
which sheet to write to PDF:

$writer->setSheetIndex(0);

Setting Orientation and PaperSize

PhpSpreadsheet will attempt to honor the orientation and paper size specified
in the worksheet for each page it prints, if the renderer supports that. However, you can set all pages
to have the same orientation and paper size, e.g.

$writer->setOrientation(PhpOfficePhpSpreadsheetWorksheetPageSetup::ORIENTATION_LANDSCAPE);

Formula pre-calculation

By default, this writer pre-calculates all formulas in the spreadsheet.
This can be slow on large spreadsheets, and maybe even unwanted. You can
however disable formula pre-calculation:

$writer = new PhpOfficePhpSpreadsheetWriterPdfMpdf($spreadsheet);
$writer->setPreCalculateFormulas(false);

$writer->save("05featuredemo.pdf");

Editing Pdf during save via a callback

You can also add a callback function to edit the html used to
generate the Pdf before saving.
See under Html.

Decimal and thousands separators

See section PhpOfficePhpSpreadsheetWriterCsv how to control the
appearance of these.

Generating Excel files from templates (read, modify, write)

Readers and writers are the tools that allow you to generate Excel files
from templates. This requires less coding effort than generating the
Excel file from scratch, especially if your template has many styles,
page setup properties, headers etc.

Here is an example how to open a template file, fill in a couple of
fields and save it again:

$spreadsheet = PhpOfficePhpSpreadsheetIOFactory::load('template.xlsx');

$worksheet = $spreadsheet->getActiveSheet();

$worksheet->getCell('A1')->setValue('John');
$worksheet->getCell('A2')->setValue('Smith');

$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('write.xls');

Notice that it is ok to load an xlsx file and generate an xls file.

Generating Excel files from HTML content

If you are generating an Excel file from pre-rendered HTML content you can do so
automatically using the HTML Reader. This is most useful when you are generating
Excel files from web application content that would be downloaded/sent to a user.

For example:

$htmlString = '<table>
                  <tr>
                      <td>Hello World</td>
                  </tr>
                  <tr>
                      <td>Hello<br />World</td>
                  </tr>
                  <tr>
                      <td>Hello<br>World</td>
                  </tr>
              </table>';

$reader = new PhpOfficePhpSpreadsheetReaderHtml();
$spreadsheet = $reader->loadFromString($htmlString);

$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('write.xls'); 

Suppose you have multiple worksheets you’d like created from html. This can be
accomplished as follows.

$firstHtmlString = '<table>
                  <tr>
                      <td>Hello World</td>
                  </tr>
              </table>';
$secondHtmlString = '<table>
                  <tr>
                      <td>Hello World</td>
                  </tr>
              </table>';

$reader = new PhpOfficePhpSpreadsheetReaderHtml();
$spreadsheet = $reader->loadFromString($firstHtmlString);
$reader->setSheetIndex(1);
$spreadhseet = $reader->loadFromString($secondHtmlString, $spreadsheet);

$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('write.xls');

Reader/Writer Flags

Some Readers and Writers support special «Feature Flags» that need to be explicitly enabled.
An example of this is Charts in a spreadsheet. By default, when you load a spreadsheet that contains Charts, the charts will not be loaded. If all you want to do is read the data in the spreadsheet, then loading charts is an overhead for both speed of loading and memory usage.
However, there are times when you may want to load any charts in the spreadsheet as well as the data. To do so, you need to tell the Reader explicitly to include Charts.

$reader = PhpOfficePhpSpreadsheetIOFactory::createReaderForFile("05featuredemo.xlsx");
$reader->setIncludeCharts(true);
$reader->load("spreadsheetWithCharts.xlsx");

Alternatively, you can specify this in the call to load the spreadsheet:

$reader = PhpOfficePhpSpreadsheetIOFactory::createReaderForFile("spreadsheetWithCharts.xlsx");
$reader->load("spreadsheetWithCharts.xlsx", $reader::LOAD_WITH_CHARTS);

If you wish to use the IOFactory load() method rather than instantiating a specific Reader, then you can still pass these flags.

$spreadsheet = PhpOfficePhpSpreadsheetIOFactory::load("spreadsheetWithCharts.xlsx", PhpOfficePhpSpreadsheetReaderIReader::LOAD_WITH_CHARTS);

Flags that are available that can be passed to the Reader in this way include:

  • $reader::LOAD_WITH_CHARTS
  • $reader::READ_DATA_ONLY
  • $reader::IGNORE_EMPTY_CELLS
  • $reader::SKIP_EMPTY_CELLS (synonym for IGNORE_EMPTY_CELLS)
Readers LOAD_WITH_CHARTS READ_DATA_ONLY IGNORE_EMPTY_CELLS
Xlsx YES YES YES
Xls NO YES YES
Xml NO NO NO
Ods NO YES NO
Gnumeric NO YES NO
Html N/A N/A N/A
Slk N/A NO NO
Csv N/A NO NO

Likewise, when saving a file using a Writer, loaded charts will not be saved unless you explicitly tell the Writer to include them:

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->setIncludeCharts(true);
$writer->save('mySavedFileWithCharts.xlsx');

As with the load() method, you can also pass flags in the save() method:

$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('mySavedFileWithCharts.xlsx', PhpOfficePhpSpreadsheetWriterIWriter::SAVE_WITH_CHARTS);

Flags that are available that can be passed to the Reader in this way include:

  • $reader::SAVE_WITH_CHARTS
  • $reader::DISABLE_PRECALCULATE_FORMULAE
Writers SAVE_WITH_CHARTS DISABLE_PRECALCULATE_FORMULAE
Xlsx YES YES
Xls NO NO
Ods NO YES
Html YES YES
Pdf YES YES
Csv N/A YES

Combining Flags

One benefit of flags is that you can pass several flags in a single method call.
Two or more flags can be passed together using PHP’s | operator.

$reader = PhpOfficePhpSpreadsheetIOFactory::createReaderForFile("myExampleFile.xlsx");
$reader->load("spreadsheetWithCharts.xlsx", $reader::READ_DATA_ONLY | $reader::SKIP_EMPTY_CELLS);

PHPExcel — библиотека для создания и чтения данных из файлов формата OpenXML (который используется в MS Excel 2007). С ее помощью можно считывать из файлов, записывать в файлы, форматировать содержимое, работать с формулами и т.д. Для работы PHPExcel требуется версия PHP 5.2 или выше, с установленными библиотеками Zip, XML и GD2.

Установка PHPExcel

Первым делом библиотеку необходимо скачать. Для этого переходим на официальный сайт библиотеки и скачиваем архив PHPExcel-1.7.8.zip. После распаковки мы получим несколько файлов и папок:

  • Classes
  • Documentation
  • Tests
  • changelog.txt
  • install.txt
  • license.txt

Файлы — это различные описания по предыдущим версиям, лицензионное соглашение и очень краткая инструкция по установке. Далее, в папке Classes, содержится непосредственно сама библиотека PHPExcel — эту папку необходимо скопировать в корень нашего скрипта.

В папке Documentation содержится документация по библиотеке на английском языке. В папке Tests — примеры по использованию библиотеки.

Создание Excel-файла

Итак, давайте создадим файл makeexcel.php и начинаем работать с ним. Для начала нам необходимо подключить главный файл библиотеки PHPExcel.php (который находится в папке Classes) и создать объект класса PHPExcel:

require_once 'Classes/PHPExcel.php';
$pExcel = new PHPExcel();

Настройки листа книги Excel

Документ Excel состоит из книг, а каждая книга в свою очередь, состоит из листов. Далее лист состоит из набора ячеек, доступ к которым осуществляется по координатам. То есть у нас есть столбцы, которые имеют буквенные имена (А, В, С и т.д) и есть строки, которые пронумерованы. Значит, что бы получить доступ к первой ячейке нужно указать код А1. Точно также мы с помощью библиотеки будем получать доступ к каждой ячейке.

Итак, первым делом необходимо выбрать активный лист, на который мы будем выводить данные и получить объект этого листа:

$pExcel->setActiveSheetIndex(0);
$aSheet = $pExcel->getActiveSheet();

С помощью метода setActiveSheetIndex(0) указываем индекс (номер) активного листа. Нумерация листов начинается с нуля. Далее с помощью метода getActiveSheet() получаем объект этого активного листа, то есть другими словами получаем доступ к нему для работы. И сохраняем этот объект в переменную $aSheet.

Если Вы захотите указать активным какой то другой лист, то вначале его необходимо создать, при помощи метода:

$pExcel->createSheet();

Затем, по аналогии, указываем индекс и получаем объект активного листа.

// Ориентация страницы и  размер листа
$aSheet->getPageSetup()
       ->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT);
$aSheet->getPageSetup()
       ->SetPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);
// Поля документа
$aSheet->getPageMargins()->setTop(1);
$aSheet->getPageMargins()->setRight(0.75);
$aSheet->getPageMargins()->setLeft(0.75);
$aSheet->getPageMargins()->setBottom(1);
// Название листа
$aSheet->setTitle('Прайс-лист');
// Шапка и футер (при печати)
$aSheet->getHeaderFooter()
       ->setOddHeader('&CТД ТИНКО: прайс-лист');
$aSheet->getHeaderFooter()
       ->setOddFooter('&L&B'.$aSheet->getTitle().'&RСтраница &P из &N');
// Настройки шрифта
$pExcel->getDefaultStyle()->getFont()->setName('Arial');
$pExcel->getDefaultStyle()->getFont()->setSize(8);

Вначале задаем ориентацию листа при помощи метода setOrientation(), которому передаем константу класса PHPExcel_Worksheet_PageSetup:

  • ORIENTATION_PORTRAIT — книжная
  • ORIENTATION_LANDSCAPE — альбомная

Обратите внимание, что перед методом setOrientation() необходимо вызвать метод getPageSetup(), который предоставляет доступ к настройкам страницы.

Далее вызываем метод SetPaperSize(), который позволяет задать размер страницы для печати. Ему передаем параметром константу PAPERSIZE_A4 класса PHPExcel_Worksheet_PageSetup. Что означает, что размер листа страницы будет установлен А4.

Далее устанавливаем поля документа, то есть отступы от краев документа. Отступы задаются в специальных символьных единицах. Вначале, обратите внимание, вызываем у объекта $aSheet метод getPageMargins(), который вернет объект класса, отвечающего за настройки полей страницы. Затем вызываем методы setTop(), setRight(), setLeft() и setBottom().

Далее при помощи метода setTitle(‘Прайс лист’) задаем название нашего листа.

Если нужно, можно при печати выводить шапку и подвал листа:

  • setOddHeader();
  • setOddFooter();

Обратите внимание на передаваемые параметры:

  • для шапки передаем строку ‘&CТД ТИНКО: прайс-лист’; метка &C означает, что текст нужно расположить по центру.
  • для подвала передаем строку ‘&L&B’.$aSheet->getTitle().’&RСтраница &P из &N’; это означает, что нужно вывести слева и жирным шрифтом (&L&B) название листа (метод $aSheet->getTitle()), затем справа (&R) вывести номер страницы (&P) из общего количества страниц (&N).

Затем указываем настройки шрифта по умолчанию:

  • setName(‘Arial’) — задаем имя шрифта;
  • setSize(8) — задаем размер шрифта.

Наполнение документа данными

Для начала давайте зададим ширину столбцов (в символьных единицах), которые нам понадобятся:

$aSheet->getColumnDimension('A')->setWidth(3);
$aSheet->getColumnDimension('B')->setWidth(7);
$aSheet->getColumnDimension('C')->setWidth(20);
$aSheet->getColumnDimension('D')->setWidth(40);
$aSheet->getColumnDimension('E')->setWidth(10);

Теперь заполним несколько ячеек текстом:

$aSheet->mergeCells('A1:E1');
$aSheet->getRowDimension('1')->setRowHeight(20);
$aSheet->setCellValue('A1','ТД ТИНКО');
$aSheet->mergeCells('A2:E2');
$aSheet->setCellValue('A2','Поставка технических средств безопасности');
$aSheet->mergeCells('A4:C4');
$aSheet->setCellValue('A4','Дата создания прайс-листа');

Здесь мы сначала объеденяем ячейки с А1 до E1 при помощи метода mergeCells(), далее задаем высоту строки: вначале получаем доступ к строке 1 при помощи метода getRowDimension(‘1’), затем задаем высоту — setRowHeight(20). Далее при помощи метода setCellValue(‘A1′,’ТД ТИНКО’), устанавливаем значение ячейки А1.

Создание Excel средствами PHP

Далее давайте в ячейку D4 запишем текущую дату:

// Записываем данные в ячейку
$date = date('d-m-Y');
$aSheet->setCellValue('D4',$date);
// Устанавливает формат данных в ячейке (дата вида дд-мм-гггг)
$aSheet->getStyle('D4')->getNumberFormat()
->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX14);

С помощью констант, определенных в классе PHPExcel_Style_NumberFormat, можно задать формат ячейки: FORMAT_GENERAL (общий), FORMAT_TEXT (текст), FORMAT_NUMBER (число), FORMAT_NUMBER_00 (число с дробной частью), FORMAT_PERCENTAGE (процент), FORMAT_PERCENTAGE_00 (процент с дробной частью) и т.п.

Теперь, используя метод setCellValue(), а также цикл while() наполним данными наш прайс-лист:

mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_query('SET NAMES utf8');
mysql_select_db(DB_NAME);

// Создаем шапку таблички данных
$aSheet->setCellValue('A6','№');
$aSheet->setCellValue('B6','Код');
$aSheet->setCellValue('C6','Наименование');
$aSheet->setCellValue('D6','Описание');
$aSheet->setCellValue('E6','Цена');

$query = "SELECT `code`, `name`, `description`, `price` FROM `products` WHERE 1 LIMIT 10";
$res = mysql_query( $query );

$i = 1;
while( $prd = mysql_fetch_assoc($res) ) {
    $aSheet->setCellValue('A'.($i+6), $i);
    $aSheet->setCellValue('B'.($i+6), $prd['code']);
    $aSheet->setCellValue('C'.($i+6), $prd['name']);
    $aSheet->setCellValue('D'.($i+6), $prd['description']);
    $aSheet->setCellValue('E'.($i+6), $prd['price']);
    $i++;
}

Стилизация данных

Давайте немного украсим наш прайс-лист, то есть каждой ячейке добавим стилей. Для этого необходимо создать массив со стилями и при помощи метода applyFromArray(), применить этот массив к ячейке (или ячейкам):

// массив стилей
$style_wrap = array(
    // рамки
    'borders'=>array(
        // внешняя рамка
        'outline' => array(
            'style'=>PHPExcel_Style_Border::BORDER_THICK,
            'color' => array(
                'rgb'=>'006464'
            )
        ),
        // внутренняя
        'allborders'=>array(
            'style'=>PHPExcel_Style_Border::BORDER_THIN,
            'color' => array(
                'rgb'=>'CCCCCC'
            )
        )
    )
);

$aSheet->getStyle('A1:F'.($i+5))->applyFromArray($style_wrap);

Теперь, по аналогии, применим стили к остальным ячейкам:

// Стили для верхней надписи (первая строка)
$style_header = array(
    // Шрифт
    'font'=>array(
        'bold' => true,
        'name' => 'Times New Roman',
        'size' => 15,
        'color'=>array(
            'rgb' => '006464'
        )
    ),
    // Выравнивание
    'alignment' => array(
        'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_CENTER,
        'vertical' => PHPExcel_STYLE_ALIGNMENT::VERTICAL_CENTER,
    ),
    // Заполнение цветом
    'fill' => array(
        'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
        'color'=>array(
            'rgb' => '99CCCC'
        )
    ),
    'borders'=>array(
        'bottom'=>array(
            'style'=>PHPExcel_Style_Border::BORDER_THIN,
            'color' => array(
                'rgb'=>'006464'
            )
        )
    )
);
$aSheet->getStyle('A1:E1')->applyFromArray($style_header);

// Стили для слогана компании (вторая строка)
$style_slogan = array(
    // шрифт
    'font'=>array(
        'bold' => true,
        'italic' => true,
        'name' => 'Times New Roman',
        'size' => 12,
        'color'=>array(
            'rgb' => '006464'
        )
    ),
    // выравнивание
    'alignment' => array(
        'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_CENTER,
        'vertical' => PHPExcel_STYLE_ALIGNMENT::VERTICAL_CENTER,
    ),
    // заполнение цветом
    'fill' => array(
        'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
        'color'=>array(
            'rgb' => '99CCCC'
        )
    ),
    //рамки
    'borders' => array(
        'bottom' => array(
            'style'=>PHPExcel_Style_Border::BORDER_THIN,
            'color' => array(
                'rgb'=>'006464'
            )
        )
    )
);
$aSheet->getStyle('A2:E2')->applyFromArray($style_slogan);

// Стили для текта возле даты
$style_tdate = array(
    // выравнивание
    'alignment' => array(
        'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_RIGHT,
    ),
    // заполнение цветом
    'fill' => array(
        'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
        'color'=>array(
            'rgb' => 'EEEEEE'
        )
    ),
    // рамки
    'borders' => array(
        'right' => array(
            'style'=>PHPExcel_Style_Border::BORDER_NONE
        )
    )
);
$aSheet->getStyle('A4:D4')->applyFromArray($style_tdate);
 
// Стили для даты
$style_date = array(
    // заполнение цветом
    'fill' => array(
        'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
        'color'=>array(
            'rgb' => 'EEEEEE'
        )
    ),
    // рамки
    'borders' => array(
        'left' => array(
            'style'=>PHPExcel_Style_Border::BORDER_NONE
        )
    ),
);
$aSheet->getStyle('E4')->applyFromArray($style_date);
 
// Стили для шапки таблицы (шестая строка)
$style_hprice = array(
    // выравнивание
    'alignment' => array(
    'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_CENTER,
    ),
    // заполнение цветом
    'fill' => array(
        'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
        'color'=>array(
            'rgb' => 'CFCFCF'
        )
    ),
    // шрифт
    'font'=>array(
        'bold' => true,
        /* 'italic' => true, */
        'name' => 'Times New Roman',
        'size' => 10
    ),
);
$aSheet->getStyle('A6:E6')->applyFromArray($style_hprice);

// Cтили для данных в таблице прайс-листа
$style_price = array(
    'alignment' => array(
    'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_LEFT,
    )
);
$aSheet->getStyle('A7:E'.($i+5))->applyFromArray($style_price);

Сохранение документа

Осталось только сохранить наш документ:

/*
$objWriter = PHPExcel_IOFactory::createWriter($pExcel, 'Excel5');
$objWriter->save('simple.xls');
*/
$objWriter = PHPExcel_IOFactory::createWriter($pExcel, 'Excel2007');
$objWriter->save('simple.xlsx');

или так

/*
$objWriter = new PHPExcel_Writer_Excel5($pExcel);
$objWriter->save('simple.xls');
*/
$objWriter = new PHPExcel_Writer_Excel2007($pExcel);
$objWriter->save('simple.xlsx');

Если нужно вывести документ в браузер

/*
header('Content-Type:application/vnd.ms-excel');
header('Content-Disposition:attachment;filename="simple.xls"');
$objWriter = new PHPExcel_Writer_Excel5($pExcel);
*/
header('Content-Type:xlsx:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition:attachment;filename="simple.xlsx"');
$objWriter = new PHPExcel_Writer_Excel2007($pExcel);
$objWriter->save('php://output');

Первый заголовок указывает браузеру тип открываемого контента — это документ формата Excel. Второй — говорит браузеру, что документ необходимо отдать пользователю на скачивание под именем simple.xlsx.

Добавление формул

Формула Excel — это математическое выражение, которое создается для вычисления результата и которое может зависеть от содержимого других ячеек. Формула в ячейке Excel может содержать данные, ссылки на другие ячейки, а также обозначение действий, которые необходимо выполнить.

Использование ссылок на ячейки позволяет пересчитывать результат по формулам, когда происходят изменения содержимого ячеек, включенных в формулы. Формулы Excel начинаются со знака =. Скобки ( ) могут использоваться для определения порядка математических операции.

Примеры формул Excel: =27+36, =А1+А2-АЗ, =SUM(А1:А5), =MAX(АЗ:А5), =(А1+А2)/АЗ.

PHPExcel тоже поддерживает добавление формул в ячейки. Установить формулу можно так:

// формула для вычисления суммы
$formula = '=SUM(D2:D4)';
$aSheet->setCellValue('D5', $formula);

Добавление формул

Чтение Excel-файла

Самый простой вариант — считать все таблицы (на всех листах) и записать данные в трехмерный массив:

// Подключаем библиотеку
require_once 'Classes/PHPExcel.php';
$pExcel = PHPExcel_IOFactory::load('simple.xlsx');

// Цикл по листам Excel-файла
foreach ($pExcel->getWorksheetIterator() as $worksheet) {
    // выгружаем данные из объекта в массив
    $tables[] = $worksheet->toArray();
}

Теперь можно вывести массив:

// Цикл по листам Excel-файла
foreach( $tables as $table ) {
    echo '<table border="1">';
    // Цикл по строкам
    foreach($table as $row) {
        echo '<tr>';
        // Цикл по колонкам
        foreach( $row as $col ) {
            echo '<td>'.$col.'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}

Для получения значения отдельной ячейки:

// выбираем лист, с которым будем работать
$pExcel->setActiveSheetIndex(0);
$aSheet = $pExcel->getActiveSheet();
// получаем доступ к ячейке по номеру строки 
// (нумерация с единицы) и столбца (нумерация с нуля) 
$cell = $aSheet->getCellByColumnAndRow($col, $row);
// читаем значение ячейки
$value = $cell->getValue()

или так:

$value = $pExcel->getActiveSheet()->getCellValue('B2')

Еще два примера:

// Цикл по листам Excel-файла
foreach( $pExcel->getWorksheetIterator() as $worksheet ) {
    echo '<h2>Лист «'.$worksheet->getTitle().'»</h2>';
    echo '<table border="1">';
    // Цикл по строкам
    foreach( $worksheet->getRowIterator() as $row ) {
        echo '<tr>';
        // Цикл по колонкам
        foreach( $row->getCellIterator() as $cell ) {
            $value = $cell->getValue();
            // $calcValue = $cell->getCalculatedValue()
            // $dataType = PHPExcel_Cell_DataType::dataTypeForValue($value);
            echo '<td>'.$value.'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}
// Цикл по листам Excel-файла
foreach ($pExcel->getWorksheetIterator() as $worksheet) {
    $worksheetTitle     = $worksheet->getTitle();
    $highestRow         = $worksheet->getHighestRow(); // например, 10
    $highestColumn      = $worksheet->getHighestColumn(); // например, 'E'
    $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
    $nrColumns = ord($highestColumn) - 64;
    echo '<h2>Лист «'.$worksheetTitle.'» ';
    echo $nrColumns . ' колонок (A-' . $highestColumn . ') ';
    echo ' и ' . $highestRow . ' строк.</h2>';
    echo '<table border="1">';
    // Цикл по строкам
    for ($row = 1; $row <= $highestRow; $row++) {
        echo '<tr>';
        // Цикл по колонкам
        for ($col = 0; $col < $highestColumnIndex; $col++) {
            $cell = $worksheet->getCellByColumnAndRow($col, $row);
            echo '<td>'.$cell->getValue().'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}

Дополнительно

  • Документация разработчика PHPExcel на русском
  • Блог на Laravel 7, часть 17. Временная зона для пользователей, деплой на хостинг TimeWeb
  • Блог на Laravel 7, часть 16. Роль нового пользователя, сообщение админу о новом посте
  • Блог на Laravel 7, часть 15. Восстановление постов, slug для категории, поста и страницы
  • Блог на Laravel 7, часть 14. Валидация данных и права доступа при загрузке изображений
  • Блог на Laravel 7, часть 13. Загрузка и ресайз изображений для категорий и постов блога
  • Блог на Laravel 7, часть 12. Доп.страницы сайта в панели управления и в публичной части
  • Блог на Laravel 7, часть 11. Панель управления — назначение ролей и прав для пользователей

Поиск:
Excel • MS • PHP • Web-разработка

Каталог оборудования

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Производители

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Функциональные группы

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

// gl and gl2 excel file Export Program
public function glExcelFileExport()
{
    $from_date1 = $this->input->post('from_date1');
    $to_date1 = $this->input->post('to_date1');
    $account_number = $this->input->post('account_number');
    $glnames = $this->input->post('glnames');

    $sql = "SELECT * FROM ut_sbi_reco_rungl WHERE value_date between '".$from_date1."' AND '".$to_date1."' ";
    $result = $this->db->query($sql)->result_array();

    if(count($result)>0)
    {
        require FCPATH . 'vendor/autoload.php';

        $object = new PHPExcel();

        $prestasi = $object->setActiveSheetIndex(0); 

        //manage row hight

        $object->getActiveSheet()->getRowDimension(1)->setRowHeight(25);


        // Excel Heading Description
        if($glnames == 'gl1') {

        //style alignment

        $styleArray = array(

            'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

                'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,

            ),

        );

        $object->getActiveSheet()->getStyle('A1:U1')->getFont()->setBold(true);

        $object->getActiveSheet()->getStyle('A1:U1')->applyFromArray($styleArray);

        //border

        $styleArray1 = array(

            'borders' => array(

                'allborders' => array(

                    'style' => PHPExcel_Style_Border::BORDER_THIN

                )

            )

        );

        //background

        $styleArray12 = array(

            'fill' => array(

                'type' => PHPExcel_Style_Fill::FILL_SOLID,

                'startcolor' => array(

                    'rgb' => 'FFFF00',

                ),

            ),

        );

        //freeepane

        $object->getActiveSheet()->freezePane('A2');

        //column width

        $object->getActiveSheet()->getColumnDimension('A')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('B')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('C')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('D')->setWidth(20);

        $object->getActiveSheet()->getColumnDimension('E')->setWidth(20);

        $object->getActiveSheet()->getColumnDimension('F')->setWidth(12);

        $object->getActiveSheet()->getColumnDimension('G')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('H')->setWidth(20);

        $object->getActiveSheet()->getColumnDimension('I')->setWidth(20);

        $object->getActiveSheet()->getColumnDimension('J')->setWidth(20);

        $object->getActiveSheet()->getColumnDimension('K')->setWidth(20);

        $object->getActiveSheet()->getColumnDimension('L')->setWidth(10);

        $object->getActiveSheet()->getColumnDimension('M')->setWidth(12);

        $object->getActiveSheet()->getColumnDimension('N')->setWidth(25);

        $object->getActiveSheet()->getColumnDimension('O')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('P')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('Q')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('R')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('S')->setWidth(15);

        $object->getActiveSheet()->getColumnDimension('T')->setWidth(25);

        $object->getActiveSheet()->getColumnDimension('U')->setWidth(15);

        $object->getActiveSheet()->getStyle('A1:U1')->applyFromArray($styleArray1);

        $object->getActiveSheet()->getStyle('A1:U1')->applyFromArray($styleArray12);

        $object->getActiveSheet()->getStyle('I')->getNumberFormat()->setFormatCode("0.00");    

        $table_columns = array("SRL", "Scheme", "Tran Type", "App Refer", "OTH Refer",

             "Account", "Name", "Value Date", "Amount", "Pay Category", "Rev Flg",

              "Security", "Cheque Number", "SCH", "Book Date", "Cheque Date", 

              "Reg Id", "Inputter", "Narration", "FL", "Batch Number");

            $column = 0;

            foreach($table_columns as $field)
            {
                $object->getActiveSheet()->setCellValueByColumnAndRow($column, 1, $field);
                $column++;
            } 


        }

        if($glnames == 'gl2') {

            //style alignment

            $styleArray = array(

                'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

                    'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,

                ),

            );

            $object->getActiveSheet()->getStyle('A1:C1')->getFont()->setBold(true);

            $object->getActiveSheet()->getStyle('A1:C1')->applyFromArray($styleArray);

            //border

            $styleArray1 = array(

                'borders' => array(

                    'allborders' => array(

                        'style' => PHPExcel_Style_Border::BORDER_THIN

                    )

                )

            );

            //background

            $styleArray12 = array(

                'fill' => array(

                    'type' => PHPExcel_Style_Fill::FILL_SOLID,

                    'startcolor' => array(

                        'rgb' => 'FFFF00',

                    ),

                ),

            );

            //freeepane

            $object->getActiveSheet()->freezePane('A2');

            //column width

            $object->getActiveSheet()->getColumnDimension('A')->setWidth(15);

            $object->getActiveSheet()->getColumnDimension('B')->setWidth(15);

            $object->getActiveSheet()->getColumnDimension('C')->setWidth(15);

            $object->getActiveSheet()->getStyle('A1:C1')->applyFromArray($styleArray1);

            $object->getActiveSheet()->getStyle('A1:C1')->applyFromArray($styleArray12);

            $object->getActiveSheet()->getStyle('C')->getNumberFormat()->setFormatCode("0.00");

            $table_columns1 = array("Account", "Name", "Amount");

            $column1 = 0;

            foreach($table_columns1 as $field1)
            {
                $object->getActiveSheet()->setCellValueByColumnAndRow($column1, 1, $field1);
                $column1++;
            } 

        }

        // List of column names

        

        $style = array(

                'alignment' => array(

                    'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,

                )
        );

        $prestasi->getDefaultStyle()->applyFromArray($style);

        if($glnames == 'gl1') {
              // Gl1 Query
             $excel_row = 2;
             for ($kk=0;$kk<count($account_number);$kk++) 
             { 
                $account_number2 = $account_number[$kk];
              $gl1Arr = $this->ut_gl_model->getDisplayGl1Query($account_number2,$from_date1,$to_date1);

              foreach($gl1Arr as $row)
              {           

               $object->getActiveSheet()->setCellValueByColumnAndRow(0, $excel_row, $row['srl']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(1, $excel_row, $row['scheme']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(2, $excel_row, $row['tran_type']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(3, $excel_row, $row['app_refer']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(4, $excel_row, $row['oth_refer']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(5, $excel_row, $row['account']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(6, $excel_row, $row['name']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(7, $excel_row, (isset($row['value_date']) && $row['value_date']!='0000-00-00')?date('d/m/Y',strtotime($row['value_date'])):'');
               $object->getActiveSheet()->setCellValueByColumnAndRow(8, $excel_row, $row['amt']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(9, $excel_row, $row['pay_catego']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(10, $excel_row, $row['rev_flg']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(11, $excel_row, $row['security']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(12, $excel_row, $row['chq_number']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(13, $excel_row, 'y');
               $object->getActiveSheet()->setCellValueByColumnAndRow(14, $excel_row, (isset($row['book_date']) && $row['book_date']!='0000-00-00')?date('d/m/Y',strtotime($row['book_date'])):'');
               $object->getActiveSheet()->setCellValueByColumnAndRow(15, $excel_row, (isset($row['chq_date']) && $row['chq_date']!='0000-00-00')?date('d/m/Y',strtotime($row['chq_date'])):'');
               $object->getActiveSheet()->setCellValueByColumnAndRow(16, $excel_row, $row['reg_id']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(17, $excel_row, $row['inputter']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(18, $excel_row, $row['narration']);
               $object->getActiveSheet()->setCellValueByColumnAndRow(19, $excel_row, '');
               $object->getActiveSheet()->setCellValueByColumnAndRow(20, $excel_row, '');
            
               $excel_row++;
          
               } 
               
             }

              // Excel Download Logic
                $downloadFile = 'gl1_'.date('Ymd').'.xlsx';
                $prestasi->setTitle("Gl1 Dump"); 
                $object_writer = PHPExcel_IOFactory::createWriter($object, 'Excel2007');
                header('Content-Type: application/vnd.ms-excel');
                header('Content-Disposition: attachment;filename="'.$downloadFile.'" ');
                $object_writer->save('php://output');                  
            }

        $excel_row1 = 2;
        if($glnames == 'gl2') {
              // Gl2 Query
            for ($jj=0;$jj<count($account_number);$jj++) 
            { 
                $account_number3 = $account_number[$jj];
                $gl2Arr = $this->ut_gl_model->getDisplayGl2Query($account_number3,$from_date1,$to_date1);

                foreach($gl2Arr as $row1)
                {      
                   $object->getActiveSheet()->setCellValueByColumnAndRow(0, $excel_row1, $row1['account']);
                   $object->getActiveSheet()->setCellValueByColumnAndRow(1, $excel_row1, $row1['name']);
                   $object->getActiveSheet()->setCellValueByColumnAndRow(2, $excel_row1, $row1['amount']);
                   // $object->getActiveSheet()->setCellValueByColumnAndRow(3, $excel_row1, $row1['value_date']);
                   $excel_row1++;
              
                }
            }                   
                // Excel Download Logic
                $prestasi->setTitle("Gl2 Dump");
                $downloadFile2 = 'gl2_'.date('Ymd').'.xlsx'; 
                $object_writer = PHPExcel_IOFactory::createWriter($object, 'Excel2007');
                header('Content-Type: application/vnd.ms-excel');
                header('Content-Disposition: attachment;filename="'.$downloadFile2.'" ');
                $object_writer->save('php://output');
            }             

    }
    else
    {
        $this->session->set_flashdata('error', 'Data not found.');
        redirect(site_url('sbi-reco/run-gl'));
    }
    

}

Понравилась статья? Поделить с друзьями:
  • Запись в таблицу excel pandas
  • Запись в существующий файл excel pandas
  • Запись в вычисляемую ячейку в excel
  • Запись в microsoft excel это
  • Запись в excel с com порта