Генерация прайс-листа в формате Excel при помощи PHP. Phpexcel

Генерация прайс-листа в формате Excel при помощи PHP

От автора: очень часто при разработке веб-приложений возникает задача создать прайс-лист товаров либо услуг какой то кампании в формате таблиц Microsoft Excel. Но при этом необходимо предусмотреть, чтобы он свободно генерировался на основе данных, хранящихся в базе данных.

В сегодняшнем уроке мы с Вами решим такую задачу. То есть мы научимся генерировать документ в формате таблиц Excel при помощи языка PHP и специальной библиотеки PHPExcel. Это очень мощная и очень широко применяемая библиотека с огромнейшим функционалом. Конечно, все ее возможности за один урок рассмотреть мы не сможем, но узнать основы и научиться с ней работать — мы вполне успеем.

План урока

    1. Подготовка к уроку.

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

    3. Основные настройки листа книги Excel.

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

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

Детали учебника

Тема: PHP

Сложность: Средняя

Урок: Видео (.mp4)

Время: 01:31:02

Размер архива: 217 Mb

скачать исходникискачать урок

1. Подготовка к уроку.

Первое что нам потребуется для создания прайс-листа – это данные, которые в нем выводить. Для этого я подготовил базу данных (под названием price), в которой содержится всего одна табличка – tovar. В табличке содержится несколько наименований товара, для вывода в прайс-листе. Ее дамп Вы сможете взять из изходников к уроку.

Далее я подготовил очень простой скрипт, который вытаскивает данные из базы данных, а конкретнее из таблички tovar, и формирует из этих данных массив. С этим массивом мы с Вами и будем работать.

Скрипт включает в себя всего три файла:

config.php

functions.php

index.php

Важное замечание!

Если Вы хотите использовать для вывода данных в формате EXCEL русские символы, то обязательно все файлы нужно сохранять в кодировке UTF8.

Далее давайте приведу код всех трех файлов. Файл config.php:

<?php
define("HOST","localhost");
define("USER","Viktor");
define("PASSWORD","1234");
define("DB","price");

$db = mysql_connect(HOST,USER,PASSWORD);
if (!$db) {
	exit('WRONG CONNECTION');
}
if(!mysql_select_db('price',$db)) {
	exit(DB);
}
mysql_query('SET NAMES utf8');

?>

Как Вы видите, здесь все элементарно. Просто задаем четыре константы для хранения настроек подключения к базе данных. И собственно, выполняем подключение и выбор базы данных для работы. Далее устанавливаем кодировку запросов.

Следующий файл functions.php:

<?php
function get_price() {
	
	$sql = "SELECT id,name,price,quantity
			FROM tovar";
	$result = mysql_query($sql);
	
	if(!$result) {
		exit(mysql_error());
	}
	
	$row = array();
	for($i = 0;$i < mysql_num_rows($result);$i++) {
		$row[] = mysql_fetch_assoc($result);
	}
	
	return $row;		
}

Здесь также все очень просто. Описана всего лишь одна функция, которая выполняет запрос к базе данных и формирует по результатам выборки массив. Далее я приведу распечатку этого массива.

И последний файл index.php:

<?php
require_once 'config.php';
require_once 'functions.php';

$price_list = get_price();

?>

В этом файле мы дальше будем вести все кодирование. Это пока лишь заготовка. Как Вы видите, вначале я подключаю файлы config.php и functions.php и вызываю функцию get_price(), для получения массива товаров.

Давайте я приведу распечатку этого массива (при помощи функции print_r()):

Теперь, думаю, Вам понятно, что содержится в массиве $price_list. Теперь перейдем к установке библиотеки PHPExcel.

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

Первым делом библиотеку необходимо скачать. Для этого переходим на официальный сайт библиотеки — http://phpexcel.codeplex.com/ :

И нажимаем по кнопке download. В результате скачивания у нас получится архив PHPExcel-1.7.7.zip. Давайте его распакуем. Как Вы видите, после распаковки у нас получилось несколько файлов и папок:

Classes

Documentation

Tests

changelog.txt

install.txt

license.txt

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

В папке Documentation – содержится документация по библиотеке, но правда она на английском языке. Но все равно я Вам рекомендую с ней ознакомиться. Так как библиотека имеет огромнейший функционал, и конечно сегодня мы весь его не рассмотрим. А в документации Вы найдете много всего интересного.

В папке Tests – содержатся примеры по использованию библиотеки.

Итак, если Вы скопировали папку Classes в корень скрипта, то мы можем приступать к дальнейшей работе.

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

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

Для тех кто не знает класс – это своего рода чертеж или описательный элемент, какой то определенной сущности. То есть в нашем случае (если сказать простыми словами) класс PHPExcel.php описывает все методы (это обычные функции, только описанные в классе) и свойства (переменные класса) необходимые для вывода данных в формате Excel.

Для того что бы создать объект класса необходимо указать переменную ($objPHPExcel) затем поставить знак присвоения, далее ключевое слово new и указать имя класса. Объект – это такой тип переменной, который позволяет нам работать с методами и свойствами класса. То есть если мы создали объект, то мы получили доступ ко всему, что описано в классе.

На этом установка библиотеки завершена, можно приступать к работе с ней.

3. Основные настройки листа книги Excel.

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

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

$objPHPExcel->setActiveSheetIndex(0);
$active_sheet = $objPHPExcel->getActiveSheet();

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

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

$objPHPExcel->createSheet();

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

Теперь давайте сгенерируем наш первый документ Excel (правда конечно пока пустой), для этого в файл index.php в его конец добавим следующий код (далее весь код, который я буду приводить, следует вставлять перед этим кодом – то есть код который идет ниже должен быть в самом низу файла – это уже завершение скрипта!!!):

header("Content-Type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename='simple.xls'");

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');

exit();

В начале, обратите внимание, отправляем заголовки.

Первый – указываем браузеру тип открываемого контента – это документ формата Excel. И второй – указываем браузеру, что документ необходимо отдать пользователю на скачивание и тут же указываем имя скачиваемого файла (‘simple.xls’ ).

Далее документ необходимо сохранить. Сначала нужно указать, в какой версии мы его сохраняем. Для этого у класса PHPExcel_IOFactory вызываем метод createWriter() и передаем ему объект $objPHPExcel и указываем версию Excel5. При этом будет создан объект класса PHPExcel_Writer_Excel5 и у него вызываем метод save(). Этому методу передаем параметром строку ‘php://output’, это означает, что файл не будет сохранен, а будет отдан браузеру, а браузер в свою очередь, отдаст его нам на скачивание.

Теперь немного о версиях. Кроме версии Excel5, доступна также версия Excel2007, но так как у меня установлен MS Office 2003, то версия Excel2007 у меня просто не откроется. Поэтому я создаю документ версии Excel5.

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

Как Вы видите, мы с Вами получили пустой документ в формате Excel, с одним активным листом.

Теперь давайте пропишем остальные настройки листа (обратите внимание, что все методы мы вызываем у объекта $active_sheet – объекта активного листа документа и весь код вставляем перед заголовками – функция header):

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

Итак, вначале задаем ориентацию листа, при помощи метода setOrientation(), которому передаем константу, ORIENTATION_PORTRAIT, класса PHPExcel_Worksheet_PageSetup. Эта константа — означает, что ориентация страницы будет портретом.

Если Вы хотите расположить лист в виде альбомного листа, нужно методу setOrientation(), передать константу Worksheet_PageSetup::ORIENTATION_LANDSCAPE.

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

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

Это можно проверить, если открыть документ, в формате Excel и перейти в меню Файл, затем на пункт параметры страницы.

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

Далее по аналогии методы setRight(0.75), setLeft(0.75), setBottom(1) – задают соответственно правый, левый и нижний отступы документа.

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

Затем при печати (если кому это нужно), можно выводить шапку и нижний футер листа. Такую возможность можно задать при помощи методов setOddHeader(«&CШапка нашего прайс-листа») и setOddFooter(‘&L&B’.$active_sheet->getTitle().’&RСтраница &P из &N’), которые задают соответственно — шапку и футер документа.

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

Для шапки – передаем строку — &C Шапка нашего прайс-листа (метка &C – означает, что текст нужно расположить по центру).

Для футера – передаем строку — &L&B’.$active_sheet->getTitle().’&RСтраница &P из &N’, это означает, что нужно вывести слева и жирным шрифтом (&L&B’), название листа (метод $active_sheet->getTitle()), затем справа (&R) вывести номер страницы (Страница &P) из общего количества страниц (&N).

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

Затем указываем настройки шрифта по умолчанию. Это можно сделать при помощи последовательного вызова методов:

$objPHPExcel->getDefaultStyle()->getFont()->setName(‘Arial’) – задаем имя шрифта;

$objPHPExcel->getDefaultStyle()->getFont()->setSize(8); — задаем размер шрифта;

Теперь если сохранить изменения и сгенерировать наш документ, то можно увидеть что у нас изменилось название листа документа на Прайс-лист, и если открыть предварительный просмотр страницы, то можно увидеть как выводится шапка и футер документа.

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

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

$active_sheet->getColumnDimension('A')->setWidth(7);
$active_sheet->getColumnDimension('B')->setWidth(80);
$active_sheet->getColumnDimension('C')->setWidth(10);
$active_sheet->getColumnDimension('D')->setWidth(10);

Как вы видите вначале обращаемся к нашему объекту активного листа, далее вызываем метод getColumnDimension(‘A’) – то есть получаем доступ ширине столбца А (либо любого другого столбца, какой мы передадим методу параметром), затем задаем ширину, при помощи метода setWidth(ширина столбца) и передаем ему ширину в символьных единицах.

Для остальных столбцов – все аналогично.

Давайте посмотрим, что получилось:

Как Вы видите, размеры столбцов изменились. Теперь давайте заполним несколько ячеек текстом:

$active_sheet->mergeCells('A1:D1');
$active_sheet->getRowDimension('1')->setRowHeight(40);
$active_sheet->setCellValue('A1','Техно мир');

$active_sheet->mergeCells('A2:D2');
$active_sheet->setCellValue('A2','Компьютеы и комплектующие на любой вкус и цвет');

$active_sheet->mergeCells('A4:C4');
$active_sheet->setCellValue('A4','Дата создания прайс-листа');

В начале давайте объединим ячейки с А1 до D1, при помощи метода mergeCells(диапазон ячеек) – который позволяет объединять ячейки.

Далее зададим высоту этих объединенных ячеек (строка 1), при помощи методов getRowDimension(’1′)->setRowHeight(40) – смотрите, вначале получаем доступ к строке 1 (getRowDimension(’1′)), затем задаем высоту (setRowHeight(высота строки)).
И затем при помощи метода setCellValue(‘A1′,’Техно мир’), устанавливаем значение ячейки А1. Этот метод позволяет записать данные в любую ячейку. Координаты ячейки передаем первым параметром, а значение – вторым.

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

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

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

Для этого запишем текущую дату в ячейку D4, а затем установим формат данных этой ячейки – как дата. Для этого необходимо последовательно вызвать методы у объекта $active_sheet:

getStyle('D4')->getNumberFormat()->
setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX14);

То есть получаем доступ к стилям ячейки D4 ( метод getStyle(‘D4′) вернет объект класса отвечающий за стили ячейки), затем получаем формат данных этой ячейки и устанавливаем новый формат данных (setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX14)).

В константе FORMAT_DATE_XLSX14 хранится строка с форматом даты (вида дд-мм-гггг). Все константы, относящиеся к форматам даты можно посмотреть в документации по библиотеке.

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

//Создаем шапку таблички данных
$active_sheet->setCellValue('A6','№п.п');
$active_sheet->setCellValue('B6','Имя');
$active_sheet->setCellValue('C6','Цена');
$active_sheet->setCellValue('D6','кол-во');

//В цикле проходимся по элементам массива и выводим все в соответствующие ячейки
$row_start = 7;
$i = 0;
foreach($price_list as $item) {
	$row_next = $row_start + $i;
	
	$active_sheet->setCellValue('A'.$row_next,$item['id']);
	$active_sheet->setCellValue('B'.$row_next,$item['name']);
	$active_sheet->setCellValue('C'.$row_next,$item['price']);
	$active_sheet->setCellValue('D'.$row_next,$item['quantity']);
	
	$i++;
}

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

Как Вы видите, данные успешно вывелись.

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

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

//массив стилей
$style_wrap = array(
	//рамки
	'borders'=>array(
		//внешняя рамка
		'outline' => array(
			'style'=>PHPExcel_Style_Border::BORDER_THICK
		),
		//внутренняя
		'allborders'=>array(
			'style'=>PHPExcel_Style_Border::BORDER_THIN,
			'color' => array(
				'rgb'=>'696969'
			)
		)
	)
);
//применяем массив стилей к ячейкам 
$active_sheet->getStyle('A1:D'.($i+6))->applyFromArray($style_wrap);

Обратите внимание, как необходимо оформлять массив стилей. Вначале идет главный массив с ключом – главное правило (к примеру borders – рамки), а в нем еще массивы с правилами. Стили для каждого правила (для каждого вида рамки) – это константы. К примеру, BORDER_THICK – это жирная рамка, BORDER_THIN – это тоненькая рамка.

После создания массива вызываем методы getStyle() – для получения объекта класса, отвечающего за стили выбранной ячейки, а затем метод applyFromArray($style_wrap), который применяет массив стилей к ячейке.

Обратите внимание, как я указал диапазон ячеек в методе getStyle(‘A1:D’.($i+6)). Переменная $i – это число итераций цикла, который выводит данные из массива. А число 6 – это количество строк до вывода данных из цикла. Давайте перейдем в браузер и посмотрим, что получилось:

Как Вы видите, стили успешно применились. Теперь давайте по аналогии, применим стили к остальным ячейкам:

//Стили для верхней надписи строка 1
$style_header = array(
	//Шрифт
	'font'=>array(
		'bold' => true,
		'name' => 'Times New Roman',
		'size' => 20
	),
//Выравнивание
	'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' => 'CFCFCF'
		)
	)


);

$active_sheet->getStyle('A1:D1')->applyFromArray($style_header);

//Стили для слогана компании – вторая строка
$style_slogan = array(
	//шрифт
	'font'=>array(
		'bold' => true,
		'italic' => true,
		'name' => 'Times New Roman',
		'size' => 13,
		'color'=>array(
			'rgb' => '8B8989'
		)
		
	),
//выравнивание
	'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' => 'CFCFCF'
		)
	),
//рамки
	'borders' => array(
		'bottom' => array(
		'style'=>PHPExcel_Style_Border::BORDER_THICK
		)
	
	)


);
$active_sheet->getStyle('A2:D2')->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' => 'CFCFCF'
		)
	),
//рамки
	'borders' => array(
		'right' => array(
		'style'=>PHPExcel_Style_Border::BORDER_NONE
		)
	
	)


);
$active_sheet->getStyle('A4:C4')->applyFromArray($style_tdate);

//Стили для даты
$style_date = array(
	//заполнение цветом
	'fill' => array(
		'type' => PHPExcel_STYLE_FILL::FILL_SOLID,
		'color'=>array(
			'rgb' => 'CFCFCF'
		)
	),
//рамки
	'borders' => array(
		'left' => array(
			'style'=>PHPExcel_Style_Border::BORDER_NONE
		)
	
	),
	


);
$active_sheet->getStyle('D4')->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
	),
	


);
$active_sheet->getStyle('A6:D6')->applyFromArray($style_hprice);
//стили для данных в таблице прайс-листа
$style_price = array(
	'alignment' => array(
		'horizontal' => PHPExcel_STYLE_ALIGNMENT::HORIZONTAL_LEFT,
	)
	

);
$active_sheet->getStyle('A7:D'.($i+6))->applyFromArray($style_price);

Теперь давайте посмотрим на окончательный результат нашей работы:

Вот так вот выглядит окончательный вариант нашего прайс-листа. Согласитесь очень достойный вид. Притом, что мы не затратили на его создание очень много времени. Еще раз Вам рекомендую просмотреть документацию по библиотеке PHPExcel, там содержится очень много всего интересного.

На этом у меня все. Удачного Вам кодирования и до новых встреч!

Фреймворк YII2: теория и первая практика

Овладейте азами фреймворка Yii2 за 5 дней!

Получить

Метки: ,

Похожие записи

  1. Экспорт из Excel в MySQL

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (92)

  1. Иван

    Спасибо. Очень полезная статья. Все подробно расжевано и понятно.

    • Виктор

      Пожалуйста.

      • Иван

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

        • des

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

  2. Сергей

    Очень нужный и полезный материал.
    Странно что эта информация не в Премиуме.
    Спасибо.

    • Виктор Рог

      Ну почему же странно? Мы много полезного материала даем и в бесплатном доступе!:)

      • Сергей

        Да я не против бесплатности, хотя лично я подписался бы на премиум ради получения этого урока… ;)

        • Виктор Рог

          А Вы подпишитесь на Премиум. Тем более, приоткрою тайну, в декабрей, в день исполнения 1 года Премиума, мы будем все уроки заносить в архив, который будет платным. А все, кто с нами, получат доступ и к новым урокам и к архиву:)

    • Виктор Гавриленко

      Пожалуйста!

  3. Сергей

    Очень хочется продолжения )))
    Про вставку ф-ций и картинок,
    а так же про генерацию PDF-файлов

  4. Pocherk

    Хороший и полезный урок.

  5. sanya

    В екселе координаты ячеек могут иметь координати в буквенно чифровом формате а можно и в цифровом формате

    в этом методе getStyle(‘A1:D1′)
    можно както перейтив числовой формат?

  6. Павел Горбунов

    А у меня почему-то выводится на экран просто — excel. Больше ничего. с чем может быть связана такая ошибка?

    • Андрей Кудлай

      Здравствуйте, Павел.
      Будет лучше, если Вы зададите этот вопрос на нашем форуме, прикрепив код.

      • Павел Горбунов

        Код абсолютно тот же самый — просто исходный взял.
        Почему не работает — ???

        • Андрей Кудлай

          Это вопрос все же технического плана, поэтому повторюсь — будет лучше, если он будет разбираться на форуме, где автор урока сможет на него ответить. Комментарии все же меньше подходят для решения вопросов технического характера.

  7. yaskin

    а как сохранить файл в каталог например:
    в /price/price.xls

    • Виктор Гавриленко

      Здравствуйте!
      Для этого Вам необходимо в конце скрипта заккоментировать или удалить вызов двух функций отрправки заголовков:
      //header(«Content-Type:application/vnd.ms-excel»);
      //header(«Content-Disposition:attachment;filename=’simple.xls’»);
      И передать методу $objWriter->save() — имя файла в который будет сохранен прайс-лист:
      $objWriter->save(‘new.xls’) — к примеру вот так.

  8. Seymur

    Очень хорошая статья. Спасибо большое

  9. Алексей

    Здравствуйте. У меня проблема.
    если поставить заголовки
    header(«Content-Type:application/vnd.ms-excel»);
    header(«Content-Disposition:attachment;filename=’simple.xls’»);
    в конце страницы, то вставляется в excel весь код страницы вместе со всеми тегами и notice.
    Даже скачал ваш урок, но и в вашем уроке у меня тоже самое. Вместо прайса куча непонятных символов и кода в excel, а сам excel выдает предупреждение Не удается открыть файл, т.к. формат или расширение являются недопустимыми.
    Действительный формат файла отличается от указываемого его расширением имени файла. Помогите пожалуйста это исправить. Должен же сохраняться файл, а не страница php, где этот прайс создается (

    • Дмитрий

      header(«Content-Type:application/vnd.ms-excel»);
      header(«Content-Disposition:attachment;filename=’simple.xls’»);

      А вам случайно не чего не говорит слово (header) это означает что эти данные будут отправлены в первую очередь перед header у вас не должно быть не чего даже пробелов а также Кодировка PHP документа должна быть UTF-8 без BOM иначе у вас не чего не получится!!!!!!!!1

  10. Алексей

    Здравствуйте. Удалось отправить комментарий только с третьего раза.
    У меня проблема. Если вставить в конце страницы заголовки
    header(«Content-Type:application/vnd.ms-excel»);
    header(«Content-Disposition:attachment;filename=’simple.xls’»);
    то выдается предупреждение:
    Не удается открыть файл, т.к. формат или расширение являются недопустимыми.
    Действительный формат файла отличается от указываемого его расширением имени файла,
    а сама страница открывается в Excel с кучей тегов и notice вместо формы прайса .
    Подскажите как убрать эту ошибку, а то получается как будто я сохраняю не файл.xsl , а саму страницу php (

    • Виктор Гавриленко

      Только что скачал исходники урока, запустил и все работает. Скорее всего у Вас возникла ошибка в скрипте, поэтому заголовки не отправляются(функция header()). Посмотрите правильные ли настройки внесены в конфигурационный файл (имя базы данных, пользователя, пароль).
      Если не получится, то создайте на нашем форуме тему и мы Вам поможем (так как вопросы такого типа решаются на форуме).

      • Алексей

        Спасибо за ответ. Имя базы данных, пользователя, пароль правильные.
        Хорошо, задам вопрос на форуме :)

        • Виктор Гавриленко

          Ок, создавайте тему на форуме — будем решать Вашу проблему.

          • Иван

            Хочу поучаствовать в ответе на данный вопрос

            Скорее всего вы создаете объект как HTML (new PHPExcel_Writer_HTML), а вывод делаете в файл через аттач (header(‘Content-Type: application/vnd.ms-excel’);
            header(‘Content-Disposition: attachment;filename=»‘.$fname.’.xls»‘);)

            Такое случайно могло произойти при эксперименте, когда пробудете сначала в браузер потом в файл.

            Спасибо за внимание!

  11. Алексей

    Попробовал зарегистрироваться два раза. Письмо не приходит. Ящик на Яндексе.
    В спаме сообщений не обнаружил (:

  12. Алексей

    Зарегистрировал еще второй ящик на mail. Письмо тоже не приходит.
    Может можно как то вручную активировать?
    headerhelp2014@mail.ru

    • Андрей Кудлай

      На форуме я вижу 3 неактивированные учетные записи. Все 3 регистрировались с ящиков yandex.ru, ни одного нет с mail.ru
      Ящик headerhelp2014 был также не на mail.ru, a на yandex.ru — headerhelp2014@yandex.ru, поэтому будьте внимательнее.
      Только что попробовал зарегистрироваться, указав ящик на mail.ru — письмо доходит без проблем.

  13. Алексей

    Андрей Кудлай, спасибо за помощь. Это все я пробовал зарегистрироваться. Которые на яндекс, то их можно удалить.
    Создал тему http://webformyself.com/forum/index.php/topic/1057/
    Надеюсь на вашу помощь.

  14. Илья

    Добрый день!
    Задача в следующем. Создать страницу со списком услуг, ячейками для выставления количества + умножение на сумму за единицу. Галочками напротив каждой услуги с возможностью снятия галочки, для не нужных услуг. Сохранение данных в *.xls
    Ктото может дописать такое в выше упомянутый код? Спасибо!

  15. Илья

    Добрый день!
    Ктото может доработать код, чтобы было следующее:
    ) страница с перечнем услуг.
    ) галочками напротив каждой для отметки нужных.
    ) ячейчами напротив каждой услуги для выставления количества за единице + умножение за единицу
    ) сохранение в xls
    Спасибо!

  16. Александр

    Спасибо за материал.

  17. Олег

    А как создать файл на > 8000 строк у меня меньше формирует более не хватает времени

  18. Эльмурза

    А в браузере по какому адресу нужно переходить чтобы выполнить функцию создания файла excel?

    • Андрей Кудлай

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

      • Эльмурза

        По какому спрашиваю еще раз, есть папка PHPexcel и файлы function.php — config.php — index.php

        • Андрей Кудлай

          Вы урок посмотрели? Там же все это есть. Адрес — это путь к папке, по умолчанию будет открыт нужный файл index.php

          • Эльмурза

            Да все просмотрел — только вот выходит на белом фоне — WRONG CONNECTION

          • Андрей Кудлай

            Это значит, что не установлено соединения с БД… как правило, так случается вследствие того, что неверно указаны настройки соединения с БД.

          • Эльмурза

            А теперь выходят всякие иероглифы, что это может быть вот ссылка для просмотра

          • Андрей Кудлай

            Все вопросы, связанные с кодом, лучше решать на форуме.

  19. Lebannen

    Ребята, почему вместо русских символов выводятся везде значения «ЛОЖЬ». Скажу точнее, у меня данные в таблице в мускуле на русском же, а у автора наименования английские. Прошу помочь разобраться.

    • Андрей Кудлай

      Создайте тему на нашем форуме, выложите имеющийся код и дамп БД, только тогда можно будет что-то подсказать.

  20. Мак

    А у меня при попытке открыть тестовый вариант (готовый с урока скачанный) открывает во всех браузерах тупо код индекса. а на моем сайте тоже какой-то код с кучей крякозяблов, но внутри видно что нужные даннйе из базы вытягивает, но ексельным файлом и близко не пахнет(((

  21. Эльмира

    ОГРОМНОЕ СПАСИБО! Описали все подробно и понятно!!! Все сразу получилось=)

  22. Александр

    Спасибо большое за статью!

  23. Дмитрий

    Все супер огромное спасибо очень полезный пост!!!!!!!!!!!!!!!!!!

  24. Игорь

    Хорошая статья, а как задать заголовок категории для группы товаров? Т.е., например, эти товары
    $active_sheet->setCellValue('A'.$row_next,$item['id']);
    $active_sheet->setCellValue('B'.$row_next,$item['name']);
    $active_sheet->setCellValue('C'.$row_next,$item['price']);
    $active_sheet->setCellValue('D'.$row_next,$item['quantity']);

    принадлежат к категории NNN и в прайсе эти товары должны быть озаглавлены горизонтальным полем, что нужно делать?

  25. Билли

    Доброго времени!
    Только сейчас добрался до этого урока,срочно понадобился прайс..
    У меня такая проблема, сначала не открывался файл для скачивания и просмотра,выводилась ошибка,что заголовки уже отправлены,поместил их в самое начало (сразу после <?php)заработало,трюк старый, но у Вас в уроке заголовки в конце файла и всё работает.Но самое главное, что при попытки открыть в браузере эксель файл,выводится такое сообщение:Действительный формат открываемого файла (‘simple.xls’-2.xls) отличается от указываемого его расширением имени файла. Перед открытием данного файла убедитесь^ что он не поврежден и получен из надежного источника. Открыть этот файл сейчас?.У меня стоит Excel2007, я менял как показано в уроке Excel5 на Excel2007,пробовал менять расширение файла на simple.xlsx,не помогает.Подскажите пожалуйста,в чём может быть дело?Застрял на этом месте.А за урок отдельный специальный респект,парни вы все просто молодцы,настолько всё доходчиво и понятно излагаете!

    • Виктор Гавриленко

      Здравствуйте!
      Нужно увидеть исходники Вашего скрипта — что бы ответить на Ваш вопрос. Создайте на нашем форуме тему в одном из разделов и прикрепите исходники скрипта.

      • Билли

        Здравствуйте!
        Решил не нагружать Вас, оставил как в Вашем уроке Excel5,в седьмом открывается без проблем,разницы в принципе никакой.Но меня теперь заинтересовал другой вопрос.В ходе урока Вы вскользь продемонстрировали как создать второй лист.А как вывести на него данные из БД?Просто мне нужен прайс лист с несколькими листами.Например:
        1-й лист — прайс на моноблоки Север
        2-й лист — прайс на моноблоки Полаир
        3-й лист — прайс на моноблоки Zanotti и т.д.
        Можно ли на мой вопрос ответить в формате комментария или это тема отдельного урока?
        Ещё раз спасибо за Ваш урок!

        • Виктор Гавриленко

          В уроке мы с Вами работаем с активным листом индекс которого 0, то есть объект $active_sheet, для работы с другим листом — достаточно получить его объект, указав при этом индекс. К примеру, $objPHPExcel->setActiveSheetIndex(1);
          $active_sheet = $objPHPExcel->getActiveSheet();
          Как то так.

  26. Алексей

    Доброго всем времени суток! Я хочу реализовать загрузку товаров из excel файла в БД mysql для интернет магазина. У Вас на сейте есть подобный пример или урок? Кол-во товаров более 5000 тысяч, по этому ручками вносить такой объем на сайт очень долго. Прошу Вашей помощи!

  27. Алексей

    Андрей, а создание подобного урока планируется?

  28. Алексей

    Хоть подскажите куда копать? Буду очень признателен!

    • Андрей Кудлай

      Как вариант, можно сохранить файл excel в формате csv и импортировать файл запросом LOAD DATA. Урок такой будет, так что если не получится, тогда сможете посмотреть решение в нем.

      • Алексей

        Спасибо, попробую!

      • pocherk

        А можно и свою прогу написать для загрузки из CSV.
        Алгоритм такой:
        1. считываем файл в массив;
        2. в каждом элементе массива вычисляем поля разделенные знаком «;»
        3. записываем в базу данных

        $arr_price = file($filename_csv);
        foreach($arr_price as $v){
        if (!empty($v)){
        list($articul,$tovar,$cost)=explode(";",$v);
        $mysql->query("INSERT INTO price VALUES ('$articul','$tovar','$cost')");
        }
        }

  29. Dia

    А как вообще отдать уже имеющийся файл на скачивание, причем не обязательно .xls (могут быть и .pdf, .docx, …), какие там HTTP-заголовки?

  30. Павел

    Добрый день. Почему-то выпал в ступор при выводе данных в таблицу.
    Сделал запрос
    $sql = «SELECT * FROM `invoices` WHERE `invoice_id` IN (‘$ids’)»;
    Где $ids массив номеров накладных
    $result = mysql_query($sql);
    Создал массив результатов выборки
    $row = array();
    for($i = 0;$i setCellValue(«A».$row_next,$item['invoice_id']);
    $active_sheet->setCellValue(«B».$row_next,$item['ves']);

    $i++;
    }
    Скрипт умирает… чувство, что я что-то упустил или забыл.

    Повторился. Первый раз с ошибкой оптравило

    • Виктор Гавриленко

      Здравствуйте, Павел!
      Скорее всего ошибка в том, что в переменной $ids у Вас содержится массив, а должна быть строка вида IN (‘value1′,’value2′,…)

  31. Андрей

    Доброго времени суток!
    Пожалуйста, объясните как в одной ячейке сделать вывод (на примере HTML)
    Пример: Папа
    То есть заглавную букву сделать жирным.
    За раннее спасибо!

  32. Алексей

    Здравствуйте!
    Большое спасибо за инструкцию — наконец-то понял, как выгрузить данные из mysql в excel файл.
    Скажите, пожалуйста, можно ли обращаться к адресам ячеек (для установки значений) с помощью стиля ссылок r1c1? Надо перебрать значения циклом — с r1c1 это было бы в 100 раз удобнее, чем со стандартным стилем ссылок.
    Спасибо!

  33. Евгений

    Очень интересная статья для меня новичка.
    Ребят, если не влом, напишите пожалуйста как экспорт сделать из xls, будет еще интересней !!!

  34. Борис

    Здравствуйте!
    Спасибо за статью.

    Виктор, а как в генерируемый прайс вставлять картинки товаров?

    Также интересует как это можно сделать в частности под Virtuemart 3, ну это уже частности :)

    • Виктор Гавриленко

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

      • Борис

        Добрый день. Спасибо. Виктор, я зарегистрировался на форуме под ником borro, но мне не дается права создать тему в подфоруме PHP…

  35. Женек

    Блин у всех все скидывает у меня нет . Точнее не совсем нет . ВЫбираю из БД Оракла данные . Далее закидываю из в Excel и тут начинается . Если закидывают как строку , все отображается нормально , но у меня внутри Excel-я формулы , а они со строкой не работают . Скидываю данные как цифровое значение с разделением , у меня получается что сумма 100,40 в БД превращается в сумму 100,00 в Excel . а если кидаю ему 0.10 , то вообще тупо 10. Куда копать ? Я уже формат ячеек менял на все что можно . Думал проблема с точкой или запятой , а нет смотрел данные из бд , все идет с запятыми . Чего за фигня то ?

  36. Павел Щепс

    Здравствуйте!
    Пытаюсь сгенерировать первый документ Excel, но выходит целый лист кракозябров.
    Подскажите что делать?

    • Виктор Гавриленко

      Здравствуйте! Скорее всего проблемы с кодировкой, посмотрите кодирвоку файлов скрипта, она должна быть UTF-8 без BOM

  37. Павел Щепс

    Кодировку проверил. Я работаю в ДW, установил UTF-8 , BOM не подключен.
    Браузер выдаёт Warning: Cannot modify header information — headers already sent by (output started at Z:\home\price.loc\www\index.php:1) in Z:\home\price.loc\www\index.php on line 17

    Warning: Cannot modify header information — headers already sent by (output started at Z:\home\price.loc\www\index.php:1) in Z:\home\price.loc\www\index.php on line 18
    и целый лист кракозябров.
    Открываю в Excel2007

    • Андрей Кудлай

      Посмотрите этот урок, чтобы исправить данную ошибку, ошибка может возникать из-за разных причин — все их найдете в указанном уроке. Ваша ошибка в файле index.php в первой строке, именно там начинается вывод в браузер.

  38. Павел Щепс

    Большое спасибо!
    Урок очень помог! Всё получилось.

  39. Yakobs

    Респект за урок. :)
    Класс оказался вообще JAVA-подобным и элементарным в освоении.

    Спасибо за подробное объяснение.

  40. nemezida.su

    Добрый день. А почему я не могу использовать эту библиотеку, если он расположена на другом xосте? Просто есть несколько сайтов, с которыx xотелось бы обращаться к файлам, наxодящимся только на одном из ниx. Но конструкция вида

    require_once (‘адрес_сайта/PHPExcel/Classes/PHPExcel/IOFactory.php’); почему-то не работает((

    • Андрей Кудлай

      Здравствуйте. Так не получится, поскольку подключить файл можно только в пределах сервера, на котором исполняется скрипт. Доступа к другому серверу (домену) PHP для включения файлов не имеет, в противном случае можно было бы гораздо проще взламывать сайты… например, почему бы в таком случае не подключить в свой скрипт файл конфигурации с настройками подключения к БД, а затем прочитать его и использовать для взлома?

  41. Борис

    Здравствуйте!

    Спасибо. Следую за уроком. Возник вопрос. Как сделать так, чтобы то, что выводится, умещалось в одну страницу по ширине? А то сейчас скачиваемый файл последний столбец печатать на отдельном листе

  42. Вася

    Друг! Спасибо тебе) Всех благ!

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree