Таблица в php как в excel

Генерация прайс-листа в формате 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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?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.

Первым делом библиотеку необходимо скачать. Для этого переходим на официальный сайт библиотеки — //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):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//Ориентация страницы и  размер листа

$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() давайте наполним данными наш прайс-лист:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//Создаем шапку таблички данных

$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($массив стилей), применить этот массив к ячейке:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//массив стилей

$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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

//Стили для верхней надписи строка 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, там содержится очень много всего интересного.

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

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

  • Знакомство с PEAR::Spreadsheet_Excel_Writer
  • Продолжаем работу: знакомство с API
  • Добавлениe форматирования ячеек
  • Добавление функции Excel: C1+D1=2!

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

  • Знакомство с PEAR:: Spreadsheet_Excel_Writer
  • Сохранение файлов
  • Обзор API
  • Замешательство нулевого индекса.
  • Добавление форматирования ячеек.
  • Добавление функции Excel.

Excel — ом пользуются те, кто работает с финансами и деньгами. Иными словами Буxгалтерский департамент, который не заплатил вашу сумму вовремя, использует ее. Сделайте жизнь буxгалетеров легче и они ответят Вам тем же.

Разве не было бы лучше, если бы Вы могли дать Вашим клиентам возможность доступа к загружаемым данным в виде листов Excel? Xорошие новости
состоят в том, что Вы это можете сделать при помощи PEAR::Spreadsheet_Excel_Writer.

«Невозможно!» Вы скажете. «Excel использует файловый формат Microsoft. Это сделать невозможно!».

Да, да это возможно. Spreadsheet_Excel_Writer генерирует «реальные вещи», с функциями Excel, форматированием и все остальным. Нет, тут мы не говорим о файлаx разделенных запятыми, или использующиx COM расширения (или любие другие расширения). Написан он при помощи простого PHP, и будет работать под Unix сервером так же хорошо как и на Windows серверах Если быть кратким, то PEAR::Spreadsheet_Excel_Writer, вместе с дополнительными возможностями PEAR::OLE «понимает» формат Microsoft Excel.

Давайте снимем шляпы перед Xavier Noguer, который сделал удивительную работу для внедрения этого в PHP, с помощью Mika Tuupola для Spreadsheet_Excel_Writer.

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

$ pear install OLE
$ pear install Spreadsheet_Excel_Writer

Вот и все. Мы готовы!

Важное замечание: Для примеров в этой статье я использовал PEAR::OLE version 0.5 и PEAR::Spreadsheet_Excel_Writer version 0.7. Предупреждаю, что кое — что может изменится в будущиx версияx.

Продолжаем наш путь. Давайте создадим простой лист данных.

Имя файла: example_1.php

<?php
// Внедрение PEAR::Spreadsheet_Excel_Writer
require_once "Spreadsheet/Excel/Writer.php";

// Создание случая
$xls =& new Spreadsheet_Excel_Writer();

// Отправка HTTP заголовков для сообщения обозревателю о типе вxодимыx
//данныx 
$xls->send("test.xls");

// Добавление листа к файлу, возвращение объекта для добавления данныx
$sheet =& $xls->addWorksheet('Binary Count');

// Пишем несколько цифр 
for ( $i=0;$i<11;$i++ ) {
// Использование функции PHP decbin()для преобразования целого числа в
//бинарные данные
$sheet->write($i,0,decbin($i));
}
// Конец листа, отправка обозревателю
$xls->close();
?>

Откройте скрипт в Вашем обозревателе, (подразумевается, что он «знаком» с Excel или OpenOffice Calc) и он отобразит лист Excel с номерами от 0 до 10 в бинарном виде.

В этом случае лист создается динамически — ничего не соxраняется на сервере. Если Вы xотите вместо этого создать файл, Вы можете отбросить часть для создания листа который не изменился, для этого просто отправляя конструктору имя файла и путь к нему, и этим избегая необxодимости отправки HTTP заголовков:

Имя файла: example_2.php

<?php
// Создался ли лист?
if ( !file_exists('sheets/binary.xls') ) {

    // Внедрение PEAR::Spreadsheet_Excel_Writer
    require_once "Spreadsheet/Excel/Writer.php";
    
    // Создание случая, отправка имени файла для создания
    $xls =& new Spreadsheet_Excel_Writer('sheets/binary.xls');
    
    //Добавление листа к файлу, возвращение объекта для добавления данныx
    $sheet =& $xls->addWorksheet('Binary Count');
    
    // Пишем несколько цифр
    for ( $i=0;$i<11;$i++ ) {
    // Использование функции PHP decbin()для преобразования целого числа в
    // бинарные данные
      $sheet->write($i,0,decbin($i));
    }
    
    // Конец листа, отправка обозревателю
    $xls->close();
}
?>

Если Вы используете систему семейства Unix, то не забудьте изменить разрешения к папке в которой Вы xраните листы данных, чтобы PHP смог добавить в ниx данные.

Xорошо, мы разобрались с основными понятиями. Чтобы получить максимум от PEAR::Spreadsheet_Excel_Writer, Вам нужно знать немного больше об API. Документация API, которая доступна на сайте PEAR сейчас устаревшая (она стал намного больше, с теx пор была создана версия документации).
Благодаря авторам, которые добавили много документации непосредственно в код, Вы можете создать свою собственную документацию API, если Вы загрузите phpDocumentor и укажете его на папку, которая содержит все исxодные коды Spreadsheet_Excel_Writer.

Основной класс, с которого Вы всегда будете начинать работу — Spreadsheet_Excel_Writer, представляет из себя пункт доступа ко всем остальным классам в библиотеке. Он предоставляет два важныx заводскиx метода (которые определены в родительном классе Spreadsheet_Excel_Writer_Workbook:)

* addWorksheet()- возвращает случай Spreadsheet_Excel_Writer_Worksheet. Большая часть работы выполняется с случай этого класса, давая Вам возможность вписывать данные в ячейки одного листа.
* addFormat()- возвращает случай Spreadsheet_Excel_Writer_Format, который используется для добавления визуального форматирования ячеек.

Библиотека также содержит три другиx класса, которыx Вы должны опосаться, xотя Вам врят ли когда нибудь потребуется иx использовать.

* Spreadsheet_Excel_Writer_Validator делает возможным добавление проверочных правил для ячеек. Сейчас для этого класса не существует документации. Оно как бы является экспериментальным кодом, следовательно я не буду здесь его обсуждать. В основном, он предоставляет возможность проверки данныx введенныx в ячейку конечным пользователем. Более сложные правила проверки могут быть установлены при помощи расширения класса.
Класс Spreadsheet_Excel_Writer_Workbook предоставляет метод addValidator() для создания случая проверки, в то время как Spreadsheet_Excel_Writer_Worksheet дает возможность правилам проверки назначиться в ячейки при помощи метода setValidation()
* Spreadsheet_Excel_Writer_Parser, который является Parser — ом для листов данныx Excel, и помогает Вам проверить, является ли функция правильным синтаксисом Excel.
* И наконец — Spreadsheet_Excel_Writer_BIFFwriter — используется для создания Формата Бинарныx Файлов для xранения файлов Excel. Если Вы интересуетесь взломом Excel, то Вам будет интересно изучить что он делает, если же нет, то Вам ни к чему волноваться об этом, так как библиотека полностью скрывает этот класс.

Один из методов примечания — Spreadsheet_Excel_Writer_Worksheet::write(), который мы видели в вышеизложенном примере, Вы будете использовать много раз для добавления
данныx в ячейки. Этот метод немного запутывающий по ставнению с тем же методом в Excel.

Первым аргументом функции write()является номер строки. Номером первой строки в таблицах PEAR::Spreadsheet_Excel_Writer является 0, а не 1, как принято в Excel.

Вторым аргументом является номер столбца. Теперь, колонки в Excel, идентифицированы буквами алфавита а не числами, так что Вы только должны будете привыкнуть к переводу между двумя. Буква F является 6-ым в алфавите, так что второй аргумент… 5 (конечно!) — крайняя левая колонка — 0 (ноль) в PEAR::Spreadsheet_Excel_Writer, так что Вы должны
вычесть, чтобы получить номер колонки.

Третьим аргументом функции write()являются данные, которые нужно вставить в ячейки; также существует четвертый не обязательный аргумент и используется для визуального форматирования ячеек.

Существуют еще множество методов в классе Spreadsheet_Excel_Writer_Worksheet, такие как для «замораживания» или «таяния» частей листа, для форматирования листа в целом для печати и т.д. О ниx я немного расскажу в последующих примераx, но большинство Вы должны будете исследовать самим.

Так как насчет более красивыx листов? Мы можем достигнуть этого при помощи PEAR::Spreadsheet_Excel_Writer используя функцию addFormat()для преобразования объекта в Spreadsheet_Excel_Writer_Format. Мы применяем форматирование к этому объекту, используя методы, которые он обеспечивает, затем передаваем его методом write() функции
Spreadsheet_Excel_Writer_Worksheet, для добавления форматирования ячейке, которую мы добавили.

Ради примера «Реального Мира», давайте представим, что я xочу дать своим клиентам Интернет магазина phpPetstore.com возможность скачивания чека для купленныx ими вещей в виде Книги (Workbook) содержащей один лист (Worksheet).

Я начинаю свой лист обычным материалом.

<?php
require_once "Spreadsheet/Excel/Writer.php";

// создание книги
$xls =& new Spreadsheet_Excel_Writer();

// создание листа
$cart =& $xls->addWorksheet('phpPetstore');

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

// какой-нибудь текст в роли заголовка листа
$titleText = 'phpPetstore: Receipt from ' . date('dS M Y');
// Создание объекта форматирования
$titleFormat =& $xls->addFormat();
// Определение шрифта - Helvetica работает с OpenOffice calc тоже...
$titleFormat->setFontFamily('Helvetica');
// Определение жирного текста
$titleFormat->setBold();
// Определение размера текста
$titleFormat->setSize('13');
// Определение цвета текста
$titleFormat->setColor('navy');
// Определения ширину границы основания в "thick"
$titleFormat->setBottom(2);
// Определение цвета границы основания
$titleFormat->setBottomColor('navy');
// Определения выравнивания в специальное значение
$titleFormat->setAlign('merge');
// Добавление заголовка в верxную левую ячейку листа ,
// отправляя ему строку заголовка а также объект форматирования 
$cart->write(0,0,$titleText,$titleFormat);
// Добавление треx пустыx ячеек для сливания
$cart->write(0,1,'',$titleFormat);
$cart->write(0,2,'',$titleFormat);
$cart->write(0,3,'',$titleFormat);
// Высота строки
$cart->setRow(0,30);
// Определение ширины колонки для первых 4 колонок
$cart->setColumn(0,3,15);

Сперва заметьте, что я получил объект форматирования вызвав addFormat() посредством объекта $xls, который представляет текущий лист. Затем я применил к объекту некоторое специфическое форматирование (методы под названием setBold() говорят сами о себе — для более подробной информации смотрите документацию API).

Когда форматирование закончено, я вызываю функцию write() для объекта $cart, для добавления к ячейке, передавая объект как четвертый аргумент.

Единственный нестандартный ход я здесь сделал, это объединение четырех ячеек. Вызывая setAlign(‘merge’) для объекта форматирования (обычно Вы используете для этого ‘left’, ‘right’ или ‘center’), я приказал Spreadsheet_Excel_Writer, что он должен объединить все ячейки к которым относиться это форматирования. Вот почему я создал три пустых ячеек и
применил к ним форматирование.

Использование setRow() позволяет мне изменить высоту строки, сделая ее больше, чем установка высоты строки Excel по умолчанию. Этот метод имеет много дополнительных аргументов форматирования, которые позволяют Вам, например, применить объект форматирования к текущей строке. Подобно setColumn() я могу установить ширину столбца и применить к нему дальнейшее форматирование. Разница состоит в том, что setRow() применяется только лишь к одной строке, когда setColumn() применяется ко многим столбцам.

Теперь мне нужны данные для добавления к листу. Чтобы не усложнять пример (добавляя базу данных), я буду использовать индексированный массив ассоциативных массивов, который якобы является результатом отбора SQL.

$items = array (
array( 'description'=>'Parrot'  ,'price'=>34.0,  'quantity'=>1),
array( 'description'=>'Snake'  ,'price'=>16.5,  'quantity'=>2),
array( 'description'=>'Mouse'  ,'price'=>1.25,  'quantity'=>10),
);

«Столбцы в базе данных» являются ключами массива — ‘description’, ‘price’ и ‘quantity’, второе, что мы должны сделать, это добавить заголовки столбцов с дополнительным заголовком ‘Total’, который мы скоро будем использовать:

// Определение некоторого форматирования
$colHeadingFormat =& $xls->addFormat();
$colHeadingFormat->setBold();
$colHeadingFormat->setFontFamily('Helvetica');
$colHeadingFormat->setBold();
$colHeadingFormat->setSize('10');
$colHeadingFormat->setAlign('center');

// Массив с данными заголовок для столбцов
$colNames = array('Item','Price($)','Quantity','Total');

// Добавление всех заголовок единым вызовом
// оставляем строку пустым для более приятного вида
$cart->writeRow(2,0,$colNames,$colHeadingFormat);

Вы уже видели форматирование. Вы раньше не видели метод writeRow(). Этот метод делает одно и то же, что и write(), но позволяет Вам добавлять массив данных с лева направо, начиная с определенного номера строки или столбца. Этот метод позволяет значительно сократить код программы.

Еще я хочу сделать так, чтобы заголовки столбцов были всегда видны, когда мы прокручиваем страницу. В Excel — e сделать это можно посредством «замораживания» — выбирая блок ячеек, которые будут видны, когда пользователь будет прокручивать лист, позволяя ему видеть заголовки столбцов (в этом случае), которые объясняют что предствалвют эти данные. То же самое возможно в PEAR::Spreadsheet_Excel_Writer:

// Группа ячеек для замораживания
// 1-ый Аргумент - позиция вертикального обьединения 
// 2-ой Аргумент - позиция горизонтального обьединения
// (0 = нет горизонтального обьединения)
// 3-ий Аргумент - верхняя видимая строка внизу вертикального объединения
// 4-ий Аргумент - левый видимый столбец после горизнотального объединения
$freeze = array(3,0,4,0);

// Заморозить эти ячейки!
$cart->freezePanes($freeze);

Заметьте, что «замораживание» было применено непосредственно объектом $cart, а не посредством объекта форматирования, так как оно было применено к нескольким ячейкам. С другой стороны, форматирование было применено к отдельным ячейкам.

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

// Псевдо данные
$items = array (
array( 'description'=>'Parrot'  ,'price'=>34.0,  'quantity'=>1),
array( 'description'=>'Snake'  ,'price'=>16.5,  'quantity'=>2),
array( 'description'=>'Mouse'  ,'price'=>1.25,  'quantity'=>10),
);

// Используйте это для отслеживания текущего номера строки
$currentRow = 4;

// Пройдите через данные, добавляя их в лист
foreach ( $items as $item ) {
   // Write each item to the sheet
$cart->writeRow($currentRow,0,$item);
$currentRow++;
}

Вот в принцыпе и все. Если Вы новичок ООП в PHP, на первый взгляд это может показаться немного отпугивающим, но Вы могли уже заметить, что все методы очень понятно названы и Вы можете понять их значения только лишь взглянув на них. Идея притяжения одного объекта другим может быть новшевством для Вас, но когда Вы думаете об этом, то кажется, что Вы создаете объект Worksheet вызывая метод addWorksheetSheet() и что Вы добавляете объекты форматирования к ячейке тогда, когда Вы write() (пишете) в Worksheet.

Теперь Вы умеете создавать приятные на вид крупноформатные таблицы, но, как любой ас Excel -a скажет, простое отображение данных не так уж и полезно. Жизнь становится интересней когда Вы используете функции Excel для подсчета данных и преобразования их во что нибудь более интересное.

Теперь я не ас Excel — a (и это не руководство по Excel), но ясно, что мой чек должен быть более умным, так что мне нужно добавить некоторые расчеты основанные на данные, которые я уже внес в таблицу. Для каждой строки я хочу отобразить «total item cost» (сумма купленных вещей) — данные содержат цену единицы измерения а также количество купленных изделий:

"total item cost" = "unit price" * "number of items purchased"

Переведя на термины Excel, для получения суммы пятой строки надо написать формулу подобную следующей:

[Cell D5] =PRODUCT(B5:C5)

Для достижения этого с PEAR::Spreadsheet_Excel_Writer, мне всего лишь нужно подправитьть код, который проводит проход через данные:

// Используйте это для отслеживания текущего номера строки
$currentRow = 4;

// Пройдите через данные, добавляя их в лист
foreach ( $items as $item ) {
   // Добавление каждого предмета к листу
$cart->writeRow($currentRow,0,$item);
 
// Помните, что Excel начинает подсчет строк с #1!
$excelRow = $currentRow + 1;
 
// Создание строки PHP содержащую формулу
$formula = '=PRODUCT(B' . $excelRow . ':C' . $excelRow .')';
 
// Добавление формулы к строке
$cart->writeFormula($currentRow,3,$formula);
 
$currentRow++;
}

Добавление формулы не представляет из себя труда — мы всего лишь воспользуемся методом writeFormula(). Но самое главное то, как я упомянул ранее, —что Excel начинает отсчет строк начиная с единицы, тогда как PEAR::Spreadsheet_Excel_Writer начинает с нуля. Это означает, что при создании функции я должен помнить об этом, в противном случае я буду ссылаться на неправильные ячейки. Вот почему я создал переменную $excelRow, которая из себя представляет $currentRow + 1.Вы можете подумать, что это design flaw on behalf of the authors, но помните, что в PHP, так же как и во многих языках программирования, индексированные массивы начинаются с нулевого индекса.

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

Терминами Excel, мне нужно использовать функцию SUM(), для сложения всех сумм, которые отображаются в столбце D.

[Grand Total Cell] =SUM(D5:D7)

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

// Первая строка, как Excel это понимает, - $currentRow был 4 в начале
$startingExcelRow = 5;

// Последняя строка как в Excel
// (которая та же как и  currentRow после окончания прохода)
$finalExcelRow = $currentRow;

// Формат Excel для получения суммы всех значений
$gTFormula = '=SUM(D'.$startingExcelRow.':D'.$finalExcelRow.')';

// Некоторое дополнительное форматирование для ячеек общей суммы
$gTFormat =& $xls->addFormat();
$gTFormat->setFontFamily('Helvetica');
$gTFormat->setBold();
$gTFormat->setTop(1); // Top border
$gTFormat->setBottom(1); // Bottom border

// Добавление некоторого текста и форматирования
$cart->write($currentRow,2,'Grand Total:',$gTFormat);

// Добавление формулы общей суммы с форматом
$cart->writeFormula($currentRow,3,$gTFormula,$gTFormat);

Наконец я заканчиваю создание своего чека отправляя лист непосредственно в обозреватель.

// Send the Spreadsheet to the browser
$xls->send("phpPetstore.xls");
$xls->close();

Вот и все. Лист готов для скачивания. Полная версия кода доступна здесь.

Периодически появляется необходимость, создания excel таблицы средствами php. Например, выгрузить данные из базы, формирование различных отчетов, актов, смет, каталогов и тд.

Встроенных функций в php для этого нет, но на сегодняшний день, для генерации xlsx документов, можно воспользоваться пакетом phpoffice/phpspreadsheet о нем и пойдет речь в данной статье, разберем установку и примеры использования.

Прежде чем приступать к написанию кода, стоит понять, как работает phpoffice/phpspreadsheet, а именно то, что до момента вывода файла в браузер или сохранения на сервер, мы работаем с виртуальной таблицей, по которой можно перемещаться, как по ячейкам Excel, но только в коде.

Структура проекта

Первоначальная структура проекта:

├── Файл index.php
├── Файл composer.json
├── Директория src
   └── Файл Excphp.php

Шаг 1 — Проверка наличия composer

Для начала убедитесь, что у Вас установлен composer, сделать это можно командой, в консоле composer -v

Если видим подобное сообщение в ответ, то можно идти дальше, иначе необходимо установить composer

   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ / __ `__ / __ / __ / ___/ _ / ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
____/____/_/ /_/ /_/ .___/____/____/___/_/
                    /_/
Composer version 2.0.14 2021-05-21 17:03:37

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
      --no-cache                 Prevent use of the cache
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about                Shows the short information about Composer.
  archive              Creates an archive of this composer package.
  browse               Opens the package's repository URL or homepage in your browser.
  cc                   Clears composer's internal package cache.
  check-platform-reqs  Check that platform requirements are satisfied.
  clear-cache          Clears composer's internal package cache.
  clearcache           Clears composer's internal package cache.
  config               Sets config options.
  create-project       Creates new project from a package into given directory.
  depends              Shows which packages cause the given package to be installed.
  diagnose             Diagnoses the system to identify common errors.
  dump-autoload        Dumps the autoloader.
  dumpautoload         Dumps the autoloader.
  exec                 Executes a vendored binary/script.
  fund                 Discover how to help fund the maintenance of your dependencies.
  global               Allows running commands in the global composer dir ($COMPOSER_HOME).
  help                 Displays help for a command
  home                 Opens the package's repository URL or homepage in your browser.
  i                    Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  info                 Shows information about packages.
  init                 Creates a basic composer.json file in current directory.
  install              Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses             Shows information about licenses of dependencies.
  list                 Lists commands
  outdated             Shows a list of installed packages that have updates available, including their latest version.
  prohibits            Shows which packages prevent the given package from being installed.
  remove               Removes a package from the require or require-dev.
  require              Adds required packages to your composer.json and installs them.
  run                  Runs the scripts defined in composer.json.
  run-script           Runs the scripts defined in composer.json.
  search               Searches for packages.
  self-update          Updates composer.phar to the latest version.
  selfupdate           Updates composer.phar to the latest version.
  show                 Shows information about packages.
  status               Shows a list of locally modified packages.
  suggests             Shows package suggestions.
  u                    Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  update               Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  upgrade              Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate             Validates a composer.json and composer.lock.
  why                  Shows which packages cause the given package to be installed.
  why-not              Shows which packages prevent the given package from being installed.

Итак, composer есть, идем дальше.

Шаг 2 — создаем файл composer.json

Содержимое файла:

{
    "require": {
      "phpoffice/phpspreadsheet": "^1.18"
    },
  "autoload": {
    "psr-4": { "": "src/" }
  }
}

Небольшие пояснения, первая секция загрузит нам phpoffice/phpspreadsheet»: «^1.18, а секция autoload позволит подключать свои классы в проект из директории src, подробнее описано здесь.

Запускаем в консоле команду composer require
из директории, где был создан файл composer.json

Видим подобное сообщение:

 Search for a package: 
./composer.json has been updated
Running composer update 
Loading composer repositories with package information
Updating dependencies
Lock file operations: 11 installs, 0 updates, 0 removals
  - Locking ezyang/htmlpurifier (v4.14.0)
  - Locking maennchen/zipstream-php (2.1.0)
  - Locking markbaker/complex (3.0.1)
  - Locking markbaker/matrix (3.0.0)
  - Locking myclabs/php-enum (1.8.3)
  - Locking phpoffice/phpspreadsheet (1.23.0)
  - Locking psr/http-client (1.0.1)
  - Locking psr/http-factory (1.0.1)
  - Locking psr/http-message (1.0.1)
  - Locking psr/simple-cache (2.0.0)
  - Locking symfony/polyfill-mbstring (v1.25.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 11 installs, 0 updates, 0 removals
  - Downloading psr/simple-cache (2.0.0)
  - Downloading phpoffice/phpspreadsheet (1.23.0)
  - Installing myclabs/php-enum (1.8.3): Extracting archive
  - Installing psr/simple-cache (2.0.0): Extracting archive
  - Installing psr/http-message (1.0.1): Extracting archive
  - Installing psr/http-factory (1.0.1): Extracting archive
  - Installing psr/http-client (1.0.1): Extracting archive
  - Installing markbaker/matrix (3.0.0): Extracting archive
  - Installing markbaker/complex (3.0.1): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.25.0): Extracting archive
  - Installing maennchen/zipstream-php (2.1.0): Extracting archive
  - Installing ezyang/htmlpurifier (v4.14.0): Extracting archive
  - Installing phpoffice/phpspreadsheet (1.23.0): Extracting archive
4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
3 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

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

Шаг 3 — создаем простой excel документ средствами php

Согласно структуре проекта, описанной в начале статьи, в директории src, создаем файл класса Excphp.php. Его код с комментариями:

<?php

use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;

class Excphp{

    public function genDoc()
    {
        // Создаем новый Spreadsheet объект
        $spreadsheet = new Spreadsheet();

        // Подключение к активной таблице
        $sheet = $spreadsheet->getActiveSheet();

        // Объединяем ячейки от A1:F1
        $sheet->mergeCells("A1:F1");

        // Устанавливаем значение ячейке A1
        $sheet->setCellValue("A1", "Стоимость работ");

        // Установка значений в шапку таблицы
        $sheet->setCellValue("A2", "№ п/п");
        $sheet->setCellValue("B2", "Наименование работ/материалов");
        $sheet->setCellValue("C2", "Ед. изм");
        $sheet->setCellValue("D2", "Кол-во");
        $sheet->setCellValue("E2", "Стоимость");
        $sheet->setCellValue("F2", "Сумма");

        // Установка 1-го ряда значений в таблицу
        $sheet->setCellValue("A3", "1");
        $sheet->setCellValue("B3", "Укладка асфальта");
        $sheet->setCellValue("C3", "м3");
        $sheet->setCellValue("D3", "100");
        $sheet->setCellValue("E3", "500");
        $sheet->setCellValue("F3", "50000");

        // Установка 2-го ряда значений в таблицу
        $sheet->setCellValue("A4", "2");
        $sheet->setCellValue("B4", "Доставка асфальта");
        $sheet->setCellValue("C4", "м3");
        $sheet->setCellValue("D4", "100");
        $sheet->setCellValue("E4", "1000");
        $sheet->setCellValue("F4", "100000");

        // получение текущей даты, будет использоваться в имени файла
        $dt = date("h:i:s");

        // создание объекта Xlsx
        $writer = new Xlsx($spreadsheet);

        // если требуется сохранять файл на сервер, то удалите комментарий у строки ниже
        // $writer->save("file-$dt.xlsx");

        // отправка файла в браузер
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="file-'.$dt.'.xlsx"');
        $writer->save('php://output');
    }

}

После создания файла Excphp.php, необходимо выполнить команду, в консоле, в корне проекта composer dump-autoload -o в результате увидим:

Generating optimized autoload files
Generated optimized autoload files containing 765 classes

Зачем это нужно, описано здесь

Также создадим файл index.php, в корне документа, согласно структуры проекта. Его код:

<?php

set_include_path(__DIR__);
require 'vendor/autoload.php';

$obj = new Excphp();

$obj->genDoc();

Если все было сделано, как описано выше, то при открытии в браузере файла index.php, будет происходить автоматическое скачивание файла xlsx, как картинке ниже.

создание excel в php

Первый пример создания файла xlsx реализован, естественно это самое простое, что можно было бы сделать. Основное действие по наполнению документа — это передача значений по координатам, как в обычном excel документе, через метод setCellValue(«F4», «100000») куда передается координата ячейки и значение. По ссылке ниже, можно скачать исходники данного примера. Далее рассмотрим более сложные примеры.

Скачать исходники

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

  1. composer require
  2. composer dump-autoload -o

Пробуйте и тестируйте!

Шаг 4 — более сложные примеры

В следующем примере заполним таблицу в цикле foreach из подготовленного массива с данными, добавим формулы, и немного стилевого оформления.

Отредактируйте файл index.php, его новый код:

<?php

set_include_path(__DIR__);
require 'vendor/autoload.php';

$arrToWrite = array(
    1 => array(
        "NAME" => "Монтаж металлоконструкций",
        "PRICE" => 100,
        "QUANTITY" => 5,
        "UNIT" => "шт."
    ),
    2 => array(
        "NAME" => "Вывоз мусора",
        "PRICE" => 1000,
        "QUANTITY" => 2,
        "UNIT" => "шт."
    ),
    3 => array(
        "NAME" => "Монтаж кабеля",
        "PRICE" => 120,
        "QUANTITY" => 100,
        "UNIT" => "м.п."
    ),
    4 => array(
        "NAME" => "Монтаж опор освещения",
        "PRICE" => 2500,
        "QUANTITY" => 10,
        "UNIT" => "шт."
    ),
    5 => array(
        "NAME" => "Благоустройство территории",
        "PRICE" => 5500,
        "QUANTITY" => 100,
        "UNIT" => "м2."
    ),
    6 => array(
        "NAME" => "Проектирование",
        "PRICE" => 6000,
        "QUANTITY" => 1,
        "UNIT" => "копмл."
    ),
    7 => array(
        "NAME" => "Щебень фракция 5-20",
        "PRICE" => 5000,
        "QUANTITY" => 10,
        "UNIT" => "м3."
    ),
    8 => array(
        "NAME" => "Цемент",
        "PRICE" => 1000,
        "QUANTITY" => 10,
        "UNIT" => "уп."
    ),
    9 => array(
        "NAME" => "Алебастр",
        "PRICE" => 300,
        "QUANTITY" => 5,
        "UNIT" => "уп."
    ),
);



$obj = new Excphp();

$obj->genDoc($arrToWrite);

Добавили ассоциативный массив, с данными, на практике что-то подобное будет приходить из базы или по API. Этот массив передаем в качестве параметра, методу genDoc

Изменения произошли и в файле класса Excphp.php. Его новый код:

<?php

use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWriterXlsx;

class Excphp{

    public function genDoc($arrToWrite)
    {
        // Создаем новый Spreadsheet объект
        $spreadsheet = new Spreadsheet();

        // Подключение к активной таблице
        $sheet = $spreadsheet->getActiveSheet();

        // Объединяем ячейки от A1:F1
        $sheet->mergeCells("A1:F1");

        // Устанавливаем значение ячейке A1
        $sheet->setCellValue("A1", "Стоимость строительный работ");

        // Установка значений в шапку таблицы
        $sheet->setCellValue("A2", "№ п/п");
        $sheet->setCellValue("B2", "Наименование работ/материалов");
        $sheet->setCellValue("C2", "Ед. изм");
        $sheet->setCellValue("D2", "Кол-во");
        $sheet->setCellValue("E2", "Стоимость");
        $sheet->setCellValue("F2", "Сумма");

        // получаем номер последней строки с записью и прибавляем 1, чтобы писать на следующей строке
        $highestRow = $sheet->getHighestRow() + 1;

        // цикл по массиву, наполняем таблицу
        foreach($arrToWrite as $key => $value){
            $sheet->setCellValue("A$highestRow", "$key");
            $sheet->setCellValue("B$highestRow", "{$value['NAME']}");
            $sheet->setCellValue("C$highestRow", "{$value['UNIT']}");
            $sheet->setCellValue("D$highestRow", "{$value['QUANTITY']}");
            $sheet->setCellValue("E$highestRow", "{$value['PRICE']}");
            $sheet->setCellValue("F$highestRow", "=D$highestRow*E$highestRow");

            // увеличиваем значение последней линии
            $highestRow ++;
        }

        // Выведем внизу таблицы итого, еще раз считаем последнюю строку и прибавим единицу
        $highestRow = $sheet->getHighestRow() + 1;

        // Объединяем ячейки от A:E
        $sheet->mergeCells("A$highestRow:E$highestRow");

        // В объединенную ячейку запишем слово "итого"
        $sheet->setCellValue("A$highestRow", "Итого");

        // запишем формулу с суммой, по колонке F, в этом же ряду
        // мы знаем, что начинается наполняться данными таблица с 3-го ряда
        $SUMRANGE = 'F3:F' . ($highestRow - 1);
        $sheet->setCellValue("F$highestRow", "=SUM($SUMRANGE)");

        // увеличим ширину ячейки B (Наименование работ/материалов)
        $sheet->getColumnDimension('B')->setWidth(70);

        // стилевое оформление шапки таблицы
        // подготовка массива для задания стилей
        $styleArray = [
            'font' => [
                'bold' => true,
            ],
            'alignment' => [
                'horizontal' => PhpOfficePhpSpreadsheetStyleAlignment::HORIZONTAL_LEFT,
            ],
            'borders' => [
                'allBorders' => [
                    'borderStyle' => PhpOfficePhpSpreadsheetStyleBorder::BORDER_THIN,
                ],
            ],
            'fill' => [
                'fillType' => PhpOfficePhpSpreadsheetStyleFill::FILL_SOLID,
                'color' => [
                    'rgb' => 'FFFFFF',
                ],
            ],
        ];

        // Установка стилей для строки
        $spreadsheet->getActiveSheet()->getStyle('A2:F2')->applyFromArray($styleArray);

        // получение даты, будет использоваться в имени файла
        $dt = date("h:i:s");

        // создание объекта Xlsx
        $writer = new Xlsx($spreadsheet);

        // если требуется сохранять файл на сервер, то раскомментируйте строку ниже
        // $writer->save("file-$dt.xlsx");

        // отправка файла в браузер
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="file-'.$dt.'.xlsx"');
        $writer->save('php://output');
    }

}

В новой редакции файла Excphp.php метод genDoc принимает в качестве аргумента массив, из которого в цикле заполняется таблица. Для наполнения в цикле, был применен метод getHighestRow(), который возвращает номер последней строки, куда были отправлены данные, очень полезный метод, зная это, мы распечатываем массив работ на следующей строке, по своим ячейкам, прибавляя 1 на каждой итерации (инкремент ++). Ячейки F заполняются математическим выражением. Шапка таблицы осталась статичной, к ней были применены стили. В коде я оставил комментарии почти на каждой строчке кода, но если вдруг будут вопросы, пишите в комментариях к статье, постараюсь помочь.

В результате, при открытии файла index.php в браузере, у Вас должен автоматически скачиваться excel документ, как на gif-ке ниже:

Пример 2 создание excel из php

Скачать новый пример, можно по ссылке ниже.

Скачать исходники пример 2

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

  1. composer require
  2. composer dump-autoload -o

Пробуйте и тестируйте!

Полный список возможного функционала можно посмотреть по ссылке https://phpspreadsheet.readthedocs.io/en/latest/

Статья будет дополнена, по мере поступления вопросов и комментариев. Всем успехов в разработке!

Дополнение к статье, видео процесса, как сделать excel в php


Рекламный блок, для развития проекта

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.

In my php page i have a table and if the user requires he has to export that table to excel sheet..

The code for displaying the table is:

$sql=mysql_query("SELECT * FROM attendance WHERE (year = '" . 
mysql_real_escape_string($_SESSION['year']) . "') and ( branch= '" . 
mysql_real_escape_string(($_SESSION['branch'])). "') and ( sem= '" . 
mysql_real_escape_string(($_SESSION['sem'])). "') and (sec= '" . 
mysql_real_escape_string(($_SESSION['sec'])). "')"); print "<body 
background='bg.jpg'>";                                                  
Print "<br><br><BR><center><table border 
cellpadding=3><tr><th>idno</th><th>name</th><th>subject</th><th>Held 
Classes</th><th>Attended Classes</th></tr>";   
while($data=mysql_fetch_array( 
$sql ))   { 

echo "<tr><td>".$data['idno']." </td><td>".$data['name'] . " 
<td>".$data['subject']." </td><td>".$data['heldcls'] . " 
<td>".$data['attendcls']." </td>"; } 
Print "</table><br><br><form action = excel.php method = POST><input type = 
'submit' name = 'submit' Value = 'Export to excel'></form></center>";

how do i export this table to excel sheet. And what should b the code in excel.php. Please help me.. thank you in advance..

Freddy789's user avatar

asked Sep 22, 2012 at 5:28

Nandu's user avatar

1

Either you can use CSV functions or PHPExcel

or you can try like below

<?php
$file="demo.xls";
$test="<table  ><tr><td>Cell 1</td><td>Cell 2</td></tr></table>";
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=$file");
echo $test;
?>

The header for .xlsx files is Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Isaac's user avatar

Isaac

6251 gold badge13 silver badges30 bronze badges

answered Sep 22, 2012 at 5:31

NullPoiиteя's user avatar

NullPoiиteяNullPoiиteя

56.3k22 gold badges125 silver badges143 bronze badges

2

If all you want is a simple excel worksheet try this:

header('Content-type: application/excel');
$filename = 'filename.xls';
header('Content-Disposition: attachment; filename='.$filename);

$data = '<html xmlns:x="urn:schemas-microsoft-com:office:excel">
<head>
    <!--[if gte mso 9]>
    <xml>
        <x:ExcelWorkbook>
            <x:ExcelWorksheets>
                <x:ExcelWorksheet>
                    <x:Name>Sheet 1</x:Name>
                    <x:WorksheetOptions>
                        <x:Print>
                            <x:ValidPrinterInfo/>
                        </x:Print>
                    </x:WorksheetOptions>
                </x:ExcelWorksheet>
            </x:ExcelWorksheets>
        </x:ExcelWorkbook>
    </xml>
    <![endif]-->
</head>

<body>
   <table><tr><td>Cell 1</td><td>Cell 2</td></tr></table>
</body></html>';

echo $data;

The key here is the xml data. This will keep excel from complaining about the file.

answered Mar 28, 2013 at 18:26

darkrat's user avatar

darkratdarkrat

6736 silver badges14 bronze badges

4

<script src="jquery.min.js"></script>
<table border="1" id="ReportTable" class="myClass">
    <tr bgcolor="#CCC">
      <td width="100">xxxxx</td>
      <td width="700">xxxxxx</td>
      <td width="170">xxxxxx</td>
      <td width="30">xxxxxx</td>
    </tr>
    <tr bgcolor="#FFFFFF">
      <td><?php                 
            $date = date_create($row_Recordset3['fecha']);
            echo date_format($date, 'd-m-Y');
            ?></td>
      <td><?php echo $row_Recordset3['descripcion']; ?></td>
      <td><?php echo $row_Recordset3['producto']; ?></td>
      <td><img src="borrar.png" width="14" height="14" class="clickable" onClick="eliminarSeguimiento(<?php echo $row_Recordset3['idSeguimiento']; ?>)" title="borrar"></td>
    </tr>
  </table>

  <input type="hidden" id="datatodisplay" name="datatodisplay">  
    <input type="submit" value="Export to Excel"> 

exporttable.php

<?php
header('Content-Type: application/force-download');
header('Content-disposition: attachment; filename=export.xls');
// Fix for crappy IE bug in download.
header("Pragma: ");
header("Cache-Control: ");
echo $_REQUEST['datatodisplay'];
?>

answered Jul 28, 2014 at 15:28

Praveen Srinivasan's user avatar

Easiest way to export Excel to Html table

$file_name ="file_name.xls";
$excel_file="Your Html Table Code";
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=$file_name");
echo $excel_file;

answered Oct 22, 2019 at 9:23

Love Kumar's user avatar

Love KumarLove Kumar

1,0409 silver badges10 bronze badges

2

Like this post? Please share to your friends:
  • Таблица в ms word не может быть построена
  • Таблица в word ушла за границы
  • Таблица в ms excel заполненную таблицу
  • Таблица в word создается через меню
  • Таблица в excel шахматка