PageRenderTime 75ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/include/PHPExcel/Writer/Excel2007/Worksheet.php

https://bitbucket.org/sleininger/stock_online
PHP | 1135 lines | 659 code | 156 blank | 320 comment | 171 complexity | d7f3c108f9e3fdc1fd4386b9f89b8132 MD5 | raw file
Possible License(s): LGPL-3.0, LGPL-2.1, GPL-3.0
  1. <?php
  2. /**
  3. * PHPExcel
  4. *
  5. * Copyright (c) 2006 - 2012 PHPExcel
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * @category PHPExcel
  22. * @package PHPExcel_Writer_Excel2007
  23. * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
  24. * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
  25. * @version 1.7.7, 2012-05-19
  26. */
  27. /**
  28. * PHPExcel_Writer_Excel2007_Worksheet
  29. *
  30. * @category PHPExcel
  31. * @package PHPExcel_Writer_Excel2007
  32. * @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
  33. */
  34. class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_WriterPart
  35. {
  36. /**
  37. * Write worksheet to XML format
  38. *
  39. * @param PHPExcel_Worksheet $pSheet
  40. * @param string[] $pStringTable
  41. * @param boolean $includeCharts Flag indicating if we should write charts
  42. * @return string XML Output
  43. * @throws Exception
  44. */
  45. public function writeWorksheet($pSheet = null, $pStringTable = null, $includeCharts = FALSE)
  46. {
  47. if (!is_null($pSheet)) {
  48. // Create XML writer
  49. $objWriter = null;
  50. if ($this->getParentWriter()->getUseDiskCaching()) {
  51. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  52. } else {
  53. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
  54. }
  55. // XML header
  56. $objWriter->startDocument('1.0','UTF-8','yes');
  57. // Worksheet
  58. $objWriter->startElement('worksheet');
  59. $objWriter->writeAttribute('xml:space', 'preserve');
  60. $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
  61. $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
  62. // sheetPr
  63. $this->_writeSheetPr($objWriter, $pSheet);
  64. // Dimension
  65. $this->_writeDimension($objWriter, $pSheet);
  66. // sheetViews
  67. $this->_writeSheetViews($objWriter, $pSheet);
  68. // sheetFormatPr
  69. $this->_writeSheetFormatPr($objWriter, $pSheet);
  70. // cols
  71. $this->_writeCols($objWriter, $pSheet);
  72. // sheetData
  73. $this->_writeSheetData($objWriter, $pSheet, $pStringTable);
  74. // sheetProtection
  75. $this->_writeSheetProtection($objWriter, $pSheet);
  76. // protectedRanges
  77. $this->_writeProtectedRanges($objWriter, $pSheet);
  78. // autoFilter
  79. $this->_writeAutoFilter($objWriter, $pSheet);
  80. // mergeCells
  81. $this->_writeMergeCells($objWriter, $pSheet);
  82. // conditionalFormatting
  83. $this->_writeConditionalFormatting($objWriter, $pSheet);
  84. // dataValidations
  85. $this->_writeDataValidations($objWriter, $pSheet);
  86. // hyperlinks
  87. $this->_writeHyperlinks($objWriter, $pSheet);
  88. // Print options
  89. $this->_writePrintOptions($objWriter, $pSheet);
  90. // Page margins
  91. $this->_writePageMargins($objWriter, $pSheet);
  92. // Page setup
  93. $this->_writePageSetup($objWriter, $pSheet);
  94. // Header / footer
  95. $this->_writeHeaderFooter($objWriter, $pSheet);
  96. // Breaks
  97. $this->_writeBreaks($objWriter, $pSheet);
  98. // Drawings and/or Charts
  99. $this->_writeDrawings($objWriter, $pSheet, $includeCharts);
  100. // LegacyDrawing
  101. $this->_writeLegacyDrawing($objWriter, $pSheet);
  102. // LegacyDrawingHF
  103. $this->_writeLegacyDrawingHF($objWriter, $pSheet);
  104. $objWriter->endElement();
  105. // Return
  106. return $objWriter->getData();
  107. } else {
  108. throw new Exception("Invalid PHPExcel_Worksheet object passed.");
  109. }
  110. }
  111. /**
  112. * Write SheetPr
  113. *
  114. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  115. * @param PHPExcel_Worksheet $pSheet Worksheet
  116. * @throws Exception
  117. */
  118. private function _writeSheetPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  119. {
  120. // sheetPr
  121. $objWriter->startElement('sheetPr');
  122. //$objWriter->writeAttribute('codeName', $pSheet->getTitle());
  123. // tabColor
  124. if ($pSheet->isTabColorSet()) {
  125. $objWriter->startElement('tabColor');
  126. $objWriter->writeAttribute('rgb', $pSheet->getTabColor()->getARGB());
  127. $objWriter->endElement();
  128. }
  129. // outlinePr
  130. $objWriter->startElement('outlinePr');
  131. $objWriter->writeAttribute('summaryBelow', ($pSheet->getShowSummaryBelow() ? '1' : '0'));
  132. $objWriter->writeAttribute('summaryRight', ($pSheet->getShowSummaryRight() ? '1' : '0'));
  133. $objWriter->endElement();
  134. // pageSetUpPr
  135. if ($pSheet->getPageSetup()->getFitToPage()) {
  136. $objWriter->startElement('pageSetUpPr');
  137. $objWriter->writeAttribute('fitToPage', '1');
  138. $objWriter->endElement();
  139. }
  140. $objWriter->endElement();
  141. }
  142. /**
  143. * Write Dimension
  144. *
  145. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  146. * @param PHPExcel_Worksheet $pSheet Worksheet
  147. * @throws Exception
  148. */
  149. private function _writeDimension(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  150. {
  151. // dimension
  152. $objWriter->startElement('dimension');
  153. $objWriter->writeAttribute('ref', $pSheet->calculateWorksheetDimension());
  154. $objWriter->endElement();
  155. }
  156. /**
  157. * Write SheetViews
  158. *
  159. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  160. * @param PHPExcel_Worksheet $pSheet Worksheet
  161. * @throws Exception
  162. */
  163. private function _writeSheetViews(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  164. {
  165. // sheetViews
  166. $objWriter->startElement('sheetViews');
  167. // Sheet selected?
  168. $sheetSelected = false;
  169. if ($this->getParentWriter()->getPHPExcel()->getIndex($pSheet) == $this->getParentWriter()->getPHPExcel()->getActiveSheetIndex())
  170. $sheetSelected = true;
  171. // sheetView
  172. $objWriter->startElement('sheetView');
  173. $objWriter->writeAttribute('tabSelected', $sheetSelected ? '1' : '0');
  174. $objWriter->writeAttribute('workbookViewId', '0');
  175. // Zoom scales
  176. if ($pSheet->getSheetView()->getZoomScale() != 100) {
  177. $objWriter->writeAttribute('zoomScale', $pSheet->getSheetView()->getZoomScale());
  178. }
  179. if ($pSheet->getSheetView()->getZoomScaleNormal() != 100) {
  180. $objWriter->writeAttribute('zoomScaleNormal', $pSheet->getSheetView()->getZoomScaleNormal());
  181. }
  182. // Gridlines
  183. if ($pSheet->getShowGridlines()) {
  184. $objWriter->writeAttribute('showGridLines', 'true');
  185. } else {
  186. $objWriter->writeAttribute('showGridLines', 'false');
  187. }
  188. // Row and column headers
  189. if ($pSheet->getShowRowColHeaders()) {
  190. $objWriter->writeAttribute('showRowColHeaders', '1');
  191. } else {
  192. $objWriter->writeAttribute('showRowColHeaders', '0');
  193. }
  194. // Right-to-left
  195. if ($pSheet->getRightToLeft()) {
  196. $objWriter->writeAttribute('rightToLeft', 'true');
  197. }
  198. $activeCell = $pSheet->getActiveCell();
  199. // Pane
  200. $pane = '';
  201. $topLeftCell = $pSheet->getFreezePane();
  202. if (($topLeftCell != '') && ($topLeftCell != 'A1')) {
  203. $activeCell = $topLeftCell;
  204. // Calculate freeze coordinates
  205. $xSplit = $ySplit = 0;
  206. list($xSplit, $ySplit) = PHPExcel_Cell::coordinateFromString($topLeftCell);
  207. $xSplit = PHPExcel_Cell::columnIndexFromString($xSplit);
  208. // pane
  209. $pane = 'topRight';
  210. $objWriter->startElement('pane');
  211. if ($xSplit > 1)
  212. $objWriter->writeAttribute('xSplit', $xSplit - 1);
  213. if ($ySplit > 1) {
  214. $objWriter->writeAttribute('ySplit', $ySplit - 1);
  215. $pane = ($xSplit > 1) ? 'bottomRight' : 'bottomLeft';
  216. }
  217. $objWriter->writeAttribute('topLeftCell', $topLeftCell);
  218. $objWriter->writeAttribute('activePane', $pane);
  219. $objWriter->writeAttribute('state', 'frozen');
  220. $objWriter->endElement();
  221. if (($xSplit > 1) && ($ySplit > 1)) {
  222. // Write additional selections if more than two panes (ie both an X and a Y split)
  223. $objWriter->startElement('selection'); $objWriter->writeAttribute('pane', 'topRight'); $objWriter->endElement();
  224. $objWriter->startElement('selection'); $objWriter->writeAttribute('pane', 'bottomLeft'); $objWriter->endElement();
  225. }
  226. }
  227. // Selection
  228. // if ($pane != '') {
  229. // Only need to write selection element if we have a split pane
  230. // We cheat a little by over-riding the active cell selection, setting it to the split cell
  231. $objWriter->startElement('selection');
  232. if ($pane != '') {
  233. $objWriter->writeAttribute('pane', $pane);
  234. }
  235. $objWriter->writeAttribute('activeCell', $activeCell);
  236. $objWriter->writeAttribute('sqref', $activeCell);
  237. $objWriter->endElement();
  238. // }
  239. $objWriter->endElement();
  240. $objWriter->endElement();
  241. }
  242. /**
  243. * Write SheetFormatPr
  244. *
  245. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  246. * @param PHPExcel_Worksheet $pSheet Worksheet
  247. * @throws Exception
  248. */
  249. private function _writeSheetFormatPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  250. {
  251. // sheetFormatPr
  252. $objWriter->startElement('sheetFormatPr');
  253. // Default row height
  254. if ($pSheet->getDefaultRowDimension()->getRowHeight() >= 0) {
  255. $objWriter->writeAttribute('customHeight', 'true');
  256. $objWriter->writeAttribute('defaultRowHeight', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultRowDimension()->getRowHeight()));
  257. } else {
  258. $objWriter->writeAttribute('defaultRowHeight', '14.4');
  259. }
  260. // Default column width
  261. if ($pSheet->getDefaultColumnDimension()->getWidth() >= 0) {
  262. $objWriter->writeAttribute('defaultColWidth', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultColumnDimension()->getWidth()));
  263. }
  264. // Outline level - row
  265. $outlineLevelRow = 0;
  266. foreach ($pSheet->getRowDimensions() as $dimension) {
  267. if ($dimension->getOutlineLevel() > $outlineLevelRow) {
  268. $outlineLevelRow = $dimension->getOutlineLevel();
  269. }
  270. }
  271. $objWriter->writeAttribute('outlineLevelRow', (int)$outlineLevelRow);
  272. // Outline level - column
  273. $outlineLevelCol = 0;
  274. foreach ($pSheet->getColumnDimensions() as $dimension) {
  275. if ($dimension->getOutlineLevel() > $outlineLevelCol) {
  276. $outlineLevelCol = $dimension->getOutlineLevel();
  277. }
  278. }
  279. $objWriter->writeAttribute('outlineLevelCol', (int)$outlineLevelCol);
  280. $objWriter->endElement();
  281. }
  282. /**
  283. * Write Cols
  284. *
  285. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  286. * @param PHPExcel_Worksheet $pSheet Worksheet
  287. * @throws Exception
  288. */
  289. private function _writeCols(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  290. {
  291. // cols
  292. if (count($pSheet->getColumnDimensions()) > 0) {
  293. $objWriter->startElement('cols');
  294. $pSheet->calculateColumnWidths();
  295. // Loop through column dimensions
  296. foreach ($pSheet->getColumnDimensions() as $colDimension) {
  297. // col
  298. $objWriter->startElement('col');
  299. $objWriter->writeAttribute('min', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));
  300. $objWriter->writeAttribute('max', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));
  301. if ($colDimension->getWidth() < 0) {
  302. // No width set, apply default of 10
  303. $objWriter->writeAttribute('width', '9.10');
  304. } else {
  305. // Width set
  306. $objWriter->writeAttribute('width', PHPExcel_Shared_String::FormatNumber($colDimension->getWidth()));
  307. }
  308. // Column visibility
  309. if ($colDimension->getVisible() == false) {
  310. $objWriter->writeAttribute('hidden', 'true');
  311. }
  312. // Auto size?
  313. if ($colDimension->getAutoSize()) {
  314. $objWriter->writeAttribute('bestFit', 'true');
  315. }
  316. // Custom width?
  317. if ($colDimension->getWidth() != $pSheet->getDefaultColumnDimension()->getWidth()) {
  318. $objWriter->writeAttribute('customWidth', 'true');
  319. }
  320. // Collapsed
  321. if ($colDimension->getCollapsed() == true) {
  322. $objWriter->writeAttribute('collapsed', 'true');
  323. }
  324. // Outline level
  325. if ($colDimension->getOutlineLevel() > 0) {
  326. $objWriter->writeAttribute('outlineLevel', $colDimension->getOutlineLevel());
  327. }
  328. // Style
  329. $objWriter->writeAttribute('style', $colDimension->getXfIndex());
  330. $objWriter->endElement();
  331. }
  332. $objWriter->endElement();
  333. }
  334. }
  335. /**
  336. * Write SheetProtection
  337. *
  338. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  339. * @param PHPExcel_Worksheet $pSheet Worksheet
  340. * @throws Exception
  341. */
  342. private function _writeSheetProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  343. {
  344. // sheetProtection
  345. $objWriter->startElement('sheetProtection');
  346. if ($pSheet->getProtection()->getPassword() != '') {
  347. $objWriter->writeAttribute('password', $pSheet->getProtection()->getPassword());
  348. }
  349. $objWriter->writeAttribute('sheet', ($pSheet->getProtection()->getSheet() ? 'true' : 'false'));
  350. $objWriter->writeAttribute('objects', ($pSheet->getProtection()->getObjects() ? 'true' : 'false'));
  351. $objWriter->writeAttribute('scenarios', ($pSheet->getProtection()->getScenarios() ? 'true' : 'false'));
  352. $objWriter->writeAttribute('formatCells', ($pSheet->getProtection()->getFormatCells() ? 'true' : 'false'));
  353. $objWriter->writeAttribute('formatColumns', ($pSheet->getProtection()->getFormatColumns() ? 'true' : 'false'));
  354. $objWriter->writeAttribute('formatRows', ($pSheet->getProtection()->getFormatRows() ? 'true' : 'false'));
  355. $objWriter->writeAttribute('insertColumns', ($pSheet->getProtection()->getInsertColumns() ? 'true' : 'false'));
  356. $objWriter->writeAttribute('insertRows', ($pSheet->getProtection()->getInsertRows() ? 'true' : 'false'));
  357. $objWriter->writeAttribute('insertHyperlinks', ($pSheet->getProtection()->getInsertHyperlinks() ? 'true' : 'false'));
  358. $objWriter->writeAttribute('deleteColumns', ($pSheet->getProtection()->getDeleteColumns() ? 'true' : 'false'));
  359. $objWriter->writeAttribute('deleteRows', ($pSheet->getProtection()->getDeleteRows() ? 'true' : 'false'));
  360. $objWriter->writeAttribute('selectLockedCells', ($pSheet->getProtection()->getSelectLockedCells() ? 'true' : 'false'));
  361. $objWriter->writeAttribute('sort', ($pSheet->getProtection()->getSort() ? 'true' : 'false'));
  362. $objWriter->writeAttribute('autoFilter', ($pSheet->getProtection()->getAutoFilter() ? 'true' : 'false'));
  363. $objWriter->writeAttribute('pivotTables', ($pSheet->getProtection()->getPivotTables() ? 'true' : 'false'));
  364. $objWriter->writeAttribute('selectUnlockedCells', ($pSheet->getProtection()->getSelectUnlockedCells() ? 'true' : 'false'));
  365. $objWriter->endElement();
  366. }
  367. /**
  368. * Write ConditionalFormatting
  369. *
  370. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  371. * @param PHPExcel_Worksheet $pSheet Worksheet
  372. * @throws Exception
  373. */
  374. private function _writeConditionalFormatting(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  375. {
  376. // Conditional id
  377. $id = 1;
  378. // Loop through styles in the current worksheet
  379. foreach ($pSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) {
  380. foreach ($conditionalStyles as $conditional) {
  381. // WHY was this again?
  382. // if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() ) == '') {
  383. // continue;
  384. // }
  385. if ($conditional->getConditionType() != PHPExcel_Style_Conditional::CONDITION_NONE) {
  386. // conditionalFormatting
  387. $objWriter->startElement('conditionalFormatting');
  388. $objWriter->writeAttribute('sqref', $cellCoordinate);
  389. // cfRule
  390. $objWriter->startElement('cfRule');
  391. $objWriter->writeAttribute('type', $conditional->getConditionType());
  392. $objWriter->writeAttribute('dxfId', $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() ));
  393. $objWriter->writeAttribute('priority', $id++);
  394. if (($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS
  395. ||
  396. $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT)
  397. && $conditional->getOperatorType() != PHPExcel_Style_Conditional::OPERATOR_NONE) {
  398. $objWriter->writeAttribute('operator', $conditional->getOperatorType());
  399. }
  400. if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
  401. && !is_null($conditional->getText())) {
  402. $objWriter->writeAttribute('text', $conditional->getText());
  403. }
  404. if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
  405. && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT
  406. && !is_null($conditional->getText())) {
  407. $objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . ')))');
  408. } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
  409. && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BEGINSWITH
  410. && !is_null($conditional->getText())) {
  411. $objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"');
  412. } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
  413. && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_ENDSWITH
  414. && !is_null($conditional->getText())) {
  415. $objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"');
  416. } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
  417. && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_NOTCONTAINS
  418. && !is_null($conditional->getText())) {
  419. $objWriter->writeElement('formula', 'ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . '))');
  420. } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS
  421. || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
  422. || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) {
  423. foreach ($conditional->getConditions() as $formula) {
  424. // Formula
  425. $objWriter->writeElement('formula', $formula);
  426. }
  427. }
  428. $objWriter->endElement();
  429. $objWriter->endElement();
  430. }
  431. }
  432. }
  433. }
  434. /**
  435. * Write DataValidations
  436. *
  437. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  438. * @param PHPExcel_Worksheet $pSheet Worksheet
  439. * @throws Exception
  440. */
  441. private function _writeDataValidations(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  442. {
  443. // Datavalidation collection
  444. $dataValidationCollection = $pSheet->getDataValidationCollection();
  445. // Write data validations?
  446. if (!empty($dataValidationCollection)) {
  447. $objWriter->startElement('dataValidations');
  448. $objWriter->writeAttribute('count', count($dataValidationCollection));
  449. foreach ($dataValidationCollection as $coordinate => $dv) {
  450. $objWriter->startElement('dataValidation');
  451. if ($dv->getType() != '') {
  452. $objWriter->writeAttribute('type', $dv->getType());
  453. }
  454. if ($dv->getErrorStyle() != '') {
  455. $objWriter->writeAttribute('errorStyle', $dv->getErrorStyle());
  456. }
  457. if ($dv->getOperator() != '') {
  458. $objWriter->writeAttribute('operator', $dv->getOperator());
  459. }
  460. $objWriter->writeAttribute('allowBlank', ($dv->getAllowBlank() ? '1' : '0'));
  461. $objWriter->writeAttribute('showDropDown', (!$dv->getShowDropDown() ? '1' : '0'));
  462. $objWriter->writeAttribute('showInputMessage', ($dv->getShowInputMessage() ? '1' : '0'));
  463. $objWriter->writeAttribute('showErrorMessage', ($dv->getShowErrorMessage() ? '1' : '0'));
  464. if ($dv->getErrorTitle() !== '') {
  465. $objWriter->writeAttribute('errorTitle', $dv->getErrorTitle());
  466. }
  467. if ($dv->getError() !== '') {
  468. $objWriter->writeAttribute('error', $dv->getError());
  469. }
  470. if ($dv->getPromptTitle() !== '') {
  471. $objWriter->writeAttribute('promptTitle', $dv->getPromptTitle());
  472. }
  473. if ($dv->getPrompt() !== '') {
  474. $objWriter->writeAttribute('prompt', $dv->getPrompt());
  475. }
  476. $objWriter->writeAttribute('sqref', $coordinate);
  477. if ($dv->getFormula1() !== '') {
  478. $objWriter->writeElement('formula1', $dv->getFormula1());
  479. }
  480. if ($dv->getFormula2() !== '') {
  481. $objWriter->writeElement('formula2', $dv->getFormula2());
  482. }
  483. $objWriter->endElement();
  484. }
  485. $objWriter->endElement();
  486. }
  487. }
  488. /**
  489. * Write Hyperlinks
  490. *
  491. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  492. * @param PHPExcel_Worksheet $pSheet Worksheet
  493. * @throws Exception
  494. */
  495. private function _writeHyperlinks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  496. {
  497. // Hyperlink collection
  498. $hyperlinkCollection = $pSheet->getHyperlinkCollection();
  499. // Relation ID
  500. $relationId = 1;
  501. // Write hyperlinks?
  502. if (!empty($hyperlinkCollection)) {
  503. $objWriter->startElement('hyperlinks');
  504. foreach ($hyperlinkCollection as $coordinate => $hyperlink) {
  505. $objWriter->startElement('hyperlink');
  506. $objWriter->writeAttribute('ref', $coordinate);
  507. if (!$hyperlink->isInternal()) {
  508. $objWriter->writeAttribute('r:id', 'rId_hyperlink_' . $relationId);
  509. ++$relationId;
  510. } else {
  511. $objWriter->writeAttribute('location', str_replace('sheet://', '', $hyperlink->getUrl()));
  512. }
  513. if ($hyperlink->getTooltip() != '') {
  514. $objWriter->writeAttribute('tooltip', $hyperlink->getTooltip());
  515. }
  516. $objWriter->endElement();
  517. }
  518. $objWriter->endElement();
  519. }
  520. }
  521. /**
  522. * Write ProtectedRanges
  523. *
  524. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  525. * @param PHPExcel_Worksheet $pSheet Worksheet
  526. * @throws Exception
  527. */
  528. private function _writeProtectedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  529. {
  530. if (count($pSheet->getProtectedCells()) > 0) {
  531. // protectedRanges
  532. $objWriter->startElement('protectedRanges');
  533. // Loop protectedRanges
  534. foreach ($pSheet->getProtectedCells() as $protectedCell => $passwordHash) {
  535. // protectedRange
  536. $objWriter->startElement('protectedRange');
  537. $objWriter->writeAttribute('name', 'p' . md5($protectedCell));
  538. $objWriter->writeAttribute('sqref', $protectedCell);
  539. $objWriter->writeAttribute('password', $passwordHash);
  540. $objWriter->endElement();
  541. }
  542. $objWriter->endElement();
  543. }
  544. }
  545. /**
  546. * Write MergeCells
  547. *
  548. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  549. * @param PHPExcel_Worksheet $pSheet Worksheet
  550. * @throws Exception
  551. */
  552. private function _writeMergeCells(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  553. {
  554. if (count($pSheet->getMergeCells()) > 0) {
  555. // mergeCells
  556. $objWriter->startElement('mergeCells');
  557. // Loop mergeCells
  558. foreach ($pSheet->getMergeCells() as $mergeCell) {
  559. // mergeCell
  560. $objWriter->startElement('mergeCell');
  561. $objWriter->writeAttribute('ref', $mergeCell);
  562. $objWriter->endElement();
  563. }
  564. $objWriter->endElement();
  565. }
  566. }
  567. /**
  568. * Write PrintOptions
  569. *
  570. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  571. * @param PHPExcel_Worksheet $pSheet Worksheet
  572. * @throws Exception
  573. */
  574. private function _writePrintOptions(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  575. {
  576. // printOptions
  577. $objWriter->startElement('printOptions');
  578. $objWriter->writeAttribute('gridLines', ($pSheet->getPrintGridlines() ? 'true': 'false'));
  579. $objWriter->writeAttribute('gridLinesSet', 'true');
  580. if ($pSheet->getPageSetup()->getHorizontalCentered()) {
  581. $objWriter->writeAttribute('horizontalCentered', 'true');
  582. }
  583. if ($pSheet->getPageSetup()->getVerticalCentered()) {
  584. $objWriter->writeAttribute('verticalCentered', 'true');
  585. }
  586. $objWriter->endElement();
  587. }
  588. /**
  589. * Write PageMargins
  590. *
  591. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  592. * @param PHPExcel_Worksheet $pSheet Worksheet
  593. * @throws Exception
  594. */
  595. private function _writePageMargins(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  596. {
  597. // pageMargins
  598. $objWriter->startElement('pageMargins');
  599. $objWriter->writeAttribute('left', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft()));
  600. $objWriter->writeAttribute('right', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight()));
  601. $objWriter->writeAttribute('top', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop()));
  602. $objWriter->writeAttribute('bottom', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom()));
  603. $objWriter->writeAttribute('header', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getHeader()));
  604. $objWriter->writeAttribute('footer', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getFooter()));
  605. $objWriter->endElement();
  606. }
  607. /**
  608. * Write AutoFilter
  609. *
  610. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  611. * @param PHPExcel_Worksheet $pSheet Worksheet
  612. * @throws Exception
  613. */
  614. private function _writeAutoFilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  615. {
  616. if ($pSheet->getAutoFilter() != '') {
  617. // autoFilter
  618. $objWriter->startElement('autoFilter');
  619. // Strip any worksheet reference from the filter coordinates
  620. $range = PHPExcel_Cell::splitRange($pSheet->getAutoFilter());
  621. $range = $range[0];
  622. // Strip any worksheet ref
  623. if (strpos($range[0],'!') !== false) {
  624. list($ws,$range[0]) = explode('!',$range[0]);
  625. }
  626. $range = implode(':', $range);
  627. $objWriter->writeAttribute('ref', str_replace('$','',$range));
  628. $objWriter->endElement();
  629. }
  630. }
  631. /**
  632. * Write PageSetup
  633. *
  634. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  635. * @param PHPExcel_Worksheet $pSheet Worksheet
  636. * @throws Exception
  637. */
  638. private function _writePageSetup(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  639. {
  640. // pageSetup
  641. $objWriter->startElement('pageSetup');
  642. $objWriter->writeAttribute('paperSize', $pSheet->getPageSetup()->getPaperSize());
  643. $objWriter->writeAttribute('orientation', $pSheet->getPageSetup()->getOrientation());
  644. if (!is_null($pSheet->getPageSetup()->getScale())) {
  645. $objWriter->writeAttribute('scale', $pSheet->getPageSetup()->getScale());
  646. }
  647. if (!is_null($pSheet->getPageSetup()->getFitToHeight())) {
  648. $objWriter->writeAttribute('fitToHeight', $pSheet->getPageSetup()->getFitToHeight());
  649. } else {
  650. $objWriter->writeAttribute('fitToHeight', '0');
  651. }
  652. if (!is_null($pSheet->getPageSetup()->getFitToWidth())) {
  653. $objWriter->writeAttribute('fitToWidth', $pSheet->getPageSetup()->getFitToWidth());
  654. } else {
  655. $objWriter->writeAttribute('fitToWidth', '0');
  656. }
  657. if (!is_null($pSheet->getPageSetup()->getFirstPageNumber())) {
  658. $objWriter->writeAttribute('firstPageNumber', $pSheet->getPageSetup()->getFirstPageNumber());
  659. $objWriter->writeAttribute('useFirstPageNumber', '1');
  660. }
  661. $objWriter->endElement();
  662. }
  663. /**
  664. * Write Header / Footer
  665. *
  666. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  667. * @param PHPExcel_Worksheet $pSheet Worksheet
  668. * @throws Exception
  669. */
  670. private function _writeHeaderFooter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  671. {
  672. // headerFooter
  673. $objWriter->startElement('headerFooter');
  674. $objWriter->writeAttribute('differentOddEven', ($pSheet->getHeaderFooter()->getDifferentOddEven() ? 'true' : 'false'));
  675. $objWriter->writeAttribute('differentFirst', ($pSheet->getHeaderFooter()->getDifferentFirst() ? 'true' : 'false'));
  676. $objWriter->writeAttribute('scaleWithDoc', ($pSheet->getHeaderFooter()->getScaleWithDocument() ? 'true' : 'false'));
  677. $objWriter->writeAttribute('alignWithMargins', ($pSheet->getHeaderFooter()->getAlignWithMargins() ? 'true' : 'false'));
  678. $objWriter->writeElement('oddHeader', $pSheet->getHeaderFooter()->getOddHeader());
  679. $objWriter->writeElement('oddFooter', $pSheet->getHeaderFooter()->getOddFooter());
  680. $objWriter->writeElement('evenHeader', $pSheet->getHeaderFooter()->getEvenHeader());
  681. $objWriter->writeElement('evenFooter', $pSheet->getHeaderFooter()->getEvenFooter());
  682. $objWriter->writeElement('firstHeader', $pSheet->getHeaderFooter()->getFirstHeader());
  683. $objWriter->writeElement('firstFooter', $pSheet->getHeaderFooter()->getFirstFooter());
  684. $objWriter->endElement();
  685. }
  686. /**
  687. * Write Breaks
  688. *
  689. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  690. * @param PHPExcel_Worksheet $pSheet Worksheet
  691. * @throws Exception
  692. */
  693. private function _writeBreaks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  694. {
  695. // Get row and column breaks
  696. $aRowBreaks = array();
  697. $aColumnBreaks = array();
  698. foreach ($pSheet->getBreaks() as $cell => $breakType) {
  699. if ($breakType == PHPExcel_Worksheet::BREAK_ROW) {
  700. $aRowBreaks[] = $cell;
  701. } else if ($breakType == PHPExcel_Worksheet::BREAK_COLUMN) {
  702. $aColumnBreaks[] = $cell;
  703. }
  704. }
  705. // rowBreaks
  706. if (!empty($aRowBreaks)) {
  707. $objWriter->startElement('rowBreaks');
  708. $objWriter->writeAttribute('count', count($aRowBreaks));
  709. $objWriter->writeAttribute('manualBreakCount', count($aRowBreaks));
  710. foreach ($aRowBreaks as $cell) {
  711. $coords = PHPExcel_Cell::coordinateFromString($cell);
  712. $objWriter->startElement('brk');
  713. $objWriter->writeAttribute('id', $coords[1]);
  714. $objWriter->writeAttribute('man', '1');
  715. $objWriter->endElement();
  716. }
  717. $objWriter->endElement();
  718. }
  719. // Second, write column breaks
  720. if (!empty($aColumnBreaks)) {
  721. $objWriter->startElement('colBreaks');
  722. $objWriter->writeAttribute('count', count($aColumnBreaks));
  723. $objWriter->writeAttribute('manualBreakCount', count($aColumnBreaks));
  724. foreach ($aColumnBreaks as $cell) {
  725. $coords = PHPExcel_Cell::coordinateFromString($cell);
  726. $objWriter->startElement('brk');
  727. $objWriter->writeAttribute('id', PHPExcel_Cell::columnIndexFromString($coords[0]) - 1);
  728. $objWriter->writeAttribute('man', '1');
  729. $objWriter->endElement();
  730. }
  731. $objWriter->endElement();
  732. }
  733. }
  734. /**
  735. * Write SheetData
  736. *
  737. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  738. * @param PHPExcel_Worksheet $pSheet Worksheet
  739. * @param string[] $pStringTable String table
  740. * @throws Exception
  741. */
  742. private function _writeSheetData(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pStringTable = null)
  743. {
  744. if (is_array($pStringTable)) {
  745. // Flipped stringtable, for faster index searching
  746. $aFlippedStringTable = $this->getParentWriter()->getWriterPart('stringtable')->flipStringTable($pStringTable);
  747. // sheetData
  748. $objWriter->startElement('sheetData');
  749. // Get column count
  750. $colCount = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn());
  751. // Highest row number
  752. $highestRow = $pSheet->getHighestRow();
  753. // Loop through cells
  754. $cellsByRow = array();
  755. foreach ($pSheet->getCellCollection() as $cellID) {
  756. $cellAddress = PHPExcel_Cell::coordinateFromString($cellID);
  757. $cellsByRow[$cellAddress[1]][] = $cellID;
  758. }
  759. $currentRow = 0;
  760. while($currentRow++ < $highestRow) {
  761. // Get row dimension
  762. $rowDimension = $pSheet->getRowDimension($currentRow);
  763. // Write current row?
  764. $writeCurrentRow = isset($cellsByRow[$currentRow]) ||
  765. $rowDimension->getRowHeight() >= 0 ||
  766. $rowDimension->getVisible() == false ||
  767. $rowDimension->getCollapsed() == true ||
  768. $rowDimension->getOutlineLevel() > 0 ||
  769. $rowDimension->getXfIndex() !== null;
  770. if ($writeCurrentRow) {
  771. // Start a new row
  772. $objWriter->startElement('row');
  773. $objWriter->writeAttribute('r', $currentRow);
  774. $objWriter->writeAttribute('spans', '1:' . $colCount);
  775. // Row dimensions
  776. if ($rowDimension->getRowHeight() >= 0) {
  777. $objWriter->writeAttribute('customHeight', '1');
  778. $objWriter->writeAttribute('ht', PHPExcel_Shared_String::FormatNumber($rowDimension->getRowHeight()));
  779. }
  780. // Row visibility
  781. if ($rowDimension->getVisible() == false) {
  782. $objWriter->writeAttribute('hidden', 'true');
  783. }
  784. // Collapsed
  785. if ($rowDimension->getCollapsed() == true) {
  786. $objWriter->writeAttribute('collapsed', 'true');
  787. }
  788. // Outline level
  789. if ($rowDimension->getOutlineLevel() > 0) {
  790. $objWriter->writeAttribute('outlineLevel', $rowDimension->getOutlineLevel());
  791. }
  792. // Style
  793. if ($rowDimension->getXfIndex() !== null) {
  794. $objWriter->writeAttribute('s', $rowDimension->getXfIndex());
  795. $objWriter->writeAttribute('customFormat', '1');
  796. }
  797. // Write cells
  798. if (isset($cellsByRow[$currentRow])) {
  799. foreach($cellsByRow[$currentRow] as $cellAddress) {
  800. // Write cell
  801. $this->_writeCell($objWriter, $pSheet, $cellAddress, $pStringTable, $aFlippedStringTable);
  802. }
  803. }
  804. // End row
  805. $objWriter->endElement();
  806. }
  807. }
  808. $objWriter->endElement();
  809. } else {
  810. throw new Exception("Invalid parameters passed.");
  811. }
  812. }
  813. /**
  814. * Write Cell
  815. *
  816. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  817. * @param PHPExcel_Worksheet $pSheet Worksheet
  818. * @param PHPExcel_Cell $pCellAddress Cell Address
  819. * @param string[] $pStringTable String table
  820. * @param string[] $pFlippedStringTable String table (flipped), for faster index searching
  821. * @throws Exception
  822. */
  823. private function _writeCell(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pCellAddress = null, $pStringTable = null, $pFlippedStringTable = null)
  824. {
  825. if (is_array($pStringTable) && is_array($pFlippedStringTable)) {
  826. // Cell
  827. $pCell = $pSheet->getCell($pCellAddress);
  828. $objWriter->startElement('c');
  829. $objWriter->writeAttribute('r', $pCellAddress);
  830. // Sheet styles
  831. if ($pCell->getXfIndex() != '') {
  832. $objWriter->writeAttribute('s', $pCell->getXfIndex());
  833. }
  834. // If cell value is supplied, write cell value
  835. $cellValue = $pCell->getValue();
  836. if (is_object($cellValue) || $cellValue !== '') {
  837. // Map type
  838. $mappedType = $pCell->getDataType();
  839. // Write data type depending on its type
  840. switch (strtolower($mappedType)) {
  841. case 'inlinestr': // Inline string
  842. case 's': // String
  843. case 'b': // Boolean
  844. $objWriter->writeAttribute('t', $mappedType);
  845. break;
  846. case 'f': // Formula
  847. $calculatedValue = null;
  848. if ($this->getParentWriter()->getPreCalculateFormulas()) {
  849. $calculatedValue = $pCell->getCalculatedValue();
  850. } else {
  851. $calculatedValue = $cellValue;
  852. }
  853. if (is_string($calculatedValue)) {
  854. $objWriter->writeAttribute('t', 'str');
  855. }
  856. break;
  857. case 'e': // Error
  858. $objWriter->writeAttribute('t', $mappedType);
  859. }
  860. // Write data depending on its type
  861. switch (strtolower($mappedType)) {
  862. case 'inlinestr': // Inline string
  863. if (! $cellValue instanceof PHPExcel_RichText) {
  864. $objWriter->writeElement('t', PHPExcel_Shared_String::ControlCharacterPHP2OOXML( htmlspecialchars($cellValue) ) );
  865. } else if ($cellValue instanceof PHPExcel_RichText) {
  866. $objWriter->startElement('is');
  867. $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $cellValue);
  868. $objWriter->endElement();
  869. }
  870. break;
  871. case 's': // String
  872. if (! $cellValue instanceof PHPExcel_RichText) {
  873. if (isset($pFlippedStringTable[$cellValue])) {
  874. $objWriter->writeElement('v', $pFlippedStringTable[$cellValue]);
  875. }
  876. } else if ($cellValue instanceof PHPExcel_RichText) {
  877. $objWriter->writeElement('v', $pFlippedStringTable[$cellValue->getHashCode()]);
  878. }
  879. break;
  880. case 'f': // Formula
  881. $attributes = $pCell->getFormulaAttributes();
  882. if($attributes['t'] == 'array') {
  883. $objWriter->startElement('f');
  884. $objWriter->writeAttribute('t', 'array');
  885. $objWriter->writeAttribute('ref', $pCellAddress);
  886. $objWriter->writeAttribute('aca', '1');
  887. $objWriter->writeAttribute('ca', '1');
  888. $objWriter->text(substr($cellValue, 1));
  889. $objWriter->endElement();
  890. } else {
  891. $objWriter->writeElement('f', substr($cellValue, 1));
  892. }
  893. if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
  894. if ($this->getParentWriter()->getPreCalculateFormulas()) {
  895. $calculatedValue = $pCell->getCalculatedValue();
  896. if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') {
  897. $objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue));
  898. } else {
  899. $objWriter->writeElement('v', '0');
  900. }
  901. } else {
  902. $objWriter->writeElement('v', '0');
  903. }
  904. }
  905. break;
  906. case 'n': // Numeric
  907. // force point as decimal separator in case current locale uses comma
  908. $objWriter->writeElement('v', str_replace(',', '.', $cellValue));
  909. break;
  910. case 'b': // Boolean
  911. $objWriter->writeElement('v', ($cellValue ? '1' : '0'));
  912. break;
  913. case 'e': // Error
  914. if (substr($cellValue, 0, 1) == '=') {
  915. $objWriter->writeElement('f', substr($cellValue, 1));
  916. $objWriter->writeElement('v', substr($cellValue, 1));
  917. } else {
  918. $objWriter->writeElement('v', $cellValue);
  919. }
  920. break;
  921. }
  922. }
  923. $objWriter->endElement();
  924. } else {
  925. throw new Exception("Invalid parameters passed.");
  926. }
  927. }
  928. /**
  929. * Write Drawings
  930. *
  931. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  932. * @param PHPExcel_Worksheet $pSheet Worksheet
  933. * @param boolean $includeCharts Flag indicating if we should include drawing details for charts
  934. * @throws Exception
  935. */
  936. private function _writeDrawings(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $includeCharts = FALSE)
  937. {
  938. $chartCount = ($includeCharts) ? $pSheet->getChartCollection()->count() : 0;
  939. // If sheet contains drawings, add the relationships
  940. if (($pSheet->getDrawingCollection()->count() > 0) ||
  941. ($chartCount > 0)) {
  942. $objWriter->startElement('drawing');
  943. $objWriter->writeAttribute('r:id', 'rId1');
  944. $objWriter->endElement();
  945. }
  946. }
  947. /**
  948. * Write LegacyDrawing
  949. *
  950. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  951. * @param PHPExcel_Worksheet $pSheet Worksheet
  952. * @throws Exception
  953. */
  954. private function _writeLegacyDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  955. {
  956. // If sheet contains comments, add the relationships
  957. if (count($pSheet->getComments()) > 0) {
  958. $objWriter->startElement('legacyDrawing');
  959. $objWriter->writeAttribute('r:id', 'rId_comments_vml1');
  960. $objWriter->endElement();
  961. }
  962. }
  963. /**
  964. * Write LegacyDrawingHF
  965. *
  966. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  967. * @param PHPExcel_Worksheet $pSheet Worksheet
  968. * @throws Exception
  969. */
  970. private function _writeLegacyDrawingHF(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
  971. {
  972. // If sheet contains images, add the relationships
  973. if (count($pSheet->getHeaderFooter()->getImages()) > 0) {
  974. $objWriter->startElement('legacyDrawingHF');
  975. $objWriter->writeAttribute('r:id', 'rId_headerfooter_vml1');
  976. $objWriter->endElement();
  977. }
  978. }
  979. }