PageRenderTime 51ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/v1.7.2/Classes/PHPExcel/Writer/Excel2007/Worksheet.php

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