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

Цель: используя шаблон создать таблицу товаров для поставщика.
Средства: PHP5, PHPExcel.
Решение: о нем подробнее.



Для начала стоит определится с типами данных которые мы хотим обработать. Предположим что нам нужны строковые значения (пусть будут %key%), цифровые (%key%) и табличные строки (%row.row_name%).
Подготовим шаблон. Для примера я возьму просто файл с хаотично записанными данными в формате MS Excel 2003 (ВАЖНО!).
Вот изображение файла и сам файл. Теперь осталось дело за малым.

Подключаем PHPExcel и вызываем заполнялку шаблона
ini_set('include_path', ini_get('include_path').';'.dirname(__FILE__) . '/PHPExcel/');

include_once dirname(__FILE__) . '/PHPExcel/PHPExcel.php';
include_once dirname(__FILE__) . '/PHPExcel.addon.php';

print ""; PHPExcelAddon::convert (dirname(__FILE__).'/sample2.xls',array ( 'test'=>111, 'test.data'=>222, 'row.t'=>array (1,2,3,4,5), 'row.d'=>array (11,22,33,44,55), )); </code> Наш класс в файле PHPExcel.addon.php <code> class PHPExcelAddon { public function __construct () { } public static function convert ($file, $data=array ()) { $objPHPExcel = PHPExcel_IOFactory::load( $file ); $objPHPExcel->setActiveSheetIndex(0); $aSheet = $objPHPExcel->getActiveSheet(); /* * Всякая стандартная лабуда */ $objPHPExcel->getProperties()->setCreator("Maarten Balliauw"); $objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw"); $objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document"); $objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document"); $objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes."); // Получим итератор строки и пройдемся по нему циклом foreach($aSheet->getRowIterator() as $row){ // Получим итератор ячеек текущей строки $cellIterator = $row->getCellIterator(); // Пройдемся циклом по ячейкам строки foreach($cellIterator as $cell){ // Берем значение ячейки $val = $cell->getValue(); // Проверяем содержит ли ячейка указатель на динамические данные шаблона (то что внутри %%) // Если да, то обрабатываем и заносим инфу if (preg_match( "#^%([^%]+)%$#sei", $val, $match )) { $column = $cell->getColumn (); $row = $cell->getRow (); $key_insert = $match['1']; print 'key '. $key_insert." \r\n"; // Если строка пишем как строку if (isset ($data[$key_insert]) AND is_string ($data[$key_insert])) { print 'set string value '.$data[$key_insert]." \r\n"; $cell->setValue ($data[$key_insert]); } // Заполняем строки дублируя стили else if (isset ($data[$key_insert]) AND is_array ($data[$key_insert])) { // взяли стиль ячейки $crew_template = $aSheet->getStyle($column.$row); foreach ($data[$key_insert] as $_colVal) { // применили стиль ячейки/ячеек $aSheet->duplicateStyle($crew_template,$column.$row); print 'set row value '.$column.$row.' = '.$_colVal." \r\n"; $objPHPExcel->getActiveSheet()->SetCellValue($column.$row, $_colVal); $row = $row+1; } } // Если цифра else if (isset ($data[$key_insert]) AND is_numeric ($data[$key_insert])) { print 'set number value '.$data[$key_insert]." \r\n"; // @TODO может кому то потребовать указать тип ячейки как цифровой $cell->setValue ($data[$key_insert]); } // Если любая другая else if (isset ($data[$key_insert])) { print 'set value '.$data[$key_insert]." \r\n"; $objPHPExcel->getActiveSheet()->getStyle('C'.$i)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT); $cell->setValue ($data[$key_insert]); } // Если данный ключ шаблона не передан в нашу заполнялку else { print "key value is empty \r\n"; } //var_dump ($cell); } } } // При желании можем изменить имя активного листа )) //$objPHPExcel->getActiveSheet()->setTitle('ThisIsХорошо'); // Тут мы просто записываем файл $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter->save(dirname($file).'/file.xlsx'); // Говорим буферу и классу Давайдосвидания $objPHPExcel->disconnectWorksheets(); unset($objPHPExcel); } } </code> Результат <a href="http://uppix.net/1/c/9/4214f3443ae06ac714cb5e9994d3e.png" target="_blank">изображение файла</a> и сам <a href="http://dl.free.fr/p0gf243Fk" target="_blank">файл</a>. В целом задача решается довольно просто. Но до простого бывает не всем легко додуматься, особенно когда перероешь кучу информации и нигде похожего не найдешь ( Надеюсь было интересно и полезно. P.S. ООП и прочие штучки опустил для упрощения кода. Все же концепт должен быть идеей а не готовым решением.