it-blog.club
phpExcel из PHP в файл

phpExcel из PHP в файл

Я уже не раз затрагивал тему касаемо библиотеки phpExcel и вот моя очередная статья. Если вам будет интересно то вот статья о том как спарсить Excel файл в PHP, а так же как изменить ширину столбца.

На этот раз я бы хотел поделиться с вами двумя способами как можно записывать данные с сайта в excel файл.

Для этого во первых нам потребуется сама библиотека phpExcel. Вам необходимо разместить её на своём проекте по правилам вашей CMS или фраемворка. Далее в php файле обработчике создать необходимый метод. Например у вас интернет магазин и вам необходимо чтобы excel файл с заказом клиента уходил ему на почту. Так что поехали.

Создаём метод:

$arParams будет массив товаров, где ключ - это кол-во, а значение - название товаров.


public static function createExcelOrder($arParams)
{
}

Далее нам необходимо подключить всё необходимое для нашей работы в нашем методе, не зависимо от способа реализации данной задачи.



public static function createExcelOrder($arParams)
{
$newDate = date("Y-m-d H:i");//Получим дату формирования, чтобы отправить её клиенту

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

$xls = new \PHPExcel();// Создаем объект класса PHPExcel
$xls->setActiveSheetIndex(0);// Устанавливаем индекс активного листа
}

Далее у нас есть первый выбор, мы может задать ширину столбцов на авторастягивание в зависимости от содержания ячейки, задать фиксированный размер или же не задавать ничего. Я же поставлю для столбцов A и B авторазмер


public static function createExcelOrder($arParams)
{
$newDate = date("Y-m-d H:i");//Получим дату формирования, чтобы отправить её клиенту

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

$xls = new \PHPExcel();// Создаем объект класса PHPExcel
$xls->setActiveSheetIndex(0);// Устанавливаем индекс активного листа

$xls->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$xls->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
}

Далее берём активный лист, если вы помните, то в новом файле excel их по умолчанию 3.
Для этого воспользуемся методом $sheet = $xls->getActiveSheet(); И далее назовём как нибудь наш лист при помощи $sheet->setTitle('Ваш заказ');

И того у нас выходит следующий код:



public static function createExcelOrder($arParams)
{
$newDate = date("Y-m-d H:i");//Получим дату формирования, чтобы отправить её клиенту

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

$xls = new \PHPExcel();// Создаем объект класса PHPExcel
$xls->setActiveSheetIndex(0);// Устанавливаем индекс активного листа

$xls->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$xls->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);

$sheet = $xls->getActiveSheet();
$sheet->setTitle('Ваш заказ');
}

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


public static function createExcelOrder($arParams) {
$newDate = date("Y-m-d H:i");//Получим дату формирования, чтобы отправить её клиенту

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

$xls = new \PHPExcel();// Создаем объект класса PHPExcel
$xls->setActiveSheetIndex(0);// Устанавливаем индекс активного листа

$xls->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$xls->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);

$sheet = $xls->getActiveSheet();
$sheet->setTitle('Ваш заказ');

//Давайте зададим в первой ячейке сообщение пользователю
//Сделаем его Болдом и 18ый размер шрифта
$sheet->getStyle('A1')->getFont()->setBold(true);
$sheet->getStyle('A1')->getFont()->setSize(18); //Далее само сообщение в ячейке A1
$sheet->setCellValueByColumnAndRow(0, 1, 'Список товаров'); //Далее запишем наши товары которые мы передали в параметрах

//В столбце A будет название, в столбце B количество

$x = 2; // Это счётчик, чтобы нам перемещаться вниз по строкам

foreach ( $arParams as $col=>$name ) {
$sheet->setCellValueByColumnAndRow(0, $x,$name);
$sheet->setCellValueByColumnAndRow(1, $x,$col);
$x++;
}
}

Если вы заметили, что отчёт по столбцам начинается с нуля. Т.е. A = 0 B = 1 и т.д. Отчёт по строкам идёт как положено c единицы. По этой причине ячейка C3 будет равна 2/3
В самом конце метода нам необходимо вызвать ещё один метод, это сохранение xlsx файла, но о нём расскажу позже, после примера второго варианта.

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


public static function createExcelOrder($arParams) {
$newDate = date("Y-m-d H:i");//Получим дату формирования, чтобы отправить её клиенту

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

$xls = new \PHPExcel();// Создаем объект класса PHPExcel
$xls->setActiveSheetIndex(0);// Устанавливаем индекс активного листа

$xls->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$xls->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);

$sheet = $xls->getActiveSheet();
$sheet->setTitle('Ваш заказ');

//Давайте зададим в первой ячейке сообщение пользователю
//Сделаем его Болдом и 18ый размер шрифта
$sheet->getStyle('A1')->getFont()->setBold(true);
$sheet->getStyle('A1')->getFont()->setSize(18); //Далее само сообщение в ячейке A1
//Заполним ячейку А1 и укажем её тип как "Строка"
$xls->getActiveSheet()->setCellValueExplicit('A1', 'Список товаров', \PHPExcel_Cell_DataType::TYPE_STRING);
}

Как видите в данном примере мы воспользовались методом setCellValueExplicit который принимает 3 параметра: ячейка (A1),  значение и отформатировать ячейку.

И как я уже говорил в самом конце нам необходимо прописать сохранение файла. Покажу дописав в первый пример:


public static function createExcelOrder($arParams) {
$newDate = date("Y-m-d H:i");//Получим дату формирования, чтобы отправить её клиенту

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

$xls = new \PHPExcel();// Создаем объект класса PHPExcel
$xls->setActiveSheetIndex(0);// Устанавливаем индекс активного листа

$xls->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$xls->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);

$sheet = $xls->getActiveSheet();
$sheet->setTitle('Ваш заказ');

//Давайте зададим в первой ячейке сообщение пользователю
//Сделаем его Болдом и 18ый размер шрифта
$sheet->getStyle('A1')->getFont()->setBold(true);
$sheet->getStyle('A1')->getFont()->setSize(18); //Далее само сообщение в ячейке A1
$sheet->setCellValueByColumnAndRow(0, 1, 'Список товаров'); //Далее запишем наши товары которые мы передали в параметрах

//В столбце A будет название, в столбце B количество

$x = 2; // Это счётчик, чтобы нам перемещаться вниз по строкам

foreach ( $arParams as $col=>$name ) {
$sheet->setCellValueByColumnAndRow(0, $x,$name);
$sheet->setCellValueByColumnAndRow(1, $x,$col);
$x++;
}

//сохраняем
$time = time();//Создадим уникальное значение, чтобы не было одинаковых файлов
$objWriter = \PHPExcel_IOFactory::createWriter($xls, 'Excel2007');
$objWriter->save($_SERVER['DOCUMENT_ROOT'] . '/exel/' . $time . '.xlsx');
}

Собственно на этом всё. Надеюсь данная статья была полезна для вас. В дальнейшем я продолжу показывать примеры работы с данной библиотекой, так что подписывайтесь на мой блог.


it-blog.club 960
Автор: Ярослав Хмель


Если Вам понравилась статья, то можете поддержать блог переведя N сумму на кофе авторам или оплату хостинга!
В любом случае спасибо! А так же не забывайте про группу в ВК
ПОИСК ПО САЙТУ
Поддержать