source: sourcecode/application/libraries/PHPExcel/Writer/Excel2007/Worksheet.php @ 1

Last change on this file since 1 was 1, checked in by dungnv, 11 years ago
File size: 43.7 KB
Line 
1<?php
2/**
3 * PHPExcel
4 *
5 * Copyright (c) 2006 - 2014 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 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24 * @license     http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt   LGPL
25 * @version     1.8.0, 2014-03-02
26 */
27
28
29/**
30 * PHPExcel_Writer_Excel2007_Worksheet
31 *
32 * @category   PHPExcel
33 * @package     PHPExcel_Writer_Excel2007
34 * @copyright  Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35 */
36class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_WriterPart
37{
38        /**
39         * Write worksheet to XML format
40         *
41         * @param       PHPExcel_Worksheet              $pSheet
42         * @param       string[]                                $pStringTable
43         * @param       boolean                                 $includeCharts  Flag indicating if we should write charts
44         * @return      string                                  XML Output
45         * @throws      PHPExcel_Writer_Exception
46         */
47        public function writeWorksheet($pSheet = null, $pStringTable = null, $includeCharts = FALSE)
48        {
49                if (!is_null($pSheet)) {
50                        // Create XML writer
51                        $objWriter = null;
52                        if ($this->getParentWriter()->getUseDiskCaching()) {
53                                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
54                        } else {
55                                $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
56                        }
57
58                        // XML header
59                        $objWriter->startDocument('1.0','UTF-8','yes');
60
61                        // Worksheet
62                        $objWriter->startElement('worksheet');
63                        $objWriter->writeAttribute('xml:space', 'preserve');
64                        $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
65                        $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
66
67                                // sheetPr
68                                $this->_writeSheetPr($objWriter, $pSheet);
69
70                                // Dimension
71                                $this->_writeDimension($objWriter, $pSheet);
72
73                                // sheetViews
74                                $this->_writeSheetViews($objWriter, $pSheet);
75
76                                // sheetFormatPr
77                                $this->_writeSheetFormatPr($objWriter, $pSheet);
78
79                                // cols
80                                $this->_writeCols($objWriter, $pSheet);
81
82                                // sheetData
83                                $this->_writeSheetData($objWriter, $pSheet, $pStringTable);
84
85                                // sheetProtection
86                                $this->_writeSheetProtection($objWriter, $pSheet);
87
88                                // protectedRanges
89                                $this->_writeProtectedRanges($objWriter, $pSheet);
90
91                                // autoFilter
92                                $this->_writeAutoFilter($objWriter, $pSheet);
93
94                                // mergeCells
95                                $this->_writeMergeCells($objWriter, $pSheet);
96
97                                // conditionalFormatting
98                                $this->_writeConditionalFormatting($objWriter, $pSheet);
99
100                                // dataValidations
101                                $this->_writeDataValidations($objWriter, $pSheet);
102
103                                // hyperlinks
104                                $this->_writeHyperlinks($objWriter, $pSheet);
105
106                                // Print options
107                                $this->_writePrintOptions($objWriter, $pSheet);
108
109                                // Page margins
110                                $this->_writePageMargins($objWriter, $pSheet);
111
112                                // Page setup
113                                $this->_writePageSetup($objWriter, $pSheet);
114
115                                // Header / footer
116                                $this->_writeHeaderFooter($objWriter, $pSheet);
117
118                                // Breaks
119                                $this->_writeBreaks($objWriter, $pSheet);
120
121                                // Drawings and/or Charts
122                                $this->_writeDrawings($objWriter, $pSheet, $includeCharts);
123
124                                // LegacyDrawing
125                                $this->_writeLegacyDrawing($objWriter, $pSheet);
126
127                                // LegacyDrawingHF
128                                $this->_writeLegacyDrawingHF($objWriter, $pSheet);
129
130                        $objWriter->endElement();
131
132                        // Return
133                        return $objWriter->getData();
134                } else {
135                        throw new PHPExcel_Writer_Exception("Invalid PHPExcel_Worksheet object passed.");
136                }
137        }
138
139        /**
140         * Write SheetPr
141         *
142         * @param       PHPExcel_Shared_XMLWriter               $objWriter              XML Writer
143         * @param       PHPExcel_Worksheet                              $pSheet                 Worksheet
144         * @throws      PHPExcel_Writer_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                if($pSheet->getParent()->hasMacros()){//if the workbook have macros, we need to have codeName for the sheet
152                        if($pSheet->hasCodeName()==false){
153                                $pSheet->setCodeName($pSheet->getTitle());
154                        }
155                        $objWriter->writeAttribute('codeName',          $pSheet->getCodeName());
156                }
157                        $autoFilterRange = $pSheet->getAutoFilter()->getRange();
158                        if (!empty($autoFilterRange)) {
159                                $objWriter->writeAttribute('filterMode', 1);
160                                $pSheet->getAutoFilter()->showHideRows();
161                        }
162
163                        // tabColor
164                        if ($pSheet->isTabColorSet()) {
165                                $objWriter->startElement('tabColor');
166                                $objWriter->writeAttribute('rgb',       $pSheet->getTabColor()->getARGB());
167                                $objWriter->endElement();
168                        }
169
170                        // outlinePr
171                        $objWriter->startElement('outlinePr');
172                        $objWriter->writeAttribute('summaryBelow',      ($pSheet->getShowSummaryBelow() ? '1' : '0'));
173                        $objWriter->writeAttribute('summaryRight',      ($pSheet->getShowSummaryRight() ? '1' : '0'));
174                        $objWriter->endElement();
175
176                        // pageSetUpPr
177                        if ($pSheet->getPageSetup()->getFitToPage()) {
178                                $objWriter->startElement('pageSetUpPr');
179                                $objWriter->writeAttribute('fitToPage', '1');
180                                $objWriter->endElement();
181                        }
182
183                $objWriter->endElement();
184        }
185
186        /**
187         * Write Dimension
188         *
189         * @param       PHPExcel_Shared_XMLWriter       $objWriter              XML Writer
190         * @param       PHPExcel_Worksheet                      $pSheet                 Worksheet
191         * @throws      PHPExcel_Writer_Exception
192         */
193        private function _writeDimension(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
194        {
195                // dimension
196                $objWriter->startElement('dimension');
197                $objWriter->writeAttribute('ref', $pSheet->calculateWorksheetDimension());
198                $objWriter->endElement();
199        }
200
201        /**
202         * Write SheetViews
203         *
204         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
205         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
206         * @throws      PHPExcel_Writer_Exception
207         */
208        private function _writeSheetViews(PHPExcel_Shared_XMLWriter $objWriter = NULL, PHPExcel_Worksheet $pSheet = NULL)
209        {
210                // sheetViews
211                $objWriter->startElement('sheetViews');
212
213                        // Sheet selected?
214                        $sheetSelected = false;
215                        if ($this->getParentWriter()->getPHPExcel()->getIndex($pSheet) == $this->getParentWriter()->getPHPExcel()->getActiveSheetIndex())
216                                $sheetSelected = true;
217
218
219                        // sheetView
220                        $objWriter->startElement('sheetView');
221                        $objWriter->writeAttribute('tabSelected',               $sheetSelected ? '1' : '0');
222                        $objWriter->writeAttribute('workbookViewId',    '0');
223
224                                // Zoom scales
225                                if ($pSheet->getSheetView()->getZoomScale() != 100) {
226                                        $objWriter->writeAttribute('zoomScale', $pSheet->getSheetView()->getZoomScale());
227                                }
228                                if ($pSheet->getSheetView()->getZoomScaleNormal() != 100) {
229                                        $objWriter->writeAttribute('zoomScaleNormal',   $pSheet->getSheetView()->getZoomScaleNormal());
230                                }
231
232                                // View Layout Type
233                                if ($pSheet->getSheetView()->getView() !== PHPExcel_Worksheet_SheetView::SHEETVIEW_NORMAL) {
234                                        $objWriter->writeAttribute('view',      $pSheet->getSheetView()->getView());
235                                }
236
237                                // Gridlines
238                                if ($pSheet->getShowGridlines()) {
239                                        $objWriter->writeAttribute('showGridLines',     'true');
240                                } else {
241                                        $objWriter->writeAttribute('showGridLines',     'false');
242                                }
243
244                                // Row and column headers
245                                if ($pSheet->getShowRowColHeaders()) {
246                                        $objWriter->writeAttribute('showRowColHeaders', '1');
247                                } else {
248                                        $objWriter->writeAttribute('showRowColHeaders', '0');
249                                }
250
251                                // Right-to-left
252                                if ($pSheet->getRightToLeft()) {
253                                        $objWriter->writeAttribute('rightToLeft',       'true');
254                                }
255
256                                $activeCell = $pSheet->getActiveCell();
257
258                                // Pane
259                                $pane = '';
260                                $topLeftCell = $pSheet->getFreezePane();
261                                if (($topLeftCell != '') && ($topLeftCell != 'A1')) {
262                                        $activeCell = $topLeftCell;
263                                        // Calculate freeze coordinates
264                                        $xSplit = $ySplit = 0;
265
266                                        list($xSplit, $ySplit) = PHPExcel_Cell::coordinateFromString($topLeftCell);
267                                        $xSplit = PHPExcel_Cell::columnIndexFromString($xSplit);
268
269                                        // pane
270                                        $pane = 'topRight';
271                                        $objWriter->startElement('pane');
272                                        if ($xSplit > 1)
273                                                $objWriter->writeAttribute('xSplit',    $xSplit - 1);
274                                        if ($ySplit > 1) {
275                                                $objWriter->writeAttribute('ySplit',    $ySplit - 1);
276                                                $pane = ($xSplit > 1) ? 'bottomRight' : 'bottomLeft';
277                                        }
278                                        $objWriter->writeAttribute('topLeftCell',       $topLeftCell);
279                                        $objWriter->writeAttribute('activePane',        $pane);
280                                        $objWriter->writeAttribute('state',             'frozen');
281                                        $objWriter->endElement();
282
283                                        if (($xSplit > 1) && ($ySplit > 1)) {
284                                                //      Write additional selections if more than two panes (ie both an X and a Y split)
285                                                $objWriter->startElement('selection');  $objWriter->writeAttribute('pane', 'topRight');         $objWriter->endElement();
286                                                $objWriter->startElement('selection');  $objWriter->writeAttribute('pane', 'bottomLeft');       $objWriter->endElement();
287                                        }
288                                }
289
290                                // Selection
291//                              if ($pane != '') {
292                                        //      Only need to write selection element if we have a split pane
293                                        //              We cheat a little by over-riding the active cell selection, setting it to the split cell
294                                        $objWriter->startElement('selection');
295                                        if ($pane != '') {
296                                                $objWriter->writeAttribute('pane', $pane);
297                                        }
298                                        $objWriter->writeAttribute('activeCell', $activeCell);
299                                        $objWriter->writeAttribute('sqref', $activeCell);
300                                        $objWriter->endElement();
301//                              }
302
303                        $objWriter->endElement();
304
305                $objWriter->endElement();
306        }
307
308        /**
309         * Write SheetFormatPr
310         *
311         * @param       PHPExcel_Shared_XMLWriter $objWriter            XML Writer
312         * @param       PHPExcel_Worksheet                $pSheet                       Worksheet
313         * @throws      PHPExcel_Writer_Exception
314         */
315        private function _writeSheetFormatPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
316        {
317                // sheetFormatPr
318                $objWriter->startElement('sheetFormatPr');
319
320                        // Default row height
321                        if ($pSheet->getDefaultRowDimension()->getRowHeight() >= 0) {
322                                $objWriter->writeAttribute('customHeight',              'true');
323                                $objWriter->writeAttribute('defaultRowHeight',  PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultRowDimension()->getRowHeight()));
324                        } else {
325                                $objWriter->writeAttribute('defaultRowHeight', '14.4');
326                        }
327
328                        // Set Zero Height row
329                        if ((string)$pSheet->getDefaultRowDimension()->getzeroHeight()  == '1' ||
330                                strtolower((string)$pSheet->getDefaultRowDimension()->getzeroHeight()) == 'true' ) {
331                                $objWriter->writeAttribute('zeroHeight', '1');
332                        }
333
334                        // Default column width
335                        if ($pSheet->getDefaultColumnDimension()->getWidth() >= 0) {
336                                $objWriter->writeAttribute('defaultColWidth', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultColumnDimension()->getWidth()));
337                        }
338
339                        // Outline level - row
340                        $outlineLevelRow = 0;
341                        foreach ($pSheet->getRowDimensions() as $dimension) {
342                                if ($dimension->getOutlineLevel() > $outlineLevelRow) {
343                                        $outlineLevelRow = $dimension->getOutlineLevel();
344                                }
345                        }
346                        $objWriter->writeAttribute('outlineLevelRow',   (int)$outlineLevelRow);
347
348                        // Outline level - column
349                        $outlineLevelCol = 0;
350                        foreach ($pSheet->getColumnDimensions() as $dimension) {
351                                if ($dimension->getOutlineLevel() > $outlineLevelCol) {
352                                        $outlineLevelCol = $dimension->getOutlineLevel();
353                                }
354                        }
355                        $objWriter->writeAttribute('outlineLevelCol',   (int)$outlineLevelCol);
356
357                $objWriter->endElement();
358        }
359
360        /**
361         * Write Cols
362         *
363         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
364         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
365         * @throws      PHPExcel_Writer_Exception
366         */
367        private function _writeCols(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
368        {
369                // cols
370                if (count($pSheet->getColumnDimensions()) > 0)  {
371                        $objWriter->startElement('cols');
372
373                                $pSheet->calculateColumnWidths();
374
375                                // Loop through column dimensions
376                                foreach ($pSheet->getColumnDimensions() as $colDimension) {
377                                        // col
378                                        $objWriter->startElement('col');
379                                        $objWriter->writeAttribute('min',       PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));
380                                        $objWriter->writeAttribute('max',       PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));
381
382                                        if ($colDimension->getWidth() < 0) {
383                                                // No width set, apply default of 10
384                                                $objWriter->writeAttribute('width',             '9.10');
385                                        } else {
386                                                // Width set
387                                                $objWriter->writeAttribute('width',             PHPExcel_Shared_String::FormatNumber($colDimension->getWidth()));
388                                        }
389
390                                        // Column visibility
391                                        if ($colDimension->getVisible() == false) {
392                                                $objWriter->writeAttribute('hidden',            'true');
393                                        }
394
395                                        // Auto size?
396                                        if ($colDimension->getAutoSize()) {
397                                                $objWriter->writeAttribute('bestFit',           'true');
398                                        }
399
400                                        // Custom width?
401                                        if ($colDimension->getWidth() != $pSheet->getDefaultColumnDimension()->getWidth()) {
402                                                $objWriter->writeAttribute('customWidth',       'true');
403                                        }
404
405                                        // Collapsed
406                                        if ($colDimension->getCollapsed() == true) {
407                                                $objWriter->writeAttribute('collapsed',         'true');
408                                        }
409
410                                        // Outline level
411                                        if ($colDimension->getOutlineLevel() > 0) {
412                                                $objWriter->writeAttribute('outlineLevel',      $colDimension->getOutlineLevel());
413                                        }
414
415                                        // Style
416                                        $objWriter->writeAttribute('style', $colDimension->getXfIndex());
417
418                                        $objWriter->endElement();
419                                }
420
421                        $objWriter->endElement();
422                }
423        }
424
425        /**
426         * Write SheetProtection
427         *
428         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
429         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
430         * @throws      PHPExcel_Writer_Exception
431         */
432        private function _writeSheetProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
433        {
434                // sheetProtection
435                $objWriter->startElement('sheetProtection');
436
437                if ($pSheet->getProtection()->getPassword() != '') {
438                        $objWriter->writeAttribute('password',                          $pSheet->getProtection()->getPassword());
439                }
440
441                $objWriter->writeAttribute('sheet',                                     ($pSheet->getProtection()->getSheet()                           ? 'true' : 'false'));
442                $objWriter->writeAttribute('objects',                           ($pSheet->getProtection()->getObjects()                         ? 'true' : 'false'));
443                $objWriter->writeAttribute('scenarios',                         ($pSheet->getProtection()->getScenarios()                       ? 'true' : 'false'));
444                $objWriter->writeAttribute('formatCells',                       ($pSheet->getProtection()->getFormatCells()                     ? 'true' : 'false'));
445                $objWriter->writeAttribute('formatColumns',                     ($pSheet->getProtection()->getFormatColumns()           ? 'true' : 'false'));
446                $objWriter->writeAttribute('formatRows',                        ($pSheet->getProtection()->getFormatRows()                      ? 'true' : 'false'));
447                $objWriter->writeAttribute('insertColumns',                     ($pSheet->getProtection()->getInsertColumns()           ? 'true' : 'false'));
448                $objWriter->writeAttribute('insertRows',                        ($pSheet->getProtection()->getInsertRows()                      ? 'true' : 'false'));
449                $objWriter->writeAttribute('insertHyperlinks',          ($pSheet->getProtection()->getInsertHyperlinks()        ? 'true' : 'false'));
450                $objWriter->writeAttribute('deleteColumns',                     ($pSheet->getProtection()->getDeleteColumns()           ? 'true' : 'false'));
451                $objWriter->writeAttribute('deleteRows',                        ($pSheet->getProtection()->getDeleteRows()                      ? 'true' : 'false'));
452                $objWriter->writeAttribute('selectLockedCells',         ($pSheet->getProtection()->getSelectLockedCells()       ? 'true' : 'false'));
453                $objWriter->writeAttribute('sort',                                      ($pSheet->getProtection()->getSort()                            ? 'true' : 'false'));
454                $objWriter->writeAttribute('autoFilter',                        ($pSheet->getProtection()->getAutoFilter()                      ? 'true' : 'false'));
455                $objWriter->writeAttribute('pivotTables',                       ($pSheet->getProtection()->getPivotTables()                     ? 'true' : 'false'));
456                $objWriter->writeAttribute('selectUnlockedCells',       ($pSheet->getProtection()->getSelectUnlockedCells()     ? 'true' : 'false'));
457                $objWriter->endElement();
458        }
459
460        /**
461         * Write ConditionalFormatting
462         *
463         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
464         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
465         * @throws      PHPExcel_Writer_Exception
466         */
467        private function _writeConditionalFormatting(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
468        {
469                // Conditional id
470                $id = 1;
471
472                // Loop through styles in the current worksheet
473                foreach ($pSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) {
474                        foreach ($conditionalStyles as $conditional) {
475                                // WHY was this again?
476                                // if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() ) == '') {
477                                //      continue;
478                                // }
479                                if ($conditional->getConditionType() != PHPExcel_Style_Conditional::CONDITION_NONE) {
480                                        // conditionalFormatting
481                                        $objWriter->startElement('conditionalFormatting');
482                                        $objWriter->writeAttribute('sqref',     $cellCoordinate);
483
484                                                // cfRule
485                                                $objWriter->startElement('cfRule');
486                                                $objWriter->writeAttribute('type',              $conditional->getConditionType());
487                                                $objWriter->writeAttribute('dxfId',             $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() ));
488                                                $objWriter->writeAttribute('priority',  $id++);
489
490                                                if (($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS
491                                                                ||
492                                                         $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT)
493                                                        && $conditional->getOperatorType() != PHPExcel_Style_Conditional::OPERATOR_NONE) {
494                                                        $objWriter->writeAttribute('operator',  $conditional->getOperatorType());
495                                                }
496
497                                                if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
498                                                        && !is_null($conditional->getText())) {
499                                                        $objWriter->writeAttribute('text',      $conditional->getText());
500                                                }
501
502                                                if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
503                                                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT
504                                                        && !is_null($conditional->getText())) {
505                                                        $objWriter->writeElement('formula',     'NOT(ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . ')))');
506                                                } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
507                                                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BEGINSWITH
508                                                        && !is_null($conditional->getText())) {
509                                                        $objWriter->writeElement('formula',     'LEFT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"');
510                                                } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
511                                                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_ENDSWITH
512                                                        && !is_null($conditional->getText())) {
513                                                        $objWriter->writeElement('formula',     'RIGHT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"');
514                                                } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
515                                                        && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_NOTCONTAINS
516                                                        && !is_null($conditional->getText())) {
517                                                        $objWriter->writeElement('formula',     'ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . '))');
518                                                } else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS
519                                                        || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
520                                                        || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) {
521                                                        foreach ($conditional->getConditions() as $formula) {
522                                                                // Formula
523                                                                $objWriter->writeElement('formula',     $formula);
524                                                        }
525                                                }
526
527                                                $objWriter->endElement();
528
529                                        $objWriter->endElement();
530                                }
531                        }
532                }
533        }
534
535        /**
536         * Write DataValidations
537         *
538         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
539         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
540         * @throws      PHPExcel_Writer_Exception
541         */
542        private function _writeDataValidations(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
543        {
544                // Datavalidation collection
545                $dataValidationCollection = $pSheet->getDataValidationCollection();
546
547                // Write data validations?
548                if (!empty($dataValidationCollection)) {
549                        $objWriter->startElement('dataValidations');
550                        $objWriter->writeAttribute('count', count($dataValidationCollection));
551
552                        foreach ($dataValidationCollection as $coordinate => $dv) {
553                                $objWriter->startElement('dataValidation');
554
555                                if ($dv->getType() != '') {
556                                        $objWriter->writeAttribute('type', $dv->getType());
557                                }
558
559                                if ($dv->getErrorStyle() != '') {
560                                        $objWriter->writeAttribute('errorStyle', $dv->getErrorStyle());
561                                }
562
563                                if ($dv->getOperator() != '') {
564                                        $objWriter->writeAttribute('operator', $dv->getOperator());
565                                }
566
567                                $objWriter->writeAttribute('allowBlank',                ($dv->getAllowBlank()           ? '1'  : '0'));
568                                $objWriter->writeAttribute('showDropDown',              (!$dv->getShowDropDown()        ? '1'  : '0'));
569                                $objWriter->writeAttribute('showInputMessage',  ($dv->getShowInputMessage()     ? '1'  : '0'));
570                                $objWriter->writeAttribute('showErrorMessage',  ($dv->getShowErrorMessage()     ? '1'  : '0'));
571
572                                if ($dv->getErrorTitle() !== '') {
573                                        $objWriter->writeAttribute('errorTitle', $dv->getErrorTitle());
574                                }
575                                if ($dv->getError() !== '') {
576                                        $objWriter->writeAttribute('error', $dv->getError());
577                                }
578                                if ($dv->getPromptTitle() !== '') {
579                                        $objWriter->writeAttribute('promptTitle', $dv->getPromptTitle());
580                                }
581                                if ($dv->getPrompt() !== '') {
582                                        $objWriter->writeAttribute('prompt', $dv->getPrompt());
583                                }
584
585                                $objWriter->writeAttribute('sqref', $coordinate);
586
587                                if ($dv->getFormula1() !== '') {
588                                        $objWriter->writeElement('formula1', $dv->getFormula1());
589                                }
590                                if ($dv->getFormula2() !== '') {
591                                        $objWriter->writeElement('formula2', $dv->getFormula2());
592                                }
593
594                                $objWriter->endElement();
595                        }
596
597                        $objWriter->endElement();
598                }
599        }
600
601        /**
602         * Write Hyperlinks
603         *
604         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
605         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
606         * @throws      PHPExcel_Writer_Exception
607         */
608        private function _writeHyperlinks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
609        {
610                // Hyperlink collection
611                $hyperlinkCollection = $pSheet->getHyperlinkCollection();
612
613                // Relation ID
614                $relationId = 1;
615
616                // Write hyperlinks?
617                if (!empty($hyperlinkCollection)) {
618                        $objWriter->startElement('hyperlinks');
619
620                        foreach ($hyperlinkCollection as $coordinate => $hyperlink) {
621                                $objWriter->startElement('hyperlink');
622
623                                $objWriter->writeAttribute('ref', $coordinate);
624                                if (!$hyperlink->isInternal()) {
625                                        $objWriter->writeAttribute('r:id',      'rId_hyperlink_' . $relationId);
626                                        ++$relationId;
627                                } else {
628                                        $objWriter->writeAttribute('location',  str_replace('sheet://', '', $hyperlink->getUrl()));
629                                }
630
631                                if ($hyperlink->getTooltip() != '') {
632                                        $objWriter->writeAttribute('tooltip', $hyperlink->getTooltip());
633                                }
634
635                                $objWriter->endElement();
636                        }
637
638                        $objWriter->endElement();
639                }
640        }
641
642        /**
643         * Write ProtectedRanges
644         *
645         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
646         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
647         * @throws      PHPExcel_Writer_Exception
648         */
649        private function _writeProtectedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
650        {
651                if (count($pSheet->getProtectedCells()) > 0) {
652                        // protectedRanges
653                        $objWriter->startElement('protectedRanges');
654
655                                // Loop protectedRanges
656                                foreach ($pSheet->getProtectedCells() as $protectedCell => $passwordHash) {
657                                        // protectedRange
658                                        $objWriter->startElement('protectedRange');
659                                        $objWriter->writeAttribute('name',              'p' . md5($protectedCell));
660                                        $objWriter->writeAttribute('sqref',     $protectedCell);
661                                        if (!empty($passwordHash)) {
662                                                $objWriter->writeAttribute('password',  $passwordHash);
663                                        }
664                                        $objWriter->endElement();
665                                }
666
667                        $objWriter->endElement();
668                }
669        }
670
671        /**
672         * Write MergeCells
673         *
674         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
675         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
676         * @throws      PHPExcel_Writer_Exception
677         */
678        private function _writeMergeCells(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
679        {
680                if (count($pSheet->getMergeCells()) > 0) {
681                        // mergeCells
682                        $objWriter->startElement('mergeCells');
683
684                                // Loop mergeCells
685                                foreach ($pSheet->getMergeCells() as $mergeCell) {
686                                        // mergeCell
687                                        $objWriter->startElement('mergeCell');
688                                        $objWriter->writeAttribute('ref', $mergeCell);
689                                        $objWriter->endElement();
690                                }
691
692                        $objWriter->endElement();
693                }
694        }
695
696        /**
697         * Write PrintOptions
698         *
699         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
700         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
701         * @throws      PHPExcel_Writer_Exception
702         */
703        private function _writePrintOptions(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
704        {
705                // printOptions
706                $objWriter->startElement('printOptions');
707
708                $objWriter->writeAttribute('gridLines', ($pSheet->getPrintGridlines() ? 'true': 'false'));
709                $objWriter->writeAttribute('gridLinesSet',      'true');
710
711                if ($pSheet->getPageSetup()->getHorizontalCentered()) {
712                        $objWriter->writeAttribute('horizontalCentered', 'true');
713                }
714
715                if ($pSheet->getPageSetup()->getVerticalCentered()) {
716                        $objWriter->writeAttribute('verticalCentered', 'true');
717                }
718
719                $objWriter->endElement();
720        }
721
722        /**
723         * Write PageMargins
724         *
725         * @param       PHPExcel_Shared_XMLWriter                               $objWriter              XML Writer
726         * @param       PHPExcel_Worksheet                                              $pSheet                 Worksheet
727         * @throws      PHPExcel_Writer_Exception
728         */
729        private function _writePageMargins(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
730        {
731                // pageMargins
732                $objWriter->startElement('pageMargins');
733                $objWriter->writeAttribute('left',              PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft()));
734                $objWriter->writeAttribute('right',             PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight()));
735                $objWriter->writeAttribute('top',               PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop()));
736                $objWriter->writeAttribute('bottom',    PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom()));
737                $objWriter->writeAttribute('header',    PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getHeader()));
738                $objWriter->writeAttribute('footer',    PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getFooter()));
739                $objWriter->endElement();
740        }
741
742        /**
743         * Write AutoFilter
744         *
745         * @param       PHPExcel_Shared_XMLWriter                               $objWriter              XML Writer
746         * @param       PHPExcel_Worksheet                                              $pSheet                 Worksheet
747         * @throws      PHPExcel_Writer_Exception
748         */
749        private function _writeAutoFilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
750        {
751                $autoFilterRange = $pSheet->getAutoFilter()->getRange();
752                if (!empty($autoFilterRange)) {
753                        // autoFilter
754                        $objWriter->startElement('autoFilter');
755
756                        // Strip any worksheet reference from the filter coordinates
757                        $range = PHPExcel_Cell::splitRange($autoFilterRange);
758                        $range = $range[0];
759                        //      Strip any worksheet ref
760                        if (strpos($range[0],'!') !== false) {
761                                list($ws,$range[0]) = explode('!',$range[0]);
762                        }
763                        $range = implode(':', $range);
764
765                        $objWriter->writeAttribute('ref',       str_replace('$','',$range));
766
767                        $columns = $pSheet->getAutoFilter()->getColumns();
768                        if (count($columns > 0)) {
769                                foreach($columns as $columnID => $column) {
770                                        $rules = $column->getRules();
771                                        if (count($rules > 0)) {
772                                                $objWriter->startElement('filterColumn');
773                                                        $objWriter->writeAttribute('colId',     $pSheet->getAutoFilter()->getColumnOffset($columnID));
774
775                                                        $objWriter->startElement( $column->getFilterType());
776                                                                if ($column->getJoin() == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND) {
777                                                                        $objWriter->writeAttribute('and',       1);
778                                                                }
779
780                                                                foreach ($rules as $rule) {
781                                                                        if (($column->getFilterType() === PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) &&
782                                                                                ($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) &&
783                                                                                ($rule->getValue() === '')) {
784                                                                                //      Filter rule for Blanks
785                                                                                $objWriter->writeAttribute('blank',     1);
786                                                                        } elseif($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
787                                                                                //      Dynamic Filter Rule
788                                                                                $objWriter->writeAttribute('type', $rule->getGrouping());
789                                                                                $val = $column->getAttribute('val');
790                                                                                if ($val !== NULL) {
791                                                                                        $objWriter->writeAttribute('val', $val);
792                                                                                }
793                                                                                $maxVal = $column->getAttribute('maxVal');
794                                                                                if ($maxVal !== NULL) {
795                                                                                        $objWriter->writeAttribute('maxVal', $maxVal);
796                                                                                }
797                                                                        } elseif($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {
798                                                                                //      Top 10 Filter Rule
799                                                                                $objWriter->writeAttribute('val',       $rule->getValue());
800                                                                                $objWriter->writeAttribute('percent',   (($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0'));
801                                                                                $objWriter->writeAttribute('top',       (($rule->getGrouping() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1': '0'));
802                                                                        } else {
803                                                                                //      Filter, DateGroupItem or CustomFilter
804                                                                                $objWriter->startElement($rule->getRuleType());
805
806                                                                                        if ($rule->getOperator() !== PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
807                                                                                                $objWriter->writeAttribute('operator',  $rule->getOperator());
808                                                                                        }
809                                                                                        if ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP) {
810                                                                                                // Date Group filters
811                                                                                                foreach($rule->getValue() as $key => $value) {
812                                                                                                        if ($value > '') $objWriter->writeAttribute($key,       $value);
813                                                                                                }
814                                                                                                $objWriter->writeAttribute('dateTimeGrouping',  $rule->getGrouping());
815                                                                                        } else {
816                                                                                                $objWriter->writeAttribute('val',       $rule->getValue());
817                                                                                        }
818
819                                                                                $objWriter->endElement();
820                                                                        }
821                                                                }
822
823                                                        $objWriter->endElement();
824
825                                                $objWriter->endElement();
826                                        }
827                                }
828                        }
829
830                        $objWriter->endElement();
831                }
832        }
833
834        /**
835         * Write PageSetup
836         *
837         * @param       PHPExcel_Shared_XMLWriter                       $objWriter              XML Writer
838         * @param       PHPExcel_Worksheet                                      $pSheet                 Worksheet
839         * @throws      PHPExcel_Writer_Exception
840         */
841        private function _writePageSetup(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
842        {
843                // pageSetup
844                $objWriter->startElement('pageSetup');
845                $objWriter->writeAttribute('paperSize',         $pSheet->getPageSetup()->getPaperSize());
846                $objWriter->writeAttribute('orientation',       $pSheet->getPageSetup()->getOrientation());
847
848                if (!is_null($pSheet->getPageSetup()->getScale())) {
849                        $objWriter->writeAttribute('scale',                              $pSheet->getPageSetup()->getScale());
850                }
851                if (!is_null($pSheet->getPageSetup()->getFitToHeight())) {
852                        $objWriter->writeAttribute('fitToHeight',                $pSheet->getPageSetup()->getFitToHeight());
853                } else {
854                        $objWriter->writeAttribute('fitToHeight',                '0');
855                }
856                if (!is_null($pSheet->getPageSetup()->getFitToWidth())) {
857                        $objWriter->writeAttribute('fitToWidth',                 $pSheet->getPageSetup()->getFitToWidth());
858                } else {
859                        $objWriter->writeAttribute('fitToWidth',                 '0');
860                }
861                if (!is_null($pSheet->getPageSetup()->getFirstPageNumber())) {
862                        $objWriter->writeAttribute('firstPageNumber',   $pSheet->getPageSetup()->getFirstPageNumber());
863                        $objWriter->writeAttribute('useFirstPageNumber', '1');
864                }
865
866                $objWriter->endElement();
867        }
868
869        /**
870         * Write Header / Footer
871         *
872         * @param       PHPExcel_Shared_XMLWriter               $objWriter              XML Writer
873         * @param       PHPExcel_Worksheet                              $pSheet                 Worksheet
874         * @throws      PHPExcel_Writer_Exception
875         */
876        private function _writeHeaderFooter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
877        {
878                // headerFooter
879                $objWriter->startElement('headerFooter');
880                $objWriter->writeAttribute('differentOddEven',  ($pSheet->getHeaderFooter()->getDifferentOddEven() ? 'true' : 'false'));
881                $objWriter->writeAttribute('differentFirst',    ($pSheet->getHeaderFooter()->getDifferentFirst() ? 'true' : 'false'));
882                $objWriter->writeAttribute('scaleWithDoc',              ($pSheet->getHeaderFooter()->getScaleWithDocument() ? 'true' : 'false'));
883                $objWriter->writeAttribute('alignWithMargins',  ($pSheet->getHeaderFooter()->getAlignWithMargins() ? 'true' : 'false'));
884
885                        $objWriter->writeElement('oddHeader',           $pSheet->getHeaderFooter()->getOddHeader());
886                        $objWriter->writeElement('oddFooter',           $pSheet->getHeaderFooter()->getOddFooter());
887                        $objWriter->writeElement('evenHeader',          $pSheet->getHeaderFooter()->getEvenHeader());
888                        $objWriter->writeElement('evenFooter',          $pSheet->getHeaderFooter()->getEvenFooter());
889                        $objWriter->writeElement('firstHeader', $pSheet->getHeaderFooter()->getFirstHeader());
890                        $objWriter->writeElement('firstFooter', $pSheet->getHeaderFooter()->getFirstFooter());
891                $objWriter->endElement();
892        }
893
894        /**
895         * Write Breaks
896         *
897         * @param       PHPExcel_Shared_XMLWriter               $objWriter              XML Writer
898         * @param       PHPExcel_Worksheet                              $pSheet                 Worksheet
899         * @throws      PHPExcel_Writer_Exception
900         */
901        private function _writeBreaks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
902        {
903                // Get row and column breaks
904                $aRowBreaks = array();
905                $aColumnBreaks = array();
906                foreach ($pSheet->getBreaks() as $cell => $breakType) {
907                        if ($breakType == PHPExcel_Worksheet::BREAK_ROW) {
908                                $aRowBreaks[] = $cell;
909                        } else if ($breakType == PHPExcel_Worksheet::BREAK_COLUMN) {
910                                $aColumnBreaks[] = $cell;
911                        }
912                }
913
914                // rowBreaks
915                if (!empty($aRowBreaks)) {
916                        $objWriter->startElement('rowBreaks');
917                        $objWriter->writeAttribute('count',                     count($aRowBreaks));
918                        $objWriter->writeAttribute('manualBreakCount',  count($aRowBreaks));
919
920                                foreach ($aRowBreaks as $cell) {
921                                        $coords = PHPExcel_Cell::coordinateFromString($cell);
922
923                                        $objWriter->startElement('brk');
924                                        $objWriter->writeAttribute('id',        $coords[1]);
925                                        $objWriter->writeAttribute('man',       '1');
926                                        $objWriter->endElement();
927                                }
928
929                        $objWriter->endElement();
930                }
931
932                // Second, write column breaks
933                if (!empty($aColumnBreaks)) {
934                        $objWriter->startElement('colBreaks');
935                        $objWriter->writeAttribute('count',                     count($aColumnBreaks));
936                        $objWriter->writeAttribute('manualBreakCount',  count($aColumnBreaks));
937
938                                foreach ($aColumnBreaks as $cell) {
939                                        $coords = PHPExcel_Cell::coordinateFromString($cell);
940
941                                        $objWriter->startElement('brk');
942                                        $objWriter->writeAttribute('id',        PHPExcel_Cell::columnIndexFromString($coords[0]) - 1);
943                                        $objWriter->writeAttribute('man',       '1');
944                                        $objWriter->endElement();
945                                }
946
947                        $objWriter->endElement();
948                }
949        }
950
951        /**
952         * Write SheetData
953         *
954         * @param       PHPExcel_Shared_XMLWriter               $objWriter              XML Writer
955         * @param       PHPExcel_Worksheet                              $pSheet                 Worksheet
956         * @param       string[]                                                $pStringTable   String table
957         * @throws      PHPExcel_Writer_Exception
958         */
959        private function _writeSheetData(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pStringTable = null)
960        {
961                if (is_array($pStringTable)) {
962                        // Flipped stringtable, for faster index searching
963                        $aFlippedStringTable = $this->getParentWriter()->getWriterPart('stringtable')->flipStringTable($pStringTable);
964
965                        // sheetData
966                        $objWriter->startElement('sheetData');
967
968                                // Get column count
969                                $colCount = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn());
970
971                                // Highest row number
972                                $highestRow = $pSheet->getHighestRow();
973
974                                // Loop through cells
975                                $cellsByRow = array();
976                                foreach ($pSheet->getCellCollection() as $cellID) {
977                                        $cellAddress = PHPExcel_Cell::coordinateFromString($cellID);
978                                        $cellsByRow[$cellAddress[1]][] = $cellID;
979                                }
980
981                                $currentRow = 0;
982                                while($currentRow++ < $highestRow) {
983                                        // Get row dimension
984                                        $rowDimension = $pSheet->getRowDimension($currentRow);
985
986                                        // Write current row?
987                                        $writeCurrentRow =      isset($cellsByRow[$currentRow]) ||
988                                                                                $rowDimension->getRowHeight() >= 0 ||
989                                                                                $rowDimension->getVisible() == false ||
990                                                                                $rowDimension->getCollapsed() == true ||
991                                                                                $rowDimension->getOutlineLevel() > 0 ||
992                                                                                $rowDimension->getXfIndex() !== null;
993
994                                        if ($writeCurrentRow) {
995                                                // Start a new row
996                                                $objWriter->startElement('row');
997                                                $objWriter->writeAttribute('r', $currentRow);
998                                                $objWriter->writeAttribute('spans',     '1:' . $colCount);
999
1000                                                // Row dimensions
1001                                                if ($rowDimension->getRowHeight() >= 0) {
1002                                                        $objWriter->writeAttribute('customHeight',      '1');
1003                                                        $objWriter->writeAttribute('ht',                        PHPExcel_Shared_String::FormatNumber($rowDimension->getRowHeight()));
1004                                                }
1005
1006                                                // Row visibility
1007                                                if ($rowDimension->getVisible() == false) {
1008                                                        $objWriter->writeAttribute('hidden',            'true');
1009                                                }
1010
1011                                                // Collapsed
1012                                                if ($rowDimension->getCollapsed() == true) {
1013                                                        $objWriter->writeAttribute('collapsed',         'true');
1014                                                }
1015
1016                                                // Outline level
1017                                                if ($rowDimension->getOutlineLevel() > 0) {
1018                                                        $objWriter->writeAttribute('outlineLevel',      $rowDimension->getOutlineLevel());
1019                                                }
1020
1021                                                // Style
1022                                                if ($rowDimension->getXfIndex() !== null) {
1023                                                        $objWriter->writeAttribute('s', $rowDimension->getXfIndex());
1024                                                        $objWriter->writeAttribute('customFormat', '1');
1025                                                }
1026
1027                                                // Write cells
1028                                                if (isset($cellsByRow[$currentRow])) {
1029                                                        foreach($cellsByRow[$currentRow] as $cellAddress) {
1030                                                                // Write cell
1031                                                                $this->_writeCell($objWriter, $pSheet, $cellAddress, $pStringTable, $aFlippedStringTable);
1032                                                        }
1033                                                }
1034
1035                                                // End row
1036                                                $objWriter->endElement();
1037                                        }
1038                                }
1039
1040                        $objWriter->endElement();
1041                } else {
1042                        throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
1043                }
1044        }
1045
1046        /**
1047         * Write Cell
1048         *
1049         * @param       PHPExcel_Shared_XMLWriter       $objWriter                              XML Writer
1050         * @param       PHPExcel_Worksheet                      $pSheet                                 Worksheet
1051         * @param       PHPExcel_Cell                           $pCellAddress                   Cell Address
1052         * @param       string[]                                        $pStringTable                   String table
1053         * @param       string[]                                        $pFlippedStringTable    String table (flipped), for faster index searching
1054         * @throws      PHPExcel_Writer_Exception
1055         */
1056        private function _writeCell(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pCellAddress = null, $pStringTable = null, $pFlippedStringTable = null)
1057        {
1058                if (is_array($pStringTable) && is_array($pFlippedStringTable)) {
1059                        // Cell
1060                        $pCell = $pSheet->getCell($pCellAddress);
1061                        $objWriter->startElement('c');
1062                        $objWriter->writeAttribute('r', $pCellAddress);
1063
1064                        // Sheet styles
1065                        if ($pCell->getXfIndex() != '') {
1066                                $objWriter->writeAttribute('s', $pCell->getXfIndex());
1067                        }
1068
1069                        // If cell value is supplied, write cell value
1070                        $cellValue = $pCell->getValue();
1071                        if (is_object($cellValue) || $cellValue !== '') {
1072                                // Map type
1073                                $mappedType = $pCell->getDataType();
1074
1075                                // Write data type depending on its type
1076                                switch (strtolower($mappedType)) {
1077                                        case 'inlinestr':       // Inline string
1078                                        case 's':                       // String
1079                                        case 'b':                       // Boolean
1080                                                $objWriter->writeAttribute('t', $mappedType);
1081                                                break;
1082                                        case 'f':                       // Formula
1083                                                $calculatedValue = ($this->getParentWriter()->getPreCalculateFormulas()) ?
1084                                                    $pCell->getCalculatedValue() :
1085                                                    $cellValue;
1086                                                if (is_string($calculatedValue)) {
1087                                                        $objWriter->writeAttribute('t', 'str');
1088                                                }
1089                                                break;
1090                                        case 'e':                       // Error
1091                                                $objWriter->writeAttribute('t', $mappedType);
1092                                }
1093
1094                                // Write data depending on its type
1095                                switch (strtolower($mappedType)) {
1096                                        case 'inlinestr':       // Inline string
1097                                                if (! $cellValue instanceof PHPExcel_RichText) {
1098                                                        $objWriter->writeElement('t', PHPExcel_Shared_String::ControlCharacterPHP2OOXML( htmlspecialchars($cellValue) ) );
1099                                                } else if ($cellValue instanceof PHPExcel_RichText) {
1100                                                        $objWriter->startElement('is');
1101                                                        $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $cellValue);
1102                                                        $objWriter->endElement();
1103                                                }
1104
1105                                                break;
1106                                        case 's':                       // String
1107                                                if (! $cellValue instanceof PHPExcel_RichText) {
1108                                                        if (isset($pFlippedStringTable[$cellValue])) {
1109                                                                $objWriter->writeElement('v', $pFlippedStringTable[$cellValue]);
1110                                                        }
1111                                                } else if ($cellValue instanceof PHPExcel_RichText) {
1112                                                        $objWriter->writeElement('v', $pFlippedStringTable[$cellValue->getHashCode()]);
1113                                                }
1114
1115                                                break;
1116                                        case 'f':                       // Formula
1117                                                $attributes = $pCell->getFormulaAttributes();
1118                                                if($attributes['t'] == 'array') {
1119                                                        $objWriter->startElement('f');
1120                                                        $objWriter->writeAttribute('t', 'array');
1121                                                        $objWriter->writeAttribute('ref', $pCellAddress);
1122                                                        $objWriter->writeAttribute('aca', '1');
1123                                                        $objWriter->writeAttribute('ca', '1');
1124                                                        $objWriter->text(substr($cellValue, 1));
1125                                                        $objWriter->endElement();
1126                                                } else {
1127                                                        $objWriter->writeElement('f', substr($cellValue, 1));
1128                                                }
1129                                                if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
1130                                                        if ($this->getParentWriter()->getPreCalculateFormulas()) {
1131//                                                              $calculatedValue = $pCell->getCalculatedValue();
1132                                                                if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') {
1133                                                                        $objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue));
1134                                                                } else {
1135                                                                        $objWriter->writeElement('v', '0');
1136                                                                }
1137                                                        } else {
1138                                                                $objWriter->writeElement('v', '0');
1139                                                        }
1140                                                }
1141                                                break;
1142                                        case 'n':                       // Numeric
1143                                                // force point as decimal separator in case current locale uses comma
1144                                                $objWriter->writeElement('v', str_replace(',', '.', $cellValue));
1145                                                break;
1146                                        case 'b':                       // Boolean
1147                                                $objWriter->writeElement('v', ($cellValue ? '1' : '0'));
1148                                                break;
1149                                        case 'e':                       // Error
1150                                                if (substr($cellValue, 0, 1) == '=') {
1151                                                        $objWriter->writeElement('f', substr($cellValue, 1));
1152                                                        $objWriter->writeElement('v', substr($cellValue, 1));
1153                                                } else {
1154                                                        $objWriter->writeElement('v', $cellValue);
1155                                                }
1156
1157                                                break;
1158                                }
1159                        }
1160
1161                        $objWriter->endElement();
1162                } else {
1163                        throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
1164                }
1165        }
1166
1167        /**
1168         * Write Drawings
1169         *
1170         * @param       PHPExcel_Shared_XMLWriter       $objWriter              XML Writer
1171         * @param       PHPExcel_Worksheet                      $pSheet                 Worksheet
1172         * @param       boolean                                         $includeCharts  Flag indicating if we should include drawing details for charts
1173         * @throws      PHPExcel_Writer_Exception
1174         */
1175        private function _writeDrawings(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $includeCharts = FALSE)
1176        {
1177                $chartCount = ($includeCharts) ? $pSheet->getChartCollection()->count() : 0;
1178                // If sheet contains drawings, add the relationships
1179                if (($pSheet->getDrawingCollection()->count() > 0) ||
1180                        ($chartCount > 0)) {
1181                        $objWriter->startElement('drawing');
1182                        $objWriter->writeAttribute('r:id', 'rId1');
1183                        $objWriter->endElement();
1184                }
1185        }
1186
1187        /**
1188         * Write LegacyDrawing
1189         *
1190         * @param       PHPExcel_Shared_XMLWriter               $objWriter              XML Writer
1191         * @param       PHPExcel_Worksheet                              $pSheet                 Worksheet
1192         * @throws      PHPExcel_Writer_Exception
1193         */
1194        private function _writeLegacyDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
1195        {
1196                // If sheet contains comments, add the relationships
1197                if (count($pSheet->getComments()) > 0) {
1198                        $objWriter->startElement('legacyDrawing');
1199                        $objWriter->writeAttribute('r:id', 'rId_comments_vml1');
1200                        $objWriter->endElement();
1201                }
1202        }
1203
1204        /**
1205         * Write LegacyDrawingHF
1206         *
1207         * @param       PHPExcel_Shared_XMLWriter               $objWriter              XML Writer
1208         * @param       PHPExcel_Worksheet                              $pSheet                 Worksheet
1209         * @throws      PHPExcel_Writer_Exception
1210         */
1211        private function _writeLegacyDrawingHF(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
1212        {
1213                // If sheet contains images, add the relationships
1214                if (count($pSheet->getHeaderFooter()->getImages()) > 0) {
1215                        $objWriter->startElement('legacyDrawingHF');
1216                        $objWriter->writeAttribute('r:id', 'rId_headerfooter_vml1');
1217                        $objWriter->endElement();
1218                }
1219        }
1220}
Note: See TracBrowser for help on using the repository browser.