Content.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. /**
  8. * PHPExcel_Writer_OpenDocument_Content
  9. *
  10. * @category PHPExcel
  11. * @package PHPExcel_Writer_OpenDocument
  12. * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel)
  13. * @author Alexander Pervakov <frost-nzcr4@jagmort.com>
  14. */
  15. class PHPExcel_Writer_OpenDocument_Content extends PHPExcel_Writer_OpenDocument_WriterPart
  16. {
  17. const NUMBER_COLS_REPEATED_MAX = 1024;
  18. const NUMBER_ROWS_REPEATED_MAX = 1048576;
  19. /**
  20. * Write content.xml to XML format
  21. *
  22. * @param PHPExcel $pPHPExcel
  23. * @return string XML Output
  24. * @throws PHPExcel_Writer_Exception
  25. */
  26. public function write(PHPExcel $pPHPExcel = null)
  27. {
  28. if (!$pPHPExcel) {
  29. $pPHPExcel = $this->getParentWriter()->getPHPExcel(); /* @var $pPHPExcel PHPExcel */
  30. }
  31. $objWriter = null;
  32. if ($this->getParentWriter()->getUseDiskCaching()) {
  33. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  34. } else {
  35. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
  36. }
  37. // XML header
  38. $objWriter->startDocument('1.0', 'UTF-8');
  39. // Content
  40. $objWriter->startElement('office:document-content');
  41. $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');
  42. $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0');
  43. $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0');
  44. $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0');
  45. $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0');
  46. $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0');
  47. $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
  48. $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');
  49. $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0');
  50. $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0');
  51. $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0');
  52. $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0');
  53. $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0');
  54. $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0');
  55. $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML');
  56. $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0');
  57. $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0');
  58. $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office');
  59. $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer');
  60. $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc');
  61. $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events');
  62. $objWriter->writeAttribute('xmlns:xforms', 'http://www.w3.org/2002/xforms');
  63. $objWriter->writeAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema');
  64. $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
  65. $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report');
  66. $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2');
  67. $objWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml');
  68. $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#');
  69. $objWriter->writeAttribute('xmlns:tableooo', 'http://openoffice.org/2009/table');
  70. $objWriter->writeAttribute('xmlns:field', 'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0');
  71. $objWriter->writeAttribute('xmlns:formx', 'urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0');
  72. $objWriter->writeAttribute('xmlns:css3t', 'http://www.w3.org/TR/css3-text/');
  73. $objWriter->writeAttribute('office:version', '1.2');
  74. $objWriter->writeElement('office:scripts');
  75. $objWriter->writeElement('office:font-face-decls');
  76. $objWriter->writeElement('office:automatic-styles');
  77. $objWriter->startElement('office:body');
  78. $objWriter->startElement('office:spreadsheet');
  79. $objWriter->writeElement('table:calculation-settings');
  80. $this->writeSheets($objWriter);
  81. $objWriter->writeElement('table:named-expressions');
  82. $objWriter->endElement();
  83. $objWriter->endElement();
  84. $objWriter->endElement();
  85. return $objWriter->getData();
  86. }
  87. /**
  88. * Write sheets
  89. *
  90. * @param PHPExcel_Shared_XMLWriter $objWriter
  91. */
  92. private function writeSheets(PHPExcel_Shared_XMLWriter $objWriter)
  93. {
  94. $pPHPExcel = $this->getParentWriter()->getPHPExcel(); /* @var $pPHPExcel PHPExcel */
  95. $sheet_count = $pPHPExcel->getSheetCount();
  96. for ($i = 0; $i < $sheet_count; $i++) {
  97. //$this->getWriterPart('Worksheet')->writeWorksheet());
  98. $objWriter->startElement('table:table');
  99. $objWriter->writeAttribute('table:name', $pPHPExcel->getSheet($i)->getTitle());
  100. $objWriter->writeElement('office:forms');
  101. $objWriter->startElement('table:table-column');
  102. $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX);
  103. $objWriter->endElement();
  104. $this->writeRows($objWriter, $pPHPExcel->getSheet($i));
  105. $objWriter->endElement();
  106. }
  107. }
  108. /**
  109. * Write rows of the specified sheet
  110. *
  111. * @param PHPExcel_Shared_XMLWriter $objWriter
  112. * @param PHPExcel_Worksheet $sheet
  113. */
  114. private function writeRows(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Worksheet $sheet)
  115. {
  116. $number_rows_repeated = self::NUMBER_ROWS_REPEATED_MAX;
  117. $span_row = 0;
  118. $rows = $sheet->getRowIterator();
  119. while ($rows->valid()) {
  120. $number_rows_repeated--;
  121. $row = $rows->current();
  122. if ($row->getCellIterator()->valid()) {
  123. if ($span_row) {
  124. $objWriter->startElement('table:table-row');
  125. if ($span_row > 1) {
  126. $objWriter->writeAttribute('table:number-rows-repeated', $span_row);
  127. }
  128. $objWriter->startElement('table:table-cell');
  129. $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX);
  130. $objWriter->endElement();
  131. $objWriter->endElement();
  132. $span_row = 0;
  133. }
  134. $objWriter->startElement('table:table-row');
  135. $this->writeCells($objWriter, $row);
  136. $objWriter->endElement();
  137. } else {
  138. $span_row++;
  139. }
  140. $rows->next();
  141. }
  142. }
  143. /**
  144. * Write cells of the specified row
  145. *
  146. * @param PHPExcel_Shared_XMLWriter $objWriter
  147. * @param PHPExcel_Worksheet_Row $row
  148. * @throws PHPExcel_Writer_Exception
  149. */
  150. private function writeCells(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Worksheet_Row $row)
  151. {
  152. $number_cols_repeated = self::NUMBER_COLS_REPEATED_MAX;
  153. $prev_column = -1;
  154. $cells = $row->getCellIterator();
  155. while ($cells->valid()) {
  156. $cell = $cells->current();
  157. $column = PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1;
  158. $this->writeCellSpan($objWriter, $column, $prev_column);
  159. $objWriter->startElement('table:table-cell');
  160. switch ($cell->getDataType()) {
  161. case PHPExcel_Cell_DataType::TYPE_BOOL:
  162. $objWriter->writeAttribute('office:value-type', 'boolean');
  163. $objWriter->writeAttribute('office:value', $cell->getValue());
  164. $objWriter->writeElement('text:p', $cell->getValue());
  165. break;
  166. case PHPExcel_Cell_DataType::TYPE_ERROR:
  167. throw new PHPExcel_Writer_Exception('Writing of error not implemented yet.');
  168. break;
  169. case PHPExcel_Cell_DataType::TYPE_FORMULA:
  170. try {
  171. $formula_value = $cell->getCalculatedValue();
  172. } catch (Exception $e) {
  173. $formula_value = $cell->getValue();
  174. }
  175. $objWriter->writeAttribute('table:formula', 'of:' . $cell->getValue());
  176. if (is_numeric($formula_value)) {
  177. $objWriter->writeAttribute('office:value-type', 'float');
  178. } else {
  179. $objWriter->writeAttribute('office:value-type', 'string');
  180. }
  181. $objWriter->writeAttribute('office:value', $formula_value);
  182. $objWriter->writeElement('text:p', $formula_value);
  183. break;
  184. case PHPExcel_Cell_DataType::TYPE_INLINE:
  185. throw new PHPExcel_Writer_Exception('Writing of inline not implemented yet.');
  186. break;
  187. case PHPExcel_Cell_DataType::TYPE_NUMERIC:
  188. $objWriter->writeAttribute('office:value-type', 'float');
  189. $objWriter->writeAttribute('office:value', $cell->getValue());
  190. $objWriter->writeElement('text:p', $cell->getValue());
  191. break;
  192. case PHPExcel_Cell_DataType::TYPE_STRING:
  193. $objWriter->writeAttribute('office:value-type', 'string');
  194. $objWriter->writeElement('text:p', $cell->getValue());
  195. break;
  196. }
  197. PHPExcel_Writer_OpenDocument_Cell_Comment::write($objWriter, $cell);
  198. $objWriter->endElement();
  199. $prev_column = $column;
  200. $cells->next();
  201. }
  202. $number_cols_repeated = $number_cols_repeated - $prev_column - 1;
  203. if ($number_cols_repeated > 0) {
  204. if ($number_cols_repeated > 1) {
  205. $objWriter->startElement('table:table-cell');
  206. $objWriter->writeAttribute('table:number-columns-repeated', $number_cols_repeated);
  207. $objWriter->endElement();
  208. } else {
  209. $objWriter->writeElement('table:table-cell');
  210. }
  211. }
  212. }
  213. /**
  214. * Write span
  215. *
  216. * @param PHPExcel_Shared_XMLWriter $objWriter
  217. * @param integer $curColumn
  218. * @param integer $prevColumn
  219. */
  220. private function writeCellSpan(PHPExcel_Shared_XMLWriter $objWriter, $curColumn, $prevColumn)
  221. {
  222. $diff = $curColumn - $prevColumn - 1;
  223. if (1 === $diff) {
  224. $objWriter->writeElement('table:table-cell');
  225. } elseif ($diff > 1) {
  226. $objWriter->startElement('table:table-cell');
  227. $objWriter->writeAttribute('table:number-columns-repeated', $diff);
  228. $objWriter->endElement();
  229. }
  230. }
  231. }