StringTable.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. class PHPExcel_Writer_Excel2007_StringTable extends PHPExcel_Writer_Excel2007_WriterPart
  8. {
  9. /**
  10. * Create worksheet stringtable
  11. *
  12. * @param PHPExcel_Worksheet $pSheet Worksheet
  13. * @param string[] $pExistingTable Existing table to eventually merge with
  14. * @return string[] String table for worksheet
  15. * @throws PHPExcel_Writer_Exception
  16. */
  17. public function createStringTable($pSheet = null, $pExistingTable = null)
  18. {
  19. if ($pSheet !== null) {
  20. // Create string lookup table
  21. $aStringTable = array();
  22. $cellCollection = null;
  23. $aFlippedStringTable = null; // For faster lookup
  24. // Is an existing table given?
  25. if (($pExistingTable !== null) && is_array($pExistingTable)) {
  26. $aStringTable = $pExistingTable;
  27. }
  28. // Fill index array
  29. $aFlippedStringTable = $this->flipStringTable($aStringTable);
  30. // Loop through cells
  31. foreach ($pSheet->getCellCollection() as $cellID) {
  32. $cell = $pSheet->getCell($cellID);
  33. $cellValue = $cell->getValue();
  34. if (!is_object($cellValue) &&
  35. ($cellValue !== null) &&
  36. $cellValue !== '' &&
  37. !isset($aFlippedStringTable[$cellValue]) &&
  38. ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING2 || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_NULL)) {
  39. $aStringTable[] = $cellValue;
  40. $aFlippedStringTable[$cellValue] = true;
  41. } elseif ($cellValue instanceof PHPExcel_RichText &&
  42. ($cellValue !== null) &&
  43. !isset($aFlippedStringTable[$cellValue->getHashCode()])) {
  44. $aStringTable[] = $cellValue;
  45. $aFlippedStringTable[$cellValue->getHashCode()] = true;
  46. }
  47. }
  48. return $aStringTable;
  49. } else {
  50. throw new PHPExcel_Writer_Exception("Invalid PHPExcel_Worksheet object passed.");
  51. }
  52. }
  53. /**
  54. * Write string table to XML format
  55. *
  56. * @param string[] $pStringTable
  57. * @return string XML Output
  58. * @throws PHPExcel_Writer_Exception
  59. */
  60. public function writeStringTable($pStringTable = null)
  61. {
  62. if ($pStringTable !== null) {
  63. // Create XML writer
  64. $objWriter = null;
  65. if ($this->getParentWriter()->getUseDiskCaching()) {
  66. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  67. } else {
  68. $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
  69. }
  70. // XML header
  71. $objWriter->startDocument('1.0', 'UTF-8', 'yes');
  72. // String table
  73. $objWriter->startElement('sst');
  74. $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
  75. $objWriter->writeAttribute('uniqueCount', count($pStringTable));
  76. // Loop through string table
  77. foreach ($pStringTable as $textElement) {
  78. $objWriter->startElement('si');
  79. if (! $textElement instanceof PHPExcel_RichText) {
  80. $textToWrite = PHPExcel_Shared_String::ControlCharacterPHP2OOXML($textElement);
  81. $objWriter->startElement('t');
  82. if ($textToWrite !== trim($textToWrite)) {
  83. $objWriter->writeAttribute('xml:space', 'preserve');
  84. }
  85. $objWriter->writeRawData($textToWrite);
  86. $objWriter->endElement();
  87. } elseif ($textElement instanceof PHPExcel_RichText) {
  88. $this->writeRichText($objWriter, $textElement);
  89. }
  90. $objWriter->endElement();
  91. }
  92. $objWriter->endElement();
  93. return $objWriter->getData();
  94. } else {
  95. throw new PHPExcel_Writer_Exception("Invalid string table array passed.");
  96. }
  97. }
  98. /**
  99. * Write Rich Text
  100. *
  101. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  102. * @param PHPExcel_RichText $pRichText Rich text
  103. * @param string $prefix Optional Namespace prefix
  104. * @throws PHPExcel_Writer_Exception
  105. */
  106. public function writeRichText(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_RichText $pRichText = null, $prefix = null)
  107. {
  108. if ($prefix !== null) {
  109. $prefix .= ':';
  110. }
  111. // Loop through rich text elements
  112. $elements = $pRichText->getRichTextElements();
  113. foreach ($elements as $element) {
  114. // r
  115. $objWriter->startElement($prefix.'r');
  116. // rPr
  117. if ($element instanceof PHPExcel_RichText_Run) {
  118. // rPr
  119. $objWriter->startElement($prefix.'rPr');
  120. // rFont
  121. $objWriter->startElement($prefix.'rFont');
  122. $objWriter->writeAttribute('val', $element->getFont()->getName());
  123. $objWriter->endElement();
  124. // Bold
  125. $objWriter->startElement($prefix.'b');
  126. $objWriter->writeAttribute('val', ($element->getFont()->getBold() ? 'true' : 'false'));
  127. $objWriter->endElement();
  128. // Italic
  129. $objWriter->startElement($prefix.'i');
  130. $objWriter->writeAttribute('val', ($element->getFont()->getItalic() ? 'true' : 'false'));
  131. $objWriter->endElement();
  132. // Superscript / subscript
  133. if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) {
  134. $objWriter->startElement($prefix.'vertAlign');
  135. if ($element->getFont()->getSuperScript()) {
  136. $objWriter->writeAttribute('val', 'superscript');
  137. } elseif ($element->getFont()->getSubScript()) {
  138. $objWriter->writeAttribute('val', 'subscript');
  139. }
  140. $objWriter->endElement();
  141. }
  142. // Strikethrough
  143. $objWriter->startElement($prefix.'strike');
  144. $objWriter->writeAttribute('val', ($element->getFont()->getStrikethrough() ? 'true' : 'false'));
  145. $objWriter->endElement();
  146. // Color
  147. $objWriter->startElement($prefix.'color');
  148. $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB());
  149. $objWriter->endElement();
  150. // Size
  151. $objWriter->startElement($prefix.'sz');
  152. $objWriter->writeAttribute('val', $element->getFont()->getSize());
  153. $objWriter->endElement();
  154. // Underline
  155. $objWriter->startElement($prefix.'u');
  156. $objWriter->writeAttribute('val', $element->getFont()->getUnderline());
  157. $objWriter->endElement();
  158. $objWriter->endElement();
  159. }
  160. // t
  161. $objWriter->startElement($prefix.'t');
  162. $objWriter->writeAttribute('xml:space', 'preserve');
  163. $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText()));
  164. $objWriter->endElement();
  165. $objWriter->endElement();
  166. }
  167. }
  168. /**
  169. * Write Rich Text
  170. *
  171. * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
  172. * @param string|PHPExcel_RichText $pRichText text string or Rich text
  173. * @param string $prefix Optional Namespace prefix
  174. * @throws PHPExcel_Writer_Exception
  175. */
  176. public function writeRichTextForCharts(PHPExcel_Shared_XMLWriter $objWriter = null, $pRichText = null, $prefix = null)
  177. {
  178. if (!$pRichText instanceof PHPExcel_RichText) {
  179. $textRun = $pRichText;
  180. $pRichText = new PHPExcel_RichText();
  181. $pRichText->createTextRun($textRun);
  182. }
  183. if ($prefix !== null) {
  184. $prefix .= ':';
  185. }
  186. // Loop through rich text elements
  187. $elements = $pRichText->getRichTextElements();
  188. foreach ($elements as $element) {
  189. // r
  190. $objWriter->startElement($prefix.'r');
  191. // rPr
  192. $objWriter->startElement($prefix.'rPr');
  193. // Bold
  194. $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 1 : 0));
  195. // Italic
  196. $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 1 : 0));
  197. // Underline
  198. $underlineType = $element->getFont()->getUnderline();
  199. switch ($underlineType) {
  200. case 'single':
  201. $underlineType = 'sng';
  202. break;
  203. case 'double':
  204. $underlineType = 'dbl';
  205. break;
  206. }
  207. $objWriter->writeAttribute('u', $underlineType);
  208. // Strikethrough
  209. $objWriter->writeAttribute('strike', ($element->getFont()->getStrikethrough() ? 'sngStrike' : 'noStrike'));
  210. // rFont
  211. $objWriter->startElement($prefix.'latin');
  212. $objWriter->writeAttribute('typeface', $element->getFont()->getName());
  213. $objWriter->endElement();
  214. // Superscript / subscript
  215. // if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) {
  216. // $objWriter->startElement($prefix.'vertAlign');
  217. // if ($element->getFont()->getSuperScript()) {
  218. // $objWriter->writeAttribute('val', 'superscript');
  219. // } elseif ($element->getFont()->getSubScript()) {
  220. // $objWriter->writeAttribute('val', 'subscript');
  221. // }
  222. // $objWriter->endElement();
  223. // }
  224. //
  225. $objWriter->endElement();
  226. // t
  227. $objWriter->startElement($prefix.'t');
  228. // $objWriter->writeAttribute('xml:space', 'preserve'); // Excel2010 accepts, Excel2007 complains
  229. $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText()));
  230. $objWriter->endElement();
  231. $objWriter->endElement();
  232. }
  233. }
  234. /**
  235. * Flip string table (for index searching)
  236. *
  237. * @param array $stringTable Stringtable
  238. * @return array
  239. */
  240. public function flipStringTable($stringTable = array())
  241. {
  242. // Return value
  243. $returnValue = array();
  244. // Loop through stringtable and add flipped items to $returnValue
  245. foreach ($stringTable as $key => $value) {
  246. if (! $value instanceof PHPExcel_RichText) {
  247. $returnValue[$value] = $key;
  248. } elseif ($value instanceof PHPExcel_RichText) {
  249. $returnValue[$value->getHashCode()] = $key;
  250. }
  251. }
  252. return $returnValue;
  253. }
  254. }