Php excel по шаблону

PHP Excel Templator

Latest Stable Version
Latest Unstable Version
License
Total Downloads
Monthly Downloads
Daily Downloads

PHP Excel модуль, позволяющий экспортировать excel-файлы из excel-шаблона.
Теперь не нужно при помощи кода с нуля создавать excel-файлы, прописывать в нём стили и т. д.

Демонстрация:

Демонстрация

Простой пример

Самый простой пример, как это может выглядеть (с минимальным количеством кода):
Допустим, у нас есть excel-файл со следующими шаблонными переменными:

Шаблон

Код будет выглядеть следующим образом:

use alhimik1986PhpExcelTemplatorPhpExcelTemplator;
require_once('vendor/autoload.php'); // если используется чистый код без фреймворка

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
]);

В результате мы получим:

Результат

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

Характеристики

  • Возможность вставить несколько шаблонных переменных в одной ячейке таблицы (если тип данных «строка»)
  • Возможность вставить одномерный массив, в этом случае в таблице будут создаваться дополнительные строки
  • Возможность вставлять двумерный массив, в этом случае в таблице создаются соответствующие колонки и строки
  • Всталяя значение в ячейки можно менять и стили этих ячеек, даже при вставке массивов
  • Возможность применять один и тот же шаблон на нескольких листах таблицы

Демонстрация характеристик и примеры использования приведены в папке samples.

Ограничения:

  • Возможны так называемые побочные эффекты при использовании нескольких одномерных или двумерных массивов, чередующихся в определенных местах. Пример побочных эффектов также приведён в папке samples.

УСТАНОВКА:

$ composer require alhimik1986/php-excel-templator

Правила именования шаблонных переменных

Правила могут быть любыми, но я могу предложить свою рекомендацию по именованию шаблонных переменных:

  • {var_name} — для строковых значений
  • [var_name] — для одномерных массивов
  • [[var_name]] — для двумерных массивов

Как вставить одномерный массив, чтобы в таблице создавались не строки, а столбцы?

Для этого вместо одномерного массива вставляем двумерный следующим образом:

$param['[[var_name]]'] = [['text 1', 'text 2', 'text 3']];

Испрользование сеттеров

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

use alhimik1986PhpExcelTemplatorPhpExcelTemplator;
use alhimik1986PhpExcelTemplatorparamsExcelParam;
use alhimik1986PhpExcelTemplatorparamsCallbackParam;
use alhimik1986PhpExcelTemplatorsettersCellSetterStringValue;

require_once('vendor/autoload.php'); // если используется чистый код без фреймворка

$params = [
	'{current_date}' => new ExcelParam(CellSetterStringValue::class, date('d-m-Y')),
	'{department}' => new ExcelParam(CellSetterStringValue::class, 'Sales department'),
];
PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', $params);

На данный момент существует 3 вида сеттеров:

  • CellSetterStringValue (для строчных значений)
  • CellSetterArrayValue (для одномерных массивов)
  • CellSetterArray2DValue (для двумерных массивов)

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

Примеры кода, в котором используются все виды сеттеров, приведены папке samples.

Как задать стили без использования сеттеров?

В большинстве случаев задавать сеттеры явно — не так удобно. Хочется использовать минимум кода. Поэтому есть возможность задать стили без использования сеттеров:

use alhimik1986PhpExcelTemplatorPhpExcelTemplator;
use alhimik1986PhpExcelTemplatorparamsCallbackParam;
require_once('vendor/autoload.php'); // если используется чистый код без фреймворка

$params = [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
	'[sales_amount]' => [
		'10230',
		'45100',
		'70500',
	],
];

$callbacks = [
	'[sales_amount]' => function(CallbackParam $param) {
		$amount = $param->param[$param->row_index];
		if ($amount > 50000) {
			$cell_coordinate = $param->coordinate;
			$param->sheet->getStyle($cell_coordinate)->getFont()->setBold(true);
		}
	},
];

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', $params, $callbacks);

Специальный сеттер для специального шаблона (CellSetterArrayValueSpecial)

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

Специальный шаблон

Для таких шаблонов создан специальный сеттер: CellSetterArrayValueSpecial. Пример его использования приведён в папке: samples/8_special_template.

Использование событий

Ниже я привёл перечень возможных событий и пояснения, для чего их можно применить:

$events = [
    PhpExcelTemplator::BEFORE_INSERT_PARAMS => function(Worksheet $sheet, array $templateVarsArr) {
        // Возникает перед вставкой значений в шаблонные переменные
    },
    PhpExcelTemplator::AFTER_INSERT_PARAMS => function(Worksheet $sheet, array $templateVarsArr) {
        // Возникает после вставки значений в шаблонные переменные.
        // Применяется, если нужно что-нибудь вставить в таблицу после того, как были созданы колонки и строки.
        // Например, когда нужно вставить массив картинок.
        // Если вставить картинки, используя $callbacks, то картинки могут смещаться вправо, 
        // так как при вставке значений в шаблонные переменные, которые находятся ниже, могу создаваться дополнительные колонки.
        // Поэтому массив картинок лучше вставлять после того, как все дополнительные колонки был созданы.
        // Для этого используется это событие.
        // Пример его использования приведён в папке: samples/10_images        
    },
    PhpExcelTemplator::BEFORE_SAVE => function(Spreadsheet $spreadsheet, IWriter $writer) {
        // Возникает перед созданием excel-файла после вставки значений в шаблонные переменные.
        // Может использоваться, если нам нужно произвести манипуляции с объектом $writer или $spreadsheet.
        // Например: $writer->setPreCalculateFormulas(false);  
       
    },
];
$callbacks = [];
$templateFile = './template.xlsx';
$fileName = './exported_file.xlsx';
$params = [
	// ...
];

PhpExcelTemplator::saveToFile($templateFile, $fileName, $params, $callbacks, $events);

How do I load an Excel Template with PHPExcel and write to its cells and also insert images to cells dynamically?

pnuts's user avatar

pnuts

58k11 gold badges85 silver badges137 bronze badges

asked Sep 1, 2013 at 5:16

1

You can read your excel template like this with PHPExcel:

$objPHPExcel = PHPExcel_IOFactory::load("./forms/english/cash.xlsx");

and you can write to cells like this:

  $objPHPExcel->setActiveSheetIndex(0)
                            ->setCellValue('A2', "No")
                            ->setCellValue('B2', "Name")
                            ->setCellValue('C2', "Email")
                            ->setCellValue('D2', "Phone")
                            ->setCellValue('E2', "Address");

answered Sep 1, 2013 at 6:44

MJ X's user avatar

MJ XMJ X

8,29812 gold badges68 silver badges98 bronze badges

see the example, 30template.php in github site

https://github.com/PHPOffice/PHPExcel/blob/develop/Examples/30template.php

load template :

$objReader = PHPExcel_IOFactory::createReader('Excel5');

$objPHPExcel = $objReader->load("templates/30template.xls");

see in the example write via

$objPHPExcel->getActiveSheet()->setCellValue() 

to add image use PHPExcel_Worksheet_Drawing :

// Add an image to the worksheet
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('My Image');
$objDrawing->setDescription('The Image that I am inserting');
$objDrawing->setPath('./images/myImage.png');
$objDrawing->setCoordinates('B2');
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

answered Sep 1, 2013 at 5:47

Haim Evgi's user avatar

Haim EvgiHaim Evgi

122k45 gold badges217 silver badges223 bronze badges

2

Из песочницы, Программирование, PHP


Рекомендация: подборка платных и бесплатных курсов Java — https://katalog-kursov.ru/

image

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

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

use alhimik1986PhpExcelTemplatorPhpExcelTemplator;

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
]);

При этом у нас имеются следующие хотелки:

  • мы хотим применять несколько шаблонных переменных в одной ячейке
  • а ещё мы хотим передать массив, а в excel для этого в ячейке создавались соответствующие строки
  • а как насчёт двумерного массива, чтобы создавались не только строки, но и столбцы
  • а ещё нам нужно применять стили для каждой вставленной ячейки, например, чтобы выделить зелёным цветом крупные суммы или выделить жирным цветом отличившихся сотрудников

Вы скажете, что я уже пытался делать подобное: когда создаются строки, то колонки справа от этой ячейки будут дублироваться. Нет такого не произойдёт, потому что на самом деле не строки создаются, а «добавляются ячейки со сдвигом вниз». Кстати, в PHP Spreadsheet на данный момент такой функции нет, он может только вставлять строки.

Возможны ли побочные эффекты при использовании большого количества одномерных и двумерных массивов? Да, возможны. Особенно, когда используются несколько двумерных массивов в одном ряду и на нескольких строчках подряд. Дело в том, что ячейки (находящиеся с права), которые не содержат шаблонные переменные, они не сдвигаются. В результате они могут быть перекрыты ячейками с двумерным массивом. Выход из ситуации — создавать шаблонные переменные с пустыми данными и располагать эти переменные рядом с ячейками, для которых нужно делать отступы. Пример побочных эффектов имеется в папке «samples».

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

В планах: создать пример, в котором показано, как бороться с побочными эффектами; возможность применять стили без использования сеттеров (чтобы экспортировать меньше классов и уменьшить количество применяемого кода). Почему я не сделал этого сейчас? Мне нужна поддержка, то есть мне мне надо знать, что это кому-то нужно. А то вдруг окажется, что я изобрёл велосипед и всё, что я сделал — дичь полнейшая. Поэтому жду ваши отзывы.

Ссылка на проект

За последние 24 часа нас посетили 13746 программистов и 1032 робота. Сейчас ищут 449 программистов …


  1. Николай Костылев

    Николай Костылев
    Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    3
    Симпатии:
    0

    Представляю на всеобщее обозрение результат двухнедельного поиска в интернете соответствующей информации.
    Передо мной встала следующая задача.
    Из корпоративной базы данных информацию выдать в виде отчетов в формате MS Word и MS Excel.
    Ну и конечно отчет выставить в WEB.
    Механизм выборки данных и публикации в WEB описывать не буду. Очень много информации в инете, да и баз данных море.
    А вот формирование документов по шаблону — вещь полезная. Почему то нигде не нашел примеров работы с шаблонами.

    Оговорка. Всё отрабатывалось на Windows Server 2003 + Oracle Apache Server.
    О Linux-платформе в конце статьи.

    Итак.

    Excel.
    С Excel-ом попроще. Готовим красивый файл. Форматируем внутренности, т.е. готовим ячейки куда будем прописывать данные. Теперь пишем PHP:

    <?php
    // Создаем СОМ-объект
    $excel = new COM(«Excel.Application») or die(«Unable to instanciate excel»);
    $excel->Visible = false;
    $excel->DisplayAlerts = false;
    // Выводим версию MS Excel
    echo «I’m using MS Excel {$excel->Version}»;
    $excel->Application->Visible = 0;
    $excel->DisplayAlerts = 0;
    # Открытие сущуствующей проформы
    $excel->Workbooks->Open(«C:\temp\example.xls»);
    // Выбираем активный лист и устанавливаем курсов в область ячейки (1, 1)
    $sheet = $excel->Worksheets(1);
    $sheet->activate;
    $cell = $sheet->Cells(1,1);
    $cell->Activate;
    // Записываем в ячейку текст или данные
    $cell->value = ‘Test’;
    // Сохраняем как новый документ — от туда и выбрасываем в инет
    $excel->Workbooks[1]->SaveAs(«c:\temp\New.xls»);
    // Всё — уходим
    $excel->Quit();
    $excel->Release();
    $excel = Null;
    ?>

    Примеры форматирования ячеек
    $change = $excel -> Selection -> Range(«A1»);
    $change -> Font -> Bold = true;
    $change -> Font -> Italic = true;
    $change -> Font -> Underline = true;
    $change -> Font -> Name = «Times New Roman»;
    $change -> Font -> Size = 12;
    $change -> Font -> ColorIndex = 3;

    Про форматирование в конце статьи дам общие рекомендации.

    Word.
    Ну а теперь самое интересное. Пока до этого докопался …
    Даже в O’Reilly Programming PHP такого не нашел.

    С Вордовскими шаблонами работа заключается в следующем:
    а) записать данные в закладку (надеюсь не надо объяснять что такое закладка в Ворде) — использовать что-то типа <FIELD1> и методом поиска и замены не рекомендую — может когда-то такая комбинация встретиться;
    б) добавить какое-то количество строк в какую-то таблицу в документе (таблиц может быть много, причем как в колонтитулах так и в самом документе);
    в) записать данные в ячейку таблицы;
    г) нарисовать в ячейке линию (border) — это для подчеркивания итогов в основном;
    д) объединить несколько ячеек таблицы — это из практики формирования судовых документов.
    Поверьте — всё остальное готовится заранее в шаблоне.

    Ну что? Кто нибудь решал такую задачу?

    Итак пишем PHP:
    <?php
    //создаем новый объект COM – word.application
    $word = new COM(«word.application») or die(«Cannot create Word object»);
    $word->Visible = false;
    $word->DisplayAlerts = false;
    // переменная $empty нужна для подстановки
    // неопределенных переменных в методы VBA
    $empty = new VARIANT();
    // Открытие сущуствующей проформы
    $template_file = «C:/temp/doc3.doc»;
    $word->Documents->Open($template_file);
    //
    // Пишем в закладку ‘test’
    // естественно в шаблоне такая закладка в нужном
    // месте должна быть подготовлена
    $current_date = date(«m/d/Y»);
    $bookmarkname = «test»;
    $objBookmark = $word->ActiveDocument->Bookmarks($bookmarkname);
    $range = $objBookmark->Range;
    $range->Text = $current_date;
    //
    // Пишем в ячейку таблицы
    $objTable = $word->ActiveDocument->Tables(1);
    $objCell = $objTable->Cell(1,1);
    $range = $objCell->Range;
    $range->Text = «cell(1.1)»;
    //
    // Рисуем линию ячейки
    $mySelect = $objCell->Select();
    $myBorder = $word->Selection->Borders(-1);
    $myBorder->LineStyle = 1;
    // Оговорка — не используйте Borders(wdBorderTop)
    // Для распознавания Виндовых имен типа wdBorderTop
    // необходимо подгружать библиотеку
    //com_load_typelib(‘Word.Application’);
    // что в свою очередь инициирует на сервере еще один процесс MS Word
    // который потом закончить нельзя
    // числовые эквиваленты таких имен как wdBorderTop
    // легко найти в справке по VBA в самом Ворде
    //
    // Добавляем строки к таблице
    $word->Selection->GoTo(‘2′,$empty,’2’,$empty);
    $word->Selection->InsertRowsBelow(1);
    // Самое интересное
    // Объединяем ячейки
    $myTable = $word->ActiveDocument->Tables(2);
    $rangeStart = $myTable->Cell(1,4);
    $myRangeStart = $rangeStart->Range->Start();
    $rangeEnd = $myTable->Cell(2,4);
    $myRangeEnd = $rangeEnd->Range->End();
    $myRange = $word->ActiveDocument->Range($myRangeStart,$myRangeEnd);
    $myRange->Cells->Merge();
    //
    // Сохраняем документ под новым именем
    $new_file = «C:/temp/new3.doc»;
    $word->Documents[1]->SaveAs($new_file);
    //
    // Всё — уходим
    $word->Quit();
    $word = null;
    unset($word);
    ?>

    Ну вот и всё. Пользуйтесь.

    Теперь общие замечания или выводы по интерпретации кода VBA в PHP.
    Всё очень просто.
    Оказывается если придерживаться одного правила,
    то переносить код VBA в PHP очень просто.
    ////////////////////////////////////////////////////////////////////////////////////////////
    ПРАВИЛО! Использовать больше двух ‘->’ в одной строке нельзя!!!
    ////////////////////////////////////////////////////////////////////////////////////////////
    Пример. Объединение ячеек.

    Код в VBA:

    Set myTable = ActiveDocument.Tables(1)
    If Not IsNull(rstBl!ORDER_NO) Then
    ActiveDocument.Tables(1).Cell(vCurentRow, 10).Range.Text = rstBl![ORDER_NO].Value
    Set myRange = ActiveDocument.Range(myTable.Cell(vCurentRow, 10).Range.Start, myTable.Cell((vCurentRow + vMaxRows), 10).Range.End)
    myRange.Select
    Selection.Cells.Merge
    End If

    Код PHP:

    // Объединяем ячейки
    $myTable = $word->ActiveDocument->Tables(2);
    $rangeStart = $myTable->Cell(1,4);
    $myRangeStart = $rangeStart->Range->Start();
    $rangeEnd = $myTable->Cell(2,4);
    $myRangeEnd = $rangeEnd->Range->End();
    $myRange = $word->ActiveDocument->Range($myRangeStart,$myRangeEnd);
    $myRange->Cells->Merge();

    Как видите — внимательно превращая VBA-точки в PHP-стрелки, можно писать в PHP как в VBA.

    Теперь про платформу Linux.
    Конечно с таким решением задачи я сам лично не согласен. Т.е. приходится использовать Виндовый сервак. Нужен движок Ворда и Экселя.
    Я выбрал решение следующее. Linux, OpenOffice Calc Writer, JavaScript, PHP.
    Как решу задачу — дополню эту статью.

    Всем успехов.
    Письма благодарности жду по адресу n.kostilev@gmail.com


  2. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    это все очень мило. я бы сказал заебись, а теперь повтори тоже самое под никсами?


  3. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    1. Excel — есть готовые классы. порыться надо только.
    2. Word. все давно юзают под эту тему RTF формат.


  4. akrinel

    akrinel
    Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb

    440Hz, ответь на вопрос юного падавана плиз:

    Вот есть OpenOffice, у него(если я не ошибаюсь) открытые исходники, если выдрать из него процесс конвертации в .doc формат и сделать отдельной программой, это будет очень суровым решением подобной проблемы?


  5. флоппик

    Херня понаписана.
    И ворд, и эксель понимают html разметку в теле документа.
    И никаких ком-обьектов не надо.


  6. флоппик

    akrinel, у MSO тоже открытые исходники. И на базе этих данных уже есть готовое решение.

  7. akrinel вешаешь ОО демоном и в командной строке вызываешь макрос…


  8. akrinel

    akrinel
    Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb

    Спамить людей не люблю, поэтому пишу спасибо вам здесь. Было любопытно почитать.


  9. Николай Костылев

    Николай Костылев
    Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    3
    Симпатии:
    0

    Просьба не выражаться. А с такими «культурными» общаться желания нету. Про классы — да есть, RTF — можно — а в жизни, когда юзверю всё ни почём и он жалуется руководителю — надо в ворде — попробуй не сделать. Про поиск — попробуй найти хоть один пример. Две недели поиска — ничего реального. Тока запись в голый документ.


  10. 440Hz

    Команда форума
    Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    с вордом делал только вставку в готовый RTF (RTF открытый формат. можно поизголяться).
    с екселем классов море.

    1. require_once(‘../../texdoc.inc’);
    2. require_once(‘../../trash.inc’);
    3. require_once(‘../../../../oops/start.inc’);
    4.     echo pack(«ssssss», 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
    5. // Excel end of file footer
    6.     echo pack(«ss», 0x0A, 0x00);
    7. // Function to write a Number (double) into Row, Col
    8. function xlsWriteNumber($Row, $Col, $Value)
    9.     echo pack(«sssss», 0x203, 14, $Row, $Col, 0x0);
    10. // Function to write a label (text) into Row, Col
    11. function xlsWriteLabel($Row, $Col, $Value )
    12.     echo pack(«ssssss», 0x204, 8 + $L, $Row, $Col, 0x0, $L);
    13. header ( «Expires: Mon, 1 Apr 1974 05:00:00 GMT» );
    14. header ( «Last-Modified: « . gmdate(«D,d M YH:i:s») . » GMT» );
    15. header ( «Cache-Control: no-cache, must-revalidate» );
    16. header ( «Pragma: no-cache» );
    17. header ( «Content-type: application/x-msexcel» );
    18. header ( «Content-Disposition: attachment; filename=order.xls» );
    19. header ( «Content-Description: PHP Generated XLS Data» );
    20. xlsWriteLabel(0,0,«Производитель»);
    21. xlsWriteLabel(0,1,«Код»);
    22. xlsWriteLabel(0,2,«Описание»);
    23. xlsWriteLabel(0,3,«Кол-во»);
    24. xlsWriteLabel(0,4,«Цена»);
    25. xlsWriteLabel(0,5,«Всего»);
    26. foreach($DATA as $TK => $TV) {
    27.     xlsWriteLabel ($num,0,$TV->brand);
    28.     xlsWriteLabel ($num,1,$TV->code);
    29.     xlsWriteLabel ($num,2,$TV->name);
    30.     xlsWriteNumber($num,3,$TV->cnt);
    31.     xlsWriteLabel ($num,5,(number_format($TV->price/100*$TV->cnt,2)).»);
    32.     $TOT += $TV->price*$TV->cnt;
    33. xlsWriteLabel($num,0,‘ИТОГО’);

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


  11. Николай Костылев

    Николай Костылев
    Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    3
    Симпатии:
    0

    Если у кого-то есть практический пример решения такой задачи на платформе Linux (Ooo Calc, Ooo Writer, PHP, Java, JavaScript) — просьба поделиться примером.

  12. про ворд не знаю, никогда не приходилось такого делать, а вот про Excel после долгих поисков и разочарований пришел к PHPExcel.

    Логика там проста:
    — готовишь документ в памяти при помощи класса PHPExcel.
    — потом выбираешь один из 5 райтеров, который записывает его в нужный формат или отправляет пользаку- это одной строчкой.

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

    В комплекте есть ридеры и райтеры для Ex 2003, Ex 2007, CSV и Acrobat. Я добавил туда свой PostgresReader, который по SQL-запросу заполняет PHPExcel, а потом я его могу любым райтером выгрузить. И написал небольшой моторчик для работы с шаблонами. Пол года уже не знаю проблем. Главное достоинство- один интерфейс для все работает на *никсах.

  13. объем чего? памяти или документа

    вот простой примерчик, который иллюстрирует удобства PHPExcel

    это экселевский файл, который выступает в роли шаблона документов
    [​IMG]

    а это документ, который получается после того как над шаблоном немного поработает простенький шаблонизатор
    [​IMG]

    в принципе логика работы шаблонизатора понятна из картинок. Фишка тут в том, что все форматирование документа, то есть как он будет выглядеть в итоге производится в самом экселе (просто редактирую а потом сохраняю обычный экселевский файл). А из PHP только наполнение. К примеру, до PHPExcel я пользовался пировским Excel_spreadsheet_writer. Чтобы добиться там такого же форматирования как на картинке нужно было убить целый день.

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

    Еще если не нравится Эксель2007, можно сохранить в PDF. для этого нужно только поменять одну строчку, где выбирается райтер
    $writer= PHPExcel_IOFactory($excel, ‘Excel2007’) заменить на $writer= PHPExcel_IOFactory($excel, ‘PDF’)
    весь остальной код остается неизменным, потому что документ готовится в памяти и только в последний момент привязывается к какому- то конкретному формату, а все ридеры и райтеры, которые это делают, реализуют один интерфейс и отличаются только реализацией.


  14. Саня

    Саня
    Активный пользователь

    Алексей, если не затруднит прицепи свои доработки. Все будут только благодарны. И заранее спасибо

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

    если надо примеры и комментарии, то только по-позже, как немного разгребусь.

  16. А почему вы не хотите сохранить нужный шаблончик ехел документа в формате хмл с настройками фильтров, цветов, шрифтом и прочего и уже потом из пхп крутить и вертеть его как угодно? чем не вариант… а пользователю передать файл с расширением cls (если не ошибаюсь) и всё будет ровненько)


  17. Саня

    Саня
    Активный пользователь

    Под Юниксами я использовал php_writeexcel классы. Удобно.


  18. Mark32

    Mark32
    Активный пользователь

    С нами с:
    15 июн 2008
    Сообщения:
    539
    Симпатии:
    2

    440Hz
    кинь пример php2rtf пожалуйста.


  19. mistbow

    mistbow
    Активный пользователь

    С нами с:
    26 июн 2009
    Сообщения:
    1
    Симпатии:
    0

    Тоже появилась задача работы с RTF, XLS, PDF или подобными… лучше используя готовые шаблоны.

    получилось-таки реализовать не на виндах? ;-)

README

Latest Stable Version
Latest Unstable Version
License
Total Downloads
Monthly Downloads
Daily Downloads

Инструкция на русском языке (Russian)

It’s PHP Spreadsheet extension that allows you to export excel files from an excel template.
Using the extension you don’t need to create excel files from scratch using code, set styles and so on.

Demo screenshot:

Demo

Simple example

There is a simplest example of how this might look (using less code).
Suppose we have an excel file with the following template variables:

Template

The code will be as follows:

use tangwei666PhpExcelTemplatorPhpExcelTemplator;
require_once('vendor/autoload.php'); // if you don't use framework

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
]);

As a result, we get:

Exported file

Using this extension, we just create a template file with the styles we need and specify template variables in it. In the code, we just pass the parameters to template variables.

Features

  • We can insert several template variables in one table cell (if the data type is «string»)
  • We can insert a one-dimensional array, in this case additional rows will be created in the table
  • We can insert a two-dimensional array, in this case the respective columns and rows are created in the table
  • By specifying the value in the cells, you can change the styles of these cells, even when inserting arrays
  • We can apply the same template on several sheets of the table

Features demo and usage examples are given in the folder «samples».

Restrictions:

  • Possible so-called side effects when using one-dimensional or two-dimensional arrays in one sheet. Especially when it is located asymmetrically. An example of side effects is also given in the folder «samples».

INSTALLATION:

$ composer require tangwei666/php-excel-templator

Template variable naming rules

The rules can be any, but I can offer my recommendation for naming template variables:

  • {var_name} — for string values
  • [var_name] — for one-dimensional arrays
  • [[var_name]] — for two-dimensional arrays

How to insert a one-dimensional array, so that the table create columns, not rows?

To do this, instead of a one-dimensional array, insert a two-dimensional one as follows:

$param['[[var_name]]'] = [['text 1', 'text 2', 'text 3']];

Using setters

In the example above, the minimum code without setters was used.
The data types (for example: a string, a one-dimensional array, or a two-dimensional array) in this code is automatically recognized and the necessary setter is chose.
But if we want to use a specific setter, the same code will look like this:

use tangwei666PhpExcelTemplatorPhpExcelTemplator;
use tangwei666PhpExcelTemplatorparamsExcelParam;
use tangwei666PhpExcelTemplatorparamsCallbackParam;
use tangwei666PhpExcelTemplatorsettersCellSetterStringValue;

require_once('vendor/autoload.php'); // if you don't use framework

$params = [
	'{current_date}' => new ExcelParam(CellSetterStringValue::class, date('d-m-Y')),
	'{department}' => new ExcelParam(CellSetterStringValue::class, 'Sales department'),
];
PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', $params);

At the moment the extension has 3 kinds of setters:

  • CellSetterStringValue (for string values)
  • CellSetterArrayValue (for one-dimensional arrays)
  • CellSetterArray2DValue (for two-dimensional arrays)

You ask, what for specify setters explicitly?

  • First, because it’s flexible: let’s say you want to create your own setter with your own algorithms that eliminate the side effects, which I mentioned above.
  • Secondly, in each setter, you can pass a callback function in which we can change the styles of the inserted cells. For example, you need to highlight with bold font the employees who made the best sales in this month.

Examples of code that uses all kinds of setters are listed in the folder «samples».

How to set styles without setters?

In most cases to use the setters explicitly is not so convenient. I suppose you want to use minimum code. Therefore, I made it possible to set styles without using setters:

use tangwei666PhpExcelTemplatorPhpExcelTemplator;
use tangwei666PhpExcelTemplatorparamsCallbackParam;
require_once('vendor/autoload.php'); // if you don't use framework

$params = [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
	'[sales_amount]' => [
		'10230',
		'45100',
		'70500',
	],
];

$callbacks = [
	'[sales_amount]' => function(CallbackParam $param) {
		$amount = $param->param[$param->row_index];
		if ($amount > 50000) {
			$cell_coordinate = $param->coordinate;
			$param->sheet->getStyle($cell_coordinate)->getFont()->setBold(true);
		}
	},
];

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', $params, $callbacks);

Special setter for special templates (CellSetterArrayValueSpecial)

There are special templates, which require to insert the whole row, and not insert cell with shifting down. Moreover, it’s required to merge cells, as well as the cell in which there was a template variable.

Special template

For these templates, a special setter has been created: CellSetterArrayValueSpecial. Examples of code that uses it is given in folder: samples/8_special_template.

Events

The following are possible events and an explanation of why they can be applied:

$events = [
    PhpExcelTemplator::BEFORE_INSERT_PARAMS => function(Worksheet $sheet, array $templateVarsArr) {
        // fires before inserting values into template variables        
    },
    PhpExcelTemplator::AFTER_INSERT_PARAMS => function(Worksheet $sheet, array $templateVarsArr) {
        // fires after inserting values into template variables.
        // It is used if you want to insert values​into a spreadsheet after columns and rows have been created. 
        // For example, when inserting an array of images.
        // If you insert images using $callbacks, then the images can shift to the right due to the fact that on the next line the template variable can create additional columns.
        // See an example: samples/10_images        
    },
    PhpExcelTemplator::BEFORE_SAVE => function(Spreadsheet $spreadsheet, IWriter $writer) {
        // fires before saving to a file. It is used when you need to modify the $writer or $spreadsheet object before saving, for example, $writer->setPreCalculateFormulas(false);        
    },
];
$callbacks = [];
$templateFile = './template.xlsx';
$fileName = './exported_file.xlsx';
$params = [
	// ...
];

PhpExcelTemplator::saveToFile($templateFile, $fileName, $params, $callbacks, $events);

Like this post? Please share to your friends:
  • Php excel на страницу
  • Php excel выпадающий список
  • Php excel в массиве
  • Php excel без библиотек
  • Php excel with csv