Excel — Русский текст в Excel. PHP, Spreadsheet_Excel_Writer.php


Содержание

PHP Excel, но не Spreadsheet_Excel_Writer

Мне нужно сохранить некоторые данные в файле .xls. Я пытаюсь использовать библиотеку PEAR Spreadsheet_Excel_Writer. Это работа. Но теперь я работаю с хостингом без PEAR. Это очень страшно.

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

Я использую Spreadsheet Writer много, и это приятно иметь, но если вам не нужно несколько листов или возможность сделать некоторое форматирование и т.д., вы всегда просто выводите HTML и отправляете

и расширение «.xls», а затем программа Excel или OpenOffice (и я предполагаю, что программа для работы с таблицами Mac) откроет ее и отформатирует HTML как электронную таблицу.

Это не родное решение, но, в конце концов, оно выглядит довольно хорошо для конечного пользователя. Вы должны использовать таблицы в своем html, но вы можете добавлять цвета/границы, отступы, изменения шрифтов, rowspan, colspan и т.д., Для небольшого контроля. Однако нет функций или формул или нескольких листов.

Это малоизвестный формат, который никогда не попадал в руки, но MS Office поддерживает так называемые XML файлы Excel 2003, которые действительно являются XML и, как минимум, выглядят следующим образом:

Вы можете создать это довольно просто без каких-либо расширений PHP, и он будет корректно открыт в любой версии MS Excel с 2003 года. OpenOffice 2 и 3 откроют их правильно, если вы переименуете расширение файла на .xls.xml

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

Phpexcel — русский текст отображается некорректно

Доброго времени суток!

Пишу от безысходности я перечитал кучу форумов, и постов про приминение phpexcel и с функционалом проблем нет.
Но есть избитая тема с кодировкой, пробывал кучу методов. Сам код в UTF-8 сайт отображается в UTF-8 на самом сайте русские буквы отображаются корректно. на странице есть поля в которые нужно ввести русскими буквами текст после чего он обрабатывается php скриптом, скрипт до безобразия простой

Как видно из кода я в порядке бреда пробывал преобразовывать кодировки и так и сяк. в итоге в файле в колонках пусто.
Если писать английскими буквами или цифрами все четко работает.

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

22.07.2014, 21:53

Русский перевод документации по PHPExcel
Мой несколько вольный перевод документа «PHPExcel developer documentation». Все места, где я не был.

PHPExcel некорректно работает на сервере
PHPExcel работает на Open Server и некорректно работает на Linux Debian. Создает файл с.

Не отображается автор и некорректно отображается дата в слайдбаре
Подскажите из-за чего в слайдах отображаются не те даты, что в обычном новостном блоке. То есть.

Некорректно работет русский язык
Начал писать шифратор и столкнулся с проблемой. А именно когда я хочу получить номера символов.

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

23.07.2014, 03:09 2 23.07.2014, 09:50 3 23.07.2014, 13:09 [ТС] 4
23.07.2014, 13:09
23.07.2014, 13:14 5
23.07.2014, 13:39 [ТС] 6

Да именно это я и имел ввиду. Отсюда вопрос как считать количество русских букв?

Поясню сразу с php знаком чуть больше полу года и то в редких случаях код ориентирован на работу с базами.

23.07.2014, 13:45 7
23.07.2014, 20:44 [ТС] 8

Благодарю. вечерком попробую.

Добавлено через 6 часов 47 минут
Все равно русские буквы вопросами но благодаря твоей функции эти вопросы уже пишуться в файл. уже хорошо )))

23.07.2014, 21:06 9
23.07.2014, 21:47 [ТС] 10

Да я тоже наткнулся на эту статью. в итоге как я вычитал нужно в excel сохранять в кодировке windows-1251.
я перевожу и тоже результата ноль.
Где то я допустил костыль.

Добавлено через 3 минуты
у меня на сайте все ок с utf я через echo mb_detect_encoding($order); вижу что все в utf8.

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

Добавлено через 15 минут
Нет с хостом все в порядке на других так же работает, чуствую что решение простое но где то в догоняю.

23.07.2014, 23:39 11

А если вот такой костыль?

24.07.2014, 07:05 [ТС] 12

Да такой вариант тоже пробовал. )))


Тут вот что я заметил! Изначально задача стояла так: нужно вводимые данные записать в файл шаблона excel.
Через костыль utf8_decode( как я понял переводом в однобайтовый utf8) после чего появляются крякозябры а не вопросы. Кракозябрами строка отображается на странице сайта,но если записать эту строку в др excel файл не шаблон то все прекрасно пишется. Я начал рыть в св-вах файла и обнаружил что шаблон выгружен через консультант плюс. Из этого я сделал вывод что кодировка в файле как-то модифицирована консультантом.
На данный момент других предположений у меня нет.
Я нарыл ещё пару процедур со стороны которые так же переводят кодировку. но это уже вечером.

Проблемы с классом Spreadsheet_Excel_Writer

Проблема состоит в том, что мне нужно выгрузить большой объем данных. Если убрать For , то файл формируется нормально, если вернуть данные которые идут в For ‘e, то файл гененрируется с ошибкой. Если уменьшить кол-во записей до 5, то все ок. Скажите, в чем проблема в памяти? Её достаточно, может где то я параметр пропустил?

1 ответ 1

Я сталкивался с подобной проблемой. Spreadsheet_Excel_Writer() — это старый класс и при работе с большими объемами данных ему не хватает памяти. Как это исправить? -Да никак. Разве что переписать сам Spreadsheet_Excel_Writer() =). Более того, я пытался использовать и другие классы, связывающие php и excel , но все равно столкнулся с тем же самым. Видимо, они используют одни и те же библиотеки.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками php или задайте свой вопрос.

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.13.35429

Работа с 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:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Использование Spreadsheet Excel Writer на примерах

Разрабатывая программные комплексы на PHP, мы имеем в руках мощное средство для представления информации в различных форматах, основной из которых — это HTML.
Иногда функциональности чистого HTML может не хватить для реализации идеи разработчика. В таких случаях, PHP может предоставить информацию в практически любых других популярных форматах: в виде изображений с помощью библиотеки GD, в форматах PDF, XML, и даже как сгенерированный по запросу ролик SWF Flash или же просто (и сердито) в виде обычного текстового файла (text/plain).
А в некоторых случаях полезно научить наше приложение сохранять информацию в довольно экзотический для Всемирной паутины формат — в формат электронных таблиц Excel.
Этим мы и займёмся.

Введение

Для генерации таблиц воспользуемся Spreadsheet_Excel_Writer. Я начал свое знакомство с этой библиотекой со статьи «Создание таблиц Excel средствами PHP». Это удобная статья для первого ознакомления, но для дальнейшего использования этой библиотеки информации из неё может просто не хватить. Также автор не уделил должного внимания многим моментам: например, настройкам локализации. Поэтому мои первые таблицы содержали транслитизированные строки. В дальнейшем, изучая обсуждения на форумах и документацию на английском языке, я собрал полезную информацию и решил структурировать её в виде этой статьи.

Краткое описание библиотеки

Перевод описания со страницы модуля:
Spreadsheet_Excel_Writer появился как порт Spreadsheet::WriteExcel с Perl на PHP. Позволяет генерировать электронные таблицы Excel без необходимости подключения COM-объектов. Поддерживает формулы, изображения в формате BMP и все виды форматирования текста и ячеек.

Окружение: Операционная система с PHP 5 и PEAR. В моём архиве сборка PEAR для работы в автономном режиме.

Версия и дата релиза: 0.9.1 (beta) was released on 2006-09-26

Шаг 2. Инициализация объекта
setVersion(8);

// Отправка HTTP заголовков для сообщения обозревателю о типе вxодимыx данныx
$xls->send(‘excel_’.date(«H_i_s»).’.xls’); //название файла excel_17_16_18.xls
?>

Шаг 3. Создаём лист с именем «info» в переменной $sheet
addWorksheet(‘info’); // имя листа должно быть уникальным
?>

Шаг 4. Устанавливаем кодировку листа UTF-8
setInputEncoding(‘UTF-8’);
?>

Шаг 5. Наши данные: двумерный массив $table
array(1, 2, 3),
‘Header 2’ => array(4, 5, 6),
‘Header 3’ => array(7, 8, 9)
);
?>

Шаг 6. Заполняем таблицу данными из массива $table. Используем цикл, инициализируем переменные $cell и $row, где
$cell — столбец
$row — строка.
Добавляем данные к листу. Пробегаем массив, данные записываем по столбцу с помощью функций:
$sheet->write($row, $cell, $header); — пишет в ячейку ($row;$cell) данные $header
$sheet->writeCol ($row, $cell, $row_data); — пишет столбец $row_data в ячейки, начиная с ($row;$cell).

$row_data) <
$row = 0;
$sheet->write($row, $cell, $header);
$row++;
$sheet->writeCol ($row, $cell, $row_data);

Шаг 7. Заканчиваем работу библиотеки, высылаем данные
close();
?>

Усложним форматирование и методы вывода информации, с помощью остальных примеров.

Пример 1

В этом примере введём понятие формата. Формат — это объект, описывающий оформление ячейки или группы ячеек.
addFormat();
// Определение размера текста
$textFormat->setSize(10);
// Определение цвета текста
$textFormat->setColor(‘black’);
$textFormat->setAlign(‘center’);
$textFormat->setBorder(1);
?>
Методы говорят сами за себя.
Этот стиль можно применить при создании ячейки:
write($row, $cell, $data, $textFormat); // Ячейки
?>

Пример 2

Решаем одну из проблем библиотеки «костылями». Как? В данном случае, определяем ширину столбца в цикле. Получаем массив с максимальной длиной строки в ячейках столбца и устанавливаем ширину столбца вручную с помощью функции $sheet->setColumn($cell, $cell, $celLenght), которая устанавливает ширину столбцов с $cell по $cell шириной $celLenght (в пикселях?).

Пример 3


Вывод таблицы умножения в электронные таблицы Excel. Игра слов ;)

Пример 4

Использование формул Excel на листе. Довольно бессмысленно, когда у нас есть мощь PHP, но иногда полезно.

Пример 5

Удобный скрипт, выводящий таблицу цветов, которые можно использовать при создании форматов стилей.

Архив с примерами

200kb, кодировка текстовых файлов UTF-8):
excel.php — простой лист (пример 0);
excel_1.php — лист с форматированием (пример 1);
excel_2.php — лист с ручным определением ширины столбца (пример 2);
excel_3.php — таблица умножения ;) (пример 3)
excel_4.php — лист с формулами (пример 4);
excel_5.php — лист с цветами (пример 5);
папочка pear с библиотекой.
папочка examples с xls-файлами примеров (для ознакомления).

Проблемы

Локализация:
решено функциями
$xls->setVersion(8); //Установка версии Excel, без этого — артефакты с кодировками, с отображением данных
$sheet->setInputEncoding(‘UTF-8’); //Для каждого листа — установка кодировки
Теперь можно писать данные на «чистом» UTF-8, и Excel вас поймёт ;)
Ошибка:
Создатели класса допустили ошибку. Но встречается она, только если пишешь на UTF-8 в версии Excel 8 и пишешь много (>200 строк, несколько листов). В архиве на файл наложен патч, найденный на багтрекере, решающий проблему.

Заключение

Подведём итоги нашей работы. Мы получили элементарные навыки создания электронных таблиц с помощью PHP. Изучая примеры из архива и на сайте разработчика Вы сможете усовершенствовать эти навыки.
Под конец напишу то, что надо было писать в начале. Итак, плюсы и минусы использования библиотеки Spreadsheet_Excel_Writer в своих проектах.
Плюсы:
+ Платформонезависимость
+ Возможность вводить формулы (из английской версии)
+ Нормально открывается в OpenOffice.org CALC
+ Можно добавлять картинки через void Worksheet::insertBitmap

Минусы:
— Ручное определение ширины столбца (если кто-нибудь найдет элегантные решения — буду искренне благодарен)
— Нельзя добавлять графики (особо и не надо)

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

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

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

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

Знакомство с PEAR:: Spreadsheet_Excel_Writer

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::OLE version 0.5 и PEAR::Spreadsheet_Excel_Writer version 0.7. Предупреждаю, что кое — что может изменится в будущиx версияx.

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

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

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

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

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

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

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

Обзор API

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавление функции Excel.

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

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

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

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

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

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

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

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

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

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

Создаем отчеты в Excel на PHP

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Заливка

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

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

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

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

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

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

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

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

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

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

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

Шрифт

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

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

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

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


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

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

Рамка

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

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

Стили линий

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Защита ячеек

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

  • locked — защитить ячейку;
  • h >Пример настройки параметров для защиты ячейки:

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А также нам не обойтись без помощи метода columnIndexFromString(), который входит в состав класса PHPExcel_Cell. Данный метод позволяет определить индекс столбца по его символьному представлению.

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

Комментариев: 194

Никита
Июн 24, 2020 @ 04:15:29

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

admin
Июн 26, 2020 @ 11:39:52

Добрый день!
Сама по себе ничего не бывает. Может кодировка в модуле изменилась?

jeckson
Июл 07, 2020 @ 12:49:54

У меня файл на выходе получается какой то непонятный, одни каракули неразбитые по ячейкам. Не понимаю в чем дело.
http://joxi.ru/DrlVGp5FvOdJN2
Может кто-то совет дать?

irishmann
Фев 21, 2020 @ 15:38:12

Доброго времени суток, у вас до вывода заголовков EXCEL происходит вывод, может echo, var_dump, print затесались.

Richi
Сен 25, 2020 @ 00:43:31

Добрый день, можно ли чтобы скинули исходники(весь код из этой страницы), ну или код взаимодействия phpexcel на чтение из файла и вывод на страницу (по определенным параметрам список/чекбокс), или как легче это реализовать
и как оно будет работать из html?

admin
Сен 28, 2020 @ 11:33:01

Добрый день!
Так отдельных исходников нет, код прямо в тексте. А что вам не ясно?


Richi
Окт 18, 2020 @ 01:53:39

Есть одна страница и там 5 подстраниц, с выпадающими списками, для каждой свой excel
У меня не хочет нормально работать с выпадающим списком под HTML.

VsemP
Ноя 20, 2020 @ 15:11:39

$page->setCellValue(‘A1′, mb_convert_encoding(‘Текст’, ‘utf-8′, ‘windows-1251′)); как то так…

Александр
Окт 18, 2020 @ 10:00:08

А можно в ячейки формулу вписать? тоесть не результат вычислений а иммено формулу, как в обычном Excel, что бы потом пользователь мог копировать растягивать ячейки?

admin
Окт 23, 2020 @ 15:07:13

Думаю, что да. Так как библиотека по возможностям богата, но я лично не сталкивался с подобным.

Адам
Дек 04, 2020 @ 13:33:43

Как читать и перенести саму таблицу, а не просто текст с таблицы?

admin
Дек 04, 2020 @ 22:57:21

Не совсем понял, что вы имеете ввиду.

Михаил
Сен 06, 2020 @ 10:22:18

Необходимо, чтобы числа в столбце имели нули слева, например 01111. При выгрузке задаю ячейке текстовый формат, но в файле эксель, числа все-равно без нулей слева, т.е. 1111, хотя ячейка имеет формат текст.
Вот часть кода:
$objPHPExcel->getActiveSheet()->getStyle(‘B’.$j)
->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
$objPHPExcel->getActiveSheet()->setCellValue(‘B’.$j, $item[‘art_no’]);
Как сделать так, чтобы выгружались числа в ячейки с нулями слева и почему этого не происходит?

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Spreadsheet_Excel_Writer: вопрос

$workbook->setVersion(8) позволяет писать >255 символов в клетку. При этом, если не использовать setInputEncoding, русские буквы отображаются некорректно.

Если же включаем setInputEncoding(), то на выходе получаем битый файл.
Причём начинается цирк: файл на 20 строк (2 строки шапка таблицы + 18 строк данных (пары клеток по 100 символов в каждой)) Excel’ем переваривается нормально, а вот уже на 21 (шапка + 19 строк данных) — начинаются вопли «Файл повреждён настолько серьёзно…» и всё — данные битые.

Соответственно, вопрос: чем из php генерить .xls?
Требования: возможности форматирования (цвета/шрифты/размеры строк/столбцов и т.п.), поддержка русского языка, текстовые поля >255 символов (хотя бы до 4К)

Чтение excel на PHP — основные методы класса PHPExcel

С помощью PHPExcel можно производить чтение и запись информации в файлы, форматировать их содержимое,
выполнять операции с формулами, стилями и т.д.

PHPExcel – библиотека, предназначенная для обработки данных формата MS Excel. С её помощью можно производить чтение и запись информации в файлы, форматировать их содержимое, выполнять операции с формулами, стилями и т.д.
Для работы PHPExcel требуется версия PHP 5.2 или выше, а так же наличие подключенных расширений ZIP, XML и GD2.
Примечание: расширение php_zip нужно только при использовании классов PHPExcel_Reader_Excel2007, PHPExcel_Writer_Excel2007 и PHPExcel_Reader_OOCalc. То есть если вы хотите использовать PHPExcel для полноценной работы с файлами форматов .xlsx или .ods, то вам потребуется zip-расширение.

Возможности библиотеки PHPExcel:

1. PHPExcel может читать различные форматы файлов электронных таблиц:

2. Создание и обработка документов средствами PHP

Установка PHPExcel:
1) Скачать библиотеку с официального сайта http://phpexcel.codeplex.com/
2) В скачанном архиве, из папки classes скопировать содержимое в корень сайта

Состав Архива:

Пример чтения Excel файла при помощи класса PHPExcel

Для чтения данных с Excel файла необходимо подключить файл библиотеки PHPExcel и используется метод load() класса PHPExcel_IOFactory. Этот метод собирает данные всех со всех листов текущего документа:

Далее формируем массив из всех листов Excel файла с помощью цикла:

Вывод сформированного массива в виде HTML таблиц(ы) :

Основные методы и свойства класса PHPExcel

Класс PHPExcel – это ядро PHPExcel. Он содержит ссылки на содержащиеся листы, параметры безопасности документов и мета-данные документов. Помимо вышеизложенного, этот класс включает в себя множество других полезных методов для обработки получаемых данных. Некоторые из них будут описаны ниже.

getSheetCount() – возвратит количество листов в книге;

getSheetNames() – возвращает список всех листов в рабочей книге, индексируя их в порядке, в котором их «вкладки» появляются при открытии в MS Excel (или других программах для обработки электронных таблиц);

getSheet(N) – используется для доступа к листу по индексу. Индекс позиции (N) представляет собой порядок, в котором отображаются вкладки листов, когда книга открыта в MS Excel (или других программах для обработки электронных таблиц);

getSheetByName(list_name) – метод используется для доступа к листу по его имени (list_name);

getActiveSheet() – этот метод позволяет получить доступ к активному листу документа напрямую. Активным листом является тот, который будет активен, когда откроется книга в MS Excel (или другой соответствующей программе электронных таблиц);

setActiveSheetIndex() и setActiveSheetIndexByName() – с помощью этих методов можно назначить лист, который будет активным по его индексу или имени.

Получение значения ячейки по координатам


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

В случае если вам нужны подсчитанные значения ячейки, вместо getValue(), используйте метод getCalculatedValue():

Получение значения ячейки по строкам и столбцам

Для получения значения ячейки, в листе сначала должна быть найдена ячейка с использованием метода getCellByColumnAndRow. Значение ячейки может быть получено с помощью следующей команды:

Заключение

В этой статье были рассмотрены основные возможности библиотеки PHPExcel в области чтения excel файлов. Помимо всего выше изложенного, есть возможность более гибко использовать эту библиотеку для работы с различными параметрами таблицы. По этим вопросам рекомендуется обращаться к документации. Библиотека PHPExcel так же адаптирована для работы с другими типами файлов, таких как Excel (BIFF). XLS, Excel 2007 (OfficeOpenXML). XLSX, CSV, Libre / OpenOffice Calc. ODS, Gnumeric, PDF и HTML.

Лучший способ сказать автору «СПАСИБО» рассказать друзьям или поделиться ссылкой!
Другие статьи:

DateTimePicker – удобный и легкий в использовании плагин для быстрой подстановки даты и времени в поля ввода.

Плагин DateTimePicker для сайта — инструкция, настройка, инициализация

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

Плагин маски ввода для input — jquery maskedinput — инструкция, настройка, инициализация

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

Публикация на стене Вконтакте средствами API — кросспостинг

Текстовый редактор TinyMCE в визуальном режиме при стандартной конфигурации обрезает некоторый теги и свойства.

TinyMCE вырезает теги — исключения для тегов TinyMCE

Научимся вставлять теги в выделенный фрагмент текста, вставлять теги на место селектора в тексте и получать средствами JS HTML код отредактированного текста и текст без HTML сущностей.

Cвойства и методы TinyMCE — вставка тегов, вывод значений

Как вы уже поняли, редактор является платформенным Javascript редактором HTML кода, т.е. WYSIWYG редактором для сайтов и веб приложений. Разработчиком этого полезного продукта является компания Moxiecode Systems AB.

Установка и настройка TinyMCE — инициализация и параметры

В статье мы: познакомимся с каруселью; научимся интегрировать ее на свой сайт; познакомимся с основными параметрами инициализации;рассмотрим самые популярные свойства и методы классов jCarousel

Установка и настройка jCarousel — параметры и методы

Любой backend программист php сталкивается с задачей автоматизации почтовой рассылки на веб сайтах и многие,кто сталкивался с данной задачей впервые, вставали перед ключевым вопросом: «Писать или не писать smtp клиент с нуля?».

ihumanable / Excel.php

/**
* Simple excel writer class with no external dependencies, drop it in and have fun
* @author Matt Nowack
* @link https://gist.github.com/ihumanable/929039/edit
* @license Unlicensed
* @version 1.0
*/
class Excel <
private $col ;
private $row ;
private $data ;
private $title ;
/**
* Safely encode a string for use as a filename
* @param string $title The title to use for the file
* @return string The file safe title
*/
static function filename ( $title ) <
$result = strtolower ( trim ( $title ));
$result = str_replace ( » ‘ » , ‘ ‘ , $result );
$result = preg_replace ( ‘ #[^a-z0-9_]+# ‘ , ‘ — ‘ , $result );
$result = preg_replace ( ‘ #\-<2,># ‘ , ‘ — ‘ , $result );
return preg_replace ( ‘ #(^\-+|\-+$)#D ‘ , ‘ ‘ , $result );
>
/**
* Builds a new Excel Spreadsheet object
* @return Excel The Spreadsheet
*/
function __construct ( $title ) <
$this -> title = $title ;
$this -> col = 0 ;
$this -> row = 0 ;
$this -> data = ‘ ‘ ;
$this -> bofMarker();
>
/**
* Transmits the proper headers to cause a download to occur and to identify the file properly
* @return nothing
*/
function headers () <
header ( » Content-Type: application/force-download » );
header ( » Content-Type: application/octet-stream » );
header ( » Content-Type: application/download » );
header ( » Content-Disposition: attachment;filename= » . Excel :: filename( $this -> title ) . » .xls » );
header ( » Content-Transfer-Encoding: binary » );
>
function send () <
$this -> eofMarker();
$this -> headers();
echo $this -> data ;
>
/**
* Writes the Excel Beginning of File marker
* @see pack()
* @return nothing
*/
private function bofMarker () <
$this -> data .= pack ( » ssssss » , 0x809 , 0x8 , 0x0 , 0x10 , 0x0 , 0x0 );
>
/**
* Writes the Excel End of File marker
* @see pack()
* @return nothing
*/
private function eofMarker () <
$this -> data .= pack ( » ss » , 0x0A , 0x00 );
>
/**
* Moves internal cursor left by the amount specified
* @param optional integer $amount The amount to move left by, defaults to 1
* @return integer The current column after the move
*/
function left ( $amount = 1 ) <
$this -> col — = $amount ;
if ( $this -> col 0 ) <
$this -> col = 0 ;
>
return $this -> col ;
>
/**
* Moves internal cursor right by the amount specified
* @param optional integer $amount The amount to move right by, defaults to 1
* @return integer The current column after the move
*/
function right ( $amount = 1 ) <
$this -> col + = $amount ;
return $this -> col ;
>
/**
* Moves internal cursor up by amount
* @param optional integer $amount The amount to move up by, defaults to 1
* @return integer The current row after the move
*/
function up ( $amount = 1 ) <
$this -> row — = $amount ;
if ( $this -> row 0 ) <
$this -> row = 0 ;
>
return $this -> row ;
>
/**
* Moves internal cursor down by amount
* @param optional integer $amount The amount to move down by, defaults to 1
* @return integer The current row after the move
*/
function down ( $amount = 1 ) <
$this -> row + = $amount ;
return $this -> row ;
>
/**
* Moves internal cursor to the top of the page, row = 0
* @return nothing
*/
function top () <
$this -> row = 0 ;
>
/**
* Moves internal cursor all the way left, col = 0
* @return nothing
*/
function home () <
$this -> col = 0 ;
>
/**
* Writes a number to the Excel Spreadsheet
* @see pack()
* @param integer $value The value to write out
* @return nothing
*/
function number ( $value ) <
$this -> data .= pack ( » sssss » , 0x203 , 14 , $this -> row , $this -> col , 0x0 );
$this -> data .= pack ( » d » , $value );
>
/**
* Writes a string (or label) to the Excel Spreadsheet
* @see pack()
* @param string $value The value to write out
* @return nothing
*/
function label ( $value ) <
$length = strlen ( $value );
$this -> data .= pack ( » ssssss » , 0x204 , 8 + $length , $this -> row , $this -> col , 0x0 , $length );
$this -> data .= $value ;
>
>

This comment has been minimized.

Copy link Quote reply

victusfate commented Apr 25, 2011

Thanks Matt, this could come in handy.

This comment has been minimized.

Copy link Quote reply

scvinodkumar commented Sep 30, 2012

This is really great to see a simple class. but it would be great if you provide how to use this class

This comment has been minimized.

Copy link Quote reply

jbizzay commented Feb 13, 2013

Example of how to use this:

This comment has been minimized.

Copy link Quote reply

tbattur22 commented Feb 14, 2013

Thanks Matt, great simple example to export data to excel file. Is it possible to create multiple sheets within the same excel file?

Цукерберг рекомендует:  Помощь - Бесконечная сумма в си++
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих