1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28:
29: 30: 31: 32: 33: 34: 35:
36: class PHPExcel_Writer_Excel2007_Workbook extends PHPExcel_Writer_Excel2007_WriterPart
37: {
38: 39: 40: 41: 42: 43: 44: 45:
46: public function writeWorkbook(PHPExcel $pPHPExcel = null, $recalcRequired = FALSE)
47: {
48:
49: $objWriter = null;
50: if ($this->getParentWriter()->getUseDiskCaching()) {
51: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
52: } else {
53: $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
54: }
55:
56:
57: $objWriter->startDocument('1.0','UTF-8','yes');
58:
59:
60: $objWriter->startElement('workbook');
61: $objWriter->writeAttribute('xml:space', 'preserve');
62: $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
63: $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
64:
65:
66: $this->_writeFileVersion($objWriter);
67:
68:
69: $this->_writeWorkbookPr($objWriter);
70:
71:
72: $this->_writeWorkbookProtection($objWriter, $pPHPExcel);
73:
74:
75: if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
76: $this->_writeBookViews($objWriter, $pPHPExcel);
77: }
78:
79:
80: $this->_writeSheets($objWriter, $pPHPExcel);
81:
82:
83: $this->_writeDefinedNames($objWriter, $pPHPExcel);
84:
85:
86: $this->_writeCalcPr($objWriter,$recalcRequired);
87:
88: $objWriter->endElement();
89:
90:
91: return $objWriter->getData();
92: }
93:
94: 95: 96: 97: 98: 99:
100: private function _writeFileVersion(PHPExcel_Shared_XMLWriter $objWriter = null)
101: {
102: $objWriter->startElement('fileVersion');
103: $objWriter->writeAttribute('appName', 'xl');
104: $objWriter->writeAttribute('lastEdited', '4');
105: $objWriter->writeAttribute('lowestEdited', '4');
106: $objWriter->writeAttribute('rupBuild', '4505');
107: $objWriter->endElement();
108: }
109:
110: 111: 112: 113: 114: 115:
116: private function _writeWorkbookPr(PHPExcel_Shared_XMLWriter $objWriter = null)
117: {
118: $objWriter->startElement('workbookPr');
119:
120: if (PHPExcel_Shared_Date::getExcelCalendar() == PHPExcel_Shared_Date::CALENDAR_MAC_1904) {
121: $objWriter->writeAttribute('date1904', '1');
122: }
123:
124: $objWriter->writeAttribute('codeName', 'ThisWorkbook');
125:
126: $objWriter->endElement();
127: }
128:
129: 130: 131: 132: 133: 134: 135:
136: private function _writeBookViews(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)
137: {
138:
139: $objWriter->startElement('bookViews');
140:
141:
142: $objWriter->startElement('workbookView');
143:
144: $objWriter->writeAttribute('activeTab', $pPHPExcel->getActiveSheetIndex());
145: $objWriter->writeAttribute('autoFilterDateGrouping', '1');
146: $objWriter->writeAttribute('firstSheet', '0');
147: $objWriter->writeAttribute('minimized', '0');
148: $objWriter->writeAttribute('showHorizontalScroll', '1');
149: $objWriter->writeAttribute('showSheetTabs', '1');
150: $objWriter->writeAttribute('showVerticalScroll', '1');
151: $objWriter->writeAttribute('tabRatio', '600');
152: $objWriter->writeAttribute('visibility', 'visible');
153:
154: $objWriter->endElement();
155:
156: $objWriter->endElement();
157: }
158:
159: 160: 161: 162: 163: 164: 165:
166: private function _writeWorkbookProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)
167: {
168: if ($pPHPExcel->getSecurity()->isSecurityEnabled()) {
169: $objWriter->startElement('workbookProtection');
170: $objWriter->writeAttribute('lockRevision', ($pPHPExcel->getSecurity()->getLockRevision() ? 'true' : 'false'));
171: $objWriter->writeAttribute('lockStructure', ($pPHPExcel->getSecurity()->getLockStructure() ? 'true' : 'false'));
172: $objWriter->writeAttribute('lockWindows', ($pPHPExcel->getSecurity()->getLockWindows() ? 'true' : 'false'));
173:
174: if ($pPHPExcel->getSecurity()->getRevisionsPassword() != '') {
175: $objWriter->writeAttribute('revisionsPassword', $pPHPExcel->getSecurity()->getRevisionsPassword());
176: }
177:
178: if ($pPHPExcel->getSecurity()->getWorkbookPassword() != '') {
179: $objWriter->writeAttribute('workbookPassword', $pPHPExcel->getSecurity()->getWorkbookPassword());
180: }
181:
182: $objWriter->endElement();
183: }
184: }
185:
186: 187: 188: 189: 190: 191: 192:
193: private function _writeCalcPr(PHPExcel_Shared_XMLWriter $objWriter = null, $recalcRequired = TRUE)
194: {
195: $objWriter->startElement('calcPr');
196:
197:
198:
199:
200: $objWriter->writeAttribute('calcId', '999999');
201: $objWriter->writeAttribute('calcMode', 'auto');
202:
203: $objWriter->writeAttribute('calcCompleted', ($recalcRequired) ? 1 : 0);
204: $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? 0 : 1);
205:
206: $objWriter->endElement();
207: }
208:
209: 210: 211: 212: 213: 214: 215:
216: private function _writeSheets(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)
217: {
218:
219: $objWriter->startElement('sheets');
220: $sheetCount = $pPHPExcel->getSheetCount();
221: for ($i = 0; $i < $sheetCount; ++$i) {
222:
223: $this->_writeSheet(
224: $objWriter,
225: $pPHPExcel->getSheet($i)->getTitle(),
226: ($i + 1),
227: ($i + 1 + 3),
228: $pPHPExcel->getSheet($i)->getSheetState()
229: );
230: }
231:
232: $objWriter->endElement();
233: }
234:
235: 236: 237: 238: 239: 240: 241: 242: 243: 244:
245: private function _writeSheet(PHPExcel_Shared_XMLWriter $objWriter = null, $pSheetname = '', $pSheetId = 1, $pRelId = 1, $sheetState = 'visible')
246: {
247: if ($pSheetname != '') {
248:
249: $objWriter->startElement('sheet');
250: $objWriter->writeAttribute('name', $pSheetname);
251: $objWriter->writeAttribute('sheetId', $pSheetId);
252: if ($sheetState != 'visible' && $sheetState != '') {
253: $objWriter->writeAttribute('state', $sheetState);
254: }
255: $objWriter->writeAttribute('r:id', 'rId' . $pRelId);
256: $objWriter->endElement();
257: } else {
258: throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
259: }
260: }
261:
262: 263: 264: 265: 266: 267: 268:
269: private function _writeDefinedNames(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null)
270: {
271:
272: $objWriter->startElement('definedNames');
273:
274:
275: if (count($pPHPExcel->getNamedRanges()) > 0) {
276:
277: $this->_writeNamedRanges($objWriter, $pPHPExcel);
278: }
279:
280:
281: $sheetCount = $pPHPExcel->getSheetCount();
282: for ($i = 0; $i < $sheetCount; ++$i) {
283:
284: $this->_writeDefinedNameForAutofilter($objWriter, $pPHPExcel->getSheet($i), $i);
285:
286:
287: $this->_writeDefinedNameForPrintTitles($objWriter, $pPHPExcel->getSheet($i), $i);
288:
289:
290: $this->_writeDefinedNameForPrintArea($objWriter, $pPHPExcel->getSheet($i), $i);
291: }
292:
293: $objWriter->endElement();
294: }
295:
296: 297: 298: 299: 300: 301: 302:
303: private function _writeNamedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel)
304: {
305:
306: $namedRanges = $pPHPExcel->getNamedRanges();
307: foreach ($namedRanges as $namedRange) {
308: $this->_writeDefinedNameForNamedRange($objWriter, $namedRange);
309: }
310: }
311:
312: 313: 314: 315: 316: 317: 318:
319: private function _writeDefinedNameForNamedRange(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_NamedRange $pNamedRange)
320: {
321:
322: $objWriter->startElement('definedName');
323: $objWriter->writeAttribute('name', $pNamedRange->getName());
324: if ($pNamedRange->getLocalOnly()) {
325: $objWriter->writeAttribute('localSheetId', $pNamedRange->getScope()->getParent()->getIndex($pNamedRange->getScope()));
326: }
327:
328:
329: $range = PHPExcel_Cell::splitRange($pNamedRange->getRange());
330: for ($i = 0; $i < count($range); $i++) {
331: $range[$i][0] = '\'' . str_replace("'", "''", $pNamedRange->getWorksheet()->getTitle()) . '\'!' . PHPExcel_Cell::absoluteReference($range[$i][0]);
332: if (isset($range[$i][1])) {
333: $range[$i][1] = PHPExcel_Cell::absoluteReference($range[$i][1]);
334: }
335: }
336: $range = PHPExcel_Cell::buildRange($range);
337:
338: $objWriter->writeRawData($range);
339:
340: $objWriter->endElement();
341: }
342:
343: 344: 345: 346: 347: 348: 349: 350:
351: private function _writeDefinedNameForAutofilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0)
352: {
353:
354: $autoFilterRange = $pSheet->getAutoFilter()->getRange();
355: if (!empty($autoFilterRange)) {
356: $objWriter->startElement('definedName');
357: $objWriter->writeAttribute('name', '_xlnm._FilterDatabase');
358: $objWriter->writeAttribute('localSheetId', $pSheetId);
359: $objWriter->writeAttribute('hidden', '1');
360:
361:
362: $range = PHPExcel_Cell::splitRange($autoFilterRange);
363: $range = $range[0];
364:
365: if (strpos($range[0],'!') !== false) {
366: list($ws,$range[0]) = explode('!',$range[0]);
367: }
368:
369: $range[0] = PHPExcel_Cell::absoluteCoordinate($range[0]);
370: $range[1] = PHPExcel_Cell::absoluteCoordinate($range[1]);
371: $range = implode(':', $range);
372:
373: $objWriter->writeRawData('\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . $range);
374:
375: $objWriter->endElement();
376: }
377: }
378:
379: 380: 381: 382: 383: 384: 385: 386:
387: private function _writeDefinedNameForPrintTitles(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0)
388: {
389:
390: if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet() || $pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) {
391: $objWriter->startElement('definedName');
392: $objWriter->writeAttribute('name', '_xlnm.Print_Titles');
393: $objWriter->writeAttribute('localSheetId', $pSheetId);
394:
395:
396: $settingString = '';
397:
398:
399: if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) {
400: $repeat = $pSheet->getPageSetup()->getColumnsToRepeatAtLeft();
401:
402: $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1];
403: }
404:
405:
406: if ($pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) {
407: if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) {
408: $settingString .= ',';
409: }
410:
411: $repeat = $pSheet->getPageSetup()->getRowsToRepeatAtTop();
412:
413: $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1];
414: }
415:
416: $objWriter->writeRawData($settingString);
417:
418: $objWriter->endElement();
419: }
420: }
421:
422: 423: 424: 425: 426: 427: 428: 429:
430: private function _writeDefinedNameForPrintArea(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0)
431: {
432:
433: if ($pSheet->getPageSetup()->isPrintAreaSet()) {
434: $objWriter->startElement('definedName');
435: $objWriter->writeAttribute('name', '_xlnm.Print_Area');
436: $objWriter->writeAttribute('localSheetId', $pSheetId);
437:
438:
439: $settingString = '';
440:
441:
442: $printArea = PHPExcel_Cell::splitRange($pSheet->getPageSetup()->getPrintArea());
443:
444: $chunks = array();
445: foreach ($printArea as $printAreaRect) {
446: $printAreaRect[0] = PHPExcel_Cell::absoluteReference($printAreaRect[0]);
447: $printAreaRect[1] = PHPExcel_Cell::absoluteReference($printAreaRect[1]);
448: $chunks[] = '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . implode(':', $printAreaRect);
449: }
450:
451: $objWriter->writeRawData(implode(',', $chunks));
452:
453: $objWriter->endElement();
454: }
455: }
456: }
457: