У меня есть шаблон Excel (xls) с данными примера. Мне нужно подготовить файл Excel с динамически генерируемыми данными.
Во-первых, я сделал XML-файл из соответствующих xls. Файл XML выглядит так:
<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>Op</Author> <LastAuthor>ufoq</LastAuthor> <Created>2011-11-18T06:54:25Z</Created> <LastSaved>2011-12-05T11:43:26Z</LastSaved> <Version>11.9999</Version> </DocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>9750</WindowHeight> <WindowWidth>23310</WindowWidth> <WindowTopX>480</WindowTopX> <WindowTopY>405</WindowTopY> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font x:CharSet="238" x:Family="Swiss" ss:Size="8" ss:Color="#000000"/> <Interior/> <NumberFormat/> ......
Теперь я разместил этот контент в представлении symfony и заполнил его своими сгенерированными данными. Мне нужно выводить в формате XML-файла, но я не знаю, как это сделать. Новый файл должен иметь ту же структуру, что и файл шаблона, поэтому я не могу создать новый файл с нуля.
Похоже, у вас есть документы в формате openxml, которые вы можете обрабатывать с помощью библиотеки PHPExcel .
Если вы просто хотите заменить некоторые простые значения в своем шаблоне, вы также можете использовать DOMDocument и DOMXPath для обработки XML-документа, например
<?php $doc = new DOMDocument; $doc->loadxml( getData() ); $xpath = new DOMXPath($doc); $xpath->registerNamespace('o', "urn:schemas-microsoft-com:office:office"); $xpath->registerNamespace('x', "urn:schemas-microsoft-com:office:excel"); $xpath->registerNamespace('ss', "urn:schemas-microsoft-com:office:spreadsheet"); $xpath->registerNamespace('html', "http://www.w3.org/TR/REC-html40"); foreach( $xpath->query('/ss:Workbook/o:DocumentProperties/o:LastAuthor') as $n ) { //echo '.'; $text = $doc->createTextnode('SO Test'); $n->replaceChild($text, $n->firstChild); } echo $doc->savexml(); function getData() { return <<< eox <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>Op</Author> <LastAuthor>ufoq</LastAuthor> <Created>2011-11-18T06:54:25Z</Created> <LastSaved>2011-12-05T11:43:26Z</LastSaved> <Version>11.9999</Version> </DocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>9750</WindowHeight> <WindowWidth>23310</WindowWidth> <WindowTopX>480</WindowTopX> <WindowTopY>405</WindowTopY> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font x:CharSet="238" x:Family="Swiss" ss:Size="8" ss:Color="#000000"/> <Interior/> <NumberFormat/> [...] </Style> </Styles> </Workbook> eox; }
электронная<?php $doc = new DOMDocument; $doc->loadxml( getData() ); $xpath = new DOMXPath($doc); $xpath->registerNamespace('o', "urn:schemas-microsoft-com:office:office"); $xpath->registerNamespace('x', "urn:schemas-microsoft-com:office:excel"); $xpath->registerNamespace('ss', "urn:schemas-microsoft-com:office:spreadsheet"); $xpath->registerNamespace('html', "http://www.w3.org/TR/REC-html40"); foreach( $xpath->query('/ss:Workbook/o:DocumentProperties/o:LastAuthor') as $n ) { //echo '.'; $text = $doc->createTextnode('SO Test'); $n->replaceChild($text, $n->firstChild); } echo $doc->savexml(); function getData() { return <<< eox <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>Op</Author> <LastAuthor>ufoq</LastAuthor> <Created>2011-11-18T06:54:25Z</Created> <LastSaved>2011-12-05T11:43:26Z</LastSaved> <Version>11.9999</Version> </DocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>9750</WindowHeight> <WindowWidth>23310</WindowWidth> <WindowTopX>480</WindowTopX> <WindowTopY>405</WindowTopY> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font x:CharSet="238" x:Family="Swiss" ss:Size="8" ss:Color="#000000"/> <Interior/> <NumberFormat/> [...] </Style> </Styles> </Workbook> eox; }
update: Если вы хотите, чтобы клиент распознал тип файла, вам нужно установить тип контента (mime) в значение approriate, см. Типы MIME формата Office 2007 для потоковой передачи HTTP-контента . Например
$spreadsheet = new DOMDocument; $spreadsheet->loadxml(getData()); someProcessing($spreadsheet); if ( headers_sent() ) { die('error: headers already sent'); } header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); echo $spreadsheet->save('php://output');