Style.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  3. use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
  4. use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
  5. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  6. use PhpOffice\PhpSpreadsheet\Style\Border;
  7. use PhpOffice\PhpSpreadsheet\Style\Borders;
  8. use PhpOffice\PhpSpreadsheet\Style\Conditional;
  9. use PhpOffice\PhpSpreadsheet\Style\Fill;
  10. use PhpOffice\PhpSpreadsheet\Style\Font;
  11. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  12. use PhpOffice\PhpSpreadsheet\Style\Protection;
  13. class Style extends WriterPart
  14. {
  15. /**
  16. * Write styles to XML format.
  17. *
  18. * @param Spreadsheet $spreadsheet
  19. *
  20. * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
  21. *
  22. * @return string XML Output
  23. */
  24. public function writeStyles(Spreadsheet $spreadsheet)
  25. {
  26. // Create XML writer
  27. $objWriter = null;
  28. if ($this->getParentWriter()->getUseDiskCaching()) {
  29. $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  30. } else {
  31. $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
  32. }
  33. // XML header
  34. $objWriter->startDocument('1.0', 'UTF-8', 'yes');
  35. // styleSheet
  36. $objWriter->startElement('styleSheet');
  37. $objWriter->writeAttribute('xml:space', 'preserve');
  38. $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
  39. // numFmts
  40. $objWriter->startElement('numFmts');
  41. $objWriter->writeAttribute('count', $this->getParentWriter()->getNumFmtHashTable()->count());
  42. // numFmt
  43. for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) {
  44. $this->writeNumFmt($objWriter, $this->getParentWriter()->getNumFmtHashTable()->getByIndex($i), $i);
  45. }
  46. $objWriter->endElement();
  47. // fonts
  48. $objWriter->startElement('fonts');
  49. $objWriter->writeAttribute('count', $this->getParentWriter()->getFontHashTable()->count());
  50. // font
  51. for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) {
  52. $this->writeFont($objWriter, $this->getParentWriter()->getFontHashTable()->getByIndex($i));
  53. }
  54. $objWriter->endElement();
  55. // fills
  56. $objWriter->startElement('fills');
  57. $objWriter->writeAttribute('count', $this->getParentWriter()->getFillHashTable()->count());
  58. // fill
  59. for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) {
  60. $this->writeFill($objWriter, $this->getParentWriter()->getFillHashTable()->getByIndex($i));
  61. }
  62. $objWriter->endElement();
  63. // borders
  64. $objWriter->startElement('borders');
  65. $objWriter->writeAttribute('count', $this->getParentWriter()->getBordersHashTable()->count());
  66. // border
  67. for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) {
  68. $this->writeBorder($objWriter, $this->getParentWriter()->getBordersHashTable()->getByIndex($i));
  69. }
  70. $objWriter->endElement();
  71. // cellStyleXfs
  72. $objWriter->startElement('cellStyleXfs');
  73. $objWriter->writeAttribute('count', 1);
  74. // xf
  75. $objWriter->startElement('xf');
  76. $objWriter->writeAttribute('numFmtId', 0);
  77. $objWriter->writeAttribute('fontId', 0);
  78. $objWriter->writeAttribute('fillId', 0);
  79. $objWriter->writeAttribute('borderId', 0);
  80. $objWriter->endElement();
  81. $objWriter->endElement();
  82. // cellXfs
  83. $objWriter->startElement('cellXfs');
  84. $objWriter->writeAttribute('count', count($spreadsheet->getCellXfCollection()));
  85. // xf
  86. foreach ($spreadsheet->getCellXfCollection() as $cellXf) {
  87. $this->writeCellStyleXf($objWriter, $cellXf, $spreadsheet);
  88. }
  89. $objWriter->endElement();
  90. // cellStyles
  91. $objWriter->startElement('cellStyles');
  92. $objWriter->writeAttribute('count', 1);
  93. // cellStyle
  94. $objWriter->startElement('cellStyle');
  95. $objWriter->writeAttribute('name', 'Normal');
  96. $objWriter->writeAttribute('xfId', 0);
  97. $objWriter->writeAttribute('builtinId', 0);
  98. $objWriter->endElement();
  99. $objWriter->endElement();
  100. // dxfs
  101. $objWriter->startElement('dxfs');
  102. $objWriter->writeAttribute('count', $this->getParentWriter()->getStylesConditionalHashTable()->count());
  103. // dxf
  104. for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) {
  105. $this->writeCellStyleDxf($objWriter, $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i)->getStyle());
  106. }
  107. $objWriter->endElement();
  108. // tableStyles
  109. $objWriter->startElement('tableStyles');
  110. $objWriter->writeAttribute('defaultTableStyle', 'TableStyleMedium9');
  111. $objWriter->writeAttribute('defaultPivotStyle', 'PivotTableStyle1');
  112. $objWriter->endElement();
  113. $objWriter->endElement();
  114. // Return
  115. return $objWriter->getData();
  116. }
  117. /**
  118. * Write Fill.
  119. *
  120. * @param XMLWriter $objWriter XML Writer
  121. * @param Fill $pFill Fill style
  122. */
  123. private function writeFill(XMLWriter $objWriter, Fill $pFill)
  124. {
  125. // Check if this is a pattern type or gradient type
  126. if ($pFill->getFillType() === Fill::FILL_GRADIENT_LINEAR ||
  127. $pFill->getFillType() === Fill::FILL_GRADIENT_PATH) {
  128. // Gradient fill
  129. $this->writeGradientFill($objWriter, $pFill);
  130. } elseif ($pFill->getFillType() !== null) {
  131. // Pattern fill
  132. $this->writePatternFill($objWriter, $pFill);
  133. }
  134. }
  135. /**
  136. * Write Gradient Fill.
  137. *
  138. * @param XMLWriter $objWriter XML Writer
  139. * @param Fill $pFill Fill style
  140. */
  141. private function writeGradientFill(XMLWriter $objWriter, Fill $pFill)
  142. {
  143. // fill
  144. $objWriter->startElement('fill');
  145. // gradientFill
  146. $objWriter->startElement('gradientFill');
  147. $objWriter->writeAttribute('type', $pFill->getFillType());
  148. $objWriter->writeAttribute('degree', $pFill->getRotation());
  149. // stop
  150. $objWriter->startElement('stop');
  151. $objWriter->writeAttribute('position', '0');
  152. // color
  153. $objWriter->startElement('color');
  154. $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB());
  155. $objWriter->endElement();
  156. $objWriter->endElement();
  157. // stop
  158. $objWriter->startElement('stop');
  159. $objWriter->writeAttribute('position', '1');
  160. // color
  161. $objWriter->startElement('color');
  162. $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB());
  163. $objWriter->endElement();
  164. $objWriter->endElement();
  165. $objWriter->endElement();
  166. $objWriter->endElement();
  167. }
  168. /**
  169. * Write Pattern Fill.
  170. *
  171. * @param XMLWriter $objWriter XML Writer
  172. * @param Fill $pFill Fill style
  173. */
  174. private function writePatternFill(XMLWriter $objWriter, Fill $pFill)
  175. {
  176. // fill
  177. $objWriter->startElement('fill');
  178. // patternFill
  179. $objWriter->startElement('patternFill');
  180. $objWriter->writeAttribute('patternType', $pFill->getFillType());
  181. if ($pFill->getFillType() !== Fill::FILL_NONE) {
  182. // fgColor
  183. if ($pFill->getStartColor()->getARGB()) {
  184. $objWriter->startElement('fgColor');
  185. $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB());
  186. $objWriter->endElement();
  187. }
  188. }
  189. if ($pFill->getFillType() !== Fill::FILL_NONE) {
  190. // bgColor
  191. if ($pFill->getEndColor()->getARGB()) {
  192. $objWriter->startElement('bgColor');
  193. $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB());
  194. $objWriter->endElement();
  195. }
  196. }
  197. $objWriter->endElement();
  198. $objWriter->endElement();
  199. }
  200. /**
  201. * Write Font.
  202. *
  203. * @param XMLWriter $objWriter XML Writer
  204. * @param Font $pFont Font style
  205. */
  206. private function writeFont(XMLWriter $objWriter, Font $pFont)
  207. {
  208. // font
  209. $objWriter->startElement('font');
  210. // Weird! The order of these elements actually makes a difference when opening Xlsx
  211. // files in Excel2003 with the compatibility pack. It's not documented behaviour,
  212. // and makes for a real WTF!
  213. // Bold. We explicitly write this element also when false (like MS Office Excel 2007 does
  214. // for conditional formatting). Otherwise it will apparently not be picked up in conditional
  215. // formatting style dialog
  216. if ($pFont->getBold() !== null) {
  217. $objWriter->startElement('b');
  218. $objWriter->writeAttribute('val', $pFont->getBold() ? '1' : '0');
  219. $objWriter->endElement();
  220. }
  221. // Italic
  222. if ($pFont->getItalic() !== null) {
  223. $objWriter->startElement('i');
  224. $objWriter->writeAttribute('val', $pFont->getItalic() ? '1' : '0');
  225. $objWriter->endElement();
  226. }
  227. // Strikethrough
  228. if ($pFont->getStrikethrough() !== null) {
  229. $objWriter->startElement('strike');
  230. $objWriter->writeAttribute('val', $pFont->getStrikethrough() ? '1' : '0');
  231. $objWriter->endElement();
  232. }
  233. // Underline
  234. if ($pFont->getUnderline() !== null) {
  235. $objWriter->startElement('u');
  236. $objWriter->writeAttribute('val', $pFont->getUnderline());
  237. $objWriter->endElement();
  238. }
  239. // Superscript / subscript
  240. if ($pFont->getSuperscript() === true || $pFont->getSubscript() === true) {
  241. $objWriter->startElement('vertAlign');
  242. if ($pFont->getSuperscript() === true) {
  243. $objWriter->writeAttribute('val', 'superscript');
  244. } elseif ($pFont->getSubscript() === true) {
  245. $objWriter->writeAttribute('val', 'subscript');
  246. }
  247. $objWriter->endElement();
  248. }
  249. // Size
  250. if ($pFont->getSize() !== null) {
  251. $objWriter->startElement('sz');
  252. $objWriter->writeAttribute('val', StringHelper::formatNumber($pFont->getSize()));
  253. $objWriter->endElement();
  254. }
  255. // Foreground color
  256. if ($pFont->getColor()->getARGB() !== null) {
  257. $objWriter->startElement('color');
  258. $objWriter->writeAttribute('rgb', $pFont->getColor()->getARGB());
  259. $objWriter->endElement();
  260. }
  261. // Name
  262. if ($pFont->getName() !== null) {
  263. $objWriter->startElement('name');
  264. $objWriter->writeAttribute('val', $pFont->getName());
  265. $objWriter->endElement();
  266. }
  267. $objWriter->endElement();
  268. }
  269. /**
  270. * Write Border.
  271. *
  272. * @param XMLWriter $objWriter XML Writer
  273. * @param Borders $pBorders Borders style
  274. */
  275. private function writeBorder(XMLWriter $objWriter, Borders $pBorders)
  276. {
  277. // Write border
  278. $objWriter->startElement('border');
  279. // Diagonal?
  280. switch ($pBorders->getDiagonalDirection()) {
  281. case Borders::DIAGONAL_UP:
  282. $objWriter->writeAttribute('diagonalUp', 'true');
  283. $objWriter->writeAttribute('diagonalDown', 'false');
  284. break;
  285. case Borders::DIAGONAL_DOWN:
  286. $objWriter->writeAttribute('diagonalUp', 'false');
  287. $objWriter->writeAttribute('diagonalDown', 'true');
  288. break;
  289. case Borders::DIAGONAL_BOTH:
  290. $objWriter->writeAttribute('diagonalUp', 'true');
  291. $objWriter->writeAttribute('diagonalDown', 'true');
  292. break;
  293. }
  294. // BorderPr
  295. $this->writeBorderPr($objWriter, 'left', $pBorders->getLeft());
  296. $this->writeBorderPr($objWriter, 'right', $pBorders->getRight());
  297. $this->writeBorderPr($objWriter, 'top', $pBorders->getTop());
  298. $this->writeBorderPr($objWriter, 'bottom', $pBorders->getBottom());
  299. $this->writeBorderPr($objWriter, 'diagonal', $pBorders->getDiagonal());
  300. $objWriter->endElement();
  301. }
  302. /**
  303. * Write Cell Style Xf.
  304. *
  305. * @param XMLWriter $objWriter XML Writer
  306. * @param \PhpOffice\PhpSpreadsheet\Style\Style $pStyle Style
  307. * @param Spreadsheet $spreadsheet Workbook
  308. *
  309. * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
  310. */
  311. private function writeCellStyleXf(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Style\Style $pStyle, Spreadsheet $spreadsheet)
  312. {
  313. // xf
  314. $objWriter->startElement('xf');
  315. $objWriter->writeAttribute('xfId', 0);
  316. $objWriter->writeAttribute('fontId', (int) $this->getParentWriter()->getFontHashTable()->getIndexForHashCode($pStyle->getFont()->getHashCode()));
  317. if ($pStyle->getQuotePrefix()) {
  318. $objWriter->writeAttribute('quotePrefix', 1);
  319. }
  320. if ($pStyle->getNumberFormat()->getBuiltInFormatCode() === false) {
  321. $objWriter->writeAttribute('numFmtId', (int) ($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($pStyle->getNumberFormat()->getHashCode()) + 164));
  322. } else {
  323. $objWriter->writeAttribute('numFmtId', (int) $pStyle->getNumberFormat()->getBuiltInFormatCode());
  324. }
  325. $objWriter->writeAttribute('fillId', (int) $this->getParentWriter()->getFillHashTable()->getIndexForHashCode($pStyle->getFill()->getHashCode()));
  326. $objWriter->writeAttribute('borderId', (int) $this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($pStyle->getBorders()->getHashCode()));
  327. // Apply styles?
  328. $objWriter->writeAttribute('applyFont', ($spreadsheet->getDefaultStyle()->getFont()->getHashCode() != $pStyle->getFont()->getHashCode()) ? '1' : '0');
  329. $objWriter->writeAttribute('applyNumberFormat', ($spreadsheet->getDefaultStyle()->getNumberFormat()->getHashCode() != $pStyle->getNumberFormat()->getHashCode()) ? '1' : '0');
  330. $objWriter->writeAttribute('applyFill', ($spreadsheet->getDefaultStyle()->getFill()->getHashCode() != $pStyle->getFill()->getHashCode()) ? '1' : '0');
  331. $objWriter->writeAttribute('applyBorder', ($spreadsheet->getDefaultStyle()->getBorders()->getHashCode() != $pStyle->getBorders()->getHashCode()) ? '1' : '0');
  332. $objWriter->writeAttribute('applyAlignment', ($spreadsheet->getDefaultStyle()->getAlignment()->getHashCode() != $pStyle->getAlignment()->getHashCode()) ? '1' : '0');
  333. if ($pStyle->getProtection()->getLocked() != Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) {
  334. $objWriter->writeAttribute('applyProtection', 'true');
  335. }
  336. // alignment
  337. $objWriter->startElement('alignment');
  338. $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal());
  339. $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical());
  340. $textRotation = 0;
  341. if ($pStyle->getAlignment()->getTextRotation() >= 0) {
  342. $textRotation = $pStyle->getAlignment()->getTextRotation();
  343. } elseif ($pStyle->getAlignment()->getTextRotation() < 0) {
  344. $textRotation = 90 - $pStyle->getAlignment()->getTextRotation();
  345. }
  346. $objWriter->writeAttribute('textRotation', $textRotation);
  347. $objWriter->writeAttribute('wrapText', ($pStyle->getAlignment()->getWrapText() ? 'true' : 'false'));
  348. $objWriter->writeAttribute('shrinkToFit', ($pStyle->getAlignment()->getShrinkToFit() ? 'true' : 'false'));
  349. if ($pStyle->getAlignment()->getIndent() > 0) {
  350. $objWriter->writeAttribute('indent', $pStyle->getAlignment()->getIndent());
  351. }
  352. if ($pStyle->getAlignment()->getReadOrder() > 0) {
  353. $objWriter->writeAttribute('readingOrder', $pStyle->getAlignment()->getReadOrder());
  354. }
  355. $objWriter->endElement();
  356. // protection
  357. if ($pStyle->getProtection()->getLocked() != Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) {
  358. $objWriter->startElement('protection');
  359. if ($pStyle->getProtection()->getLocked() != Protection::PROTECTION_INHERIT) {
  360. $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
  361. }
  362. if ($pStyle->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) {
  363. $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
  364. }
  365. $objWriter->endElement();
  366. }
  367. $objWriter->endElement();
  368. }
  369. /**
  370. * Write Cell Style Dxf.
  371. *
  372. * @param XMLWriter $objWriter XML Writer
  373. * @param \PhpOffice\PhpSpreadsheet\Style\Style $pStyle Style
  374. */
  375. private function writeCellStyleDxf(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Style\Style $pStyle)
  376. {
  377. // dxf
  378. $objWriter->startElement('dxf');
  379. // font
  380. $this->writeFont($objWriter, $pStyle->getFont());
  381. // numFmt
  382. $this->writeNumFmt($objWriter, $pStyle->getNumberFormat());
  383. // fill
  384. $this->writeFill($objWriter, $pStyle->getFill());
  385. // alignment
  386. $objWriter->startElement('alignment');
  387. if ($pStyle->getAlignment()->getHorizontal() !== null) {
  388. $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal());
  389. }
  390. if ($pStyle->getAlignment()->getVertical() !== null) {
  391. $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical());
  392. }
  393. if ($pStyle->getAlignment()->getTextRotation() !== null) {
  394. $textRotation = 0;
  395. if ($pStyle->getAlignment()->getTextRotation() >= 0) {
  396. $textRotation = $pStyle->getAlignment()->getTextRotation();
  397. } elseif ($pStyle->getAlignment()->getTextRotation() < 0) {
  398. $textRotation = 90 - $pStyle->getAlignment()->getTextRotation();
  399. }
  400. $objWriter->writeAttribute('textRotation', $textRotation);
  401. }
  402. $objWriter->endElement();
  403. // border
  404. $this->writeBorder($objWriter, $pStyle->getBorders());
  405. // protection
  406. if (($pStyle->getProtection()->getLocked() !== null) || ($pStyle->getProtection()->getHidden() !== null)) {
  407. if ($pStyle->getProtection()->getLocked() !== Protection::PROTECTION_INHERIT ||
  408. $pStyle->getProtection()->getHidden() !== Protection::PROTECTION_INHERIT) {
  409. $objWriter->startElement('protection');
  410. if (($pStyle->getProtection()->getLocked() !== null) &&
  411. ($pStyle->getProtection()->getLocked() !== Protection::PROTECTION_INHERIT)) {
  412. $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
  413. }
  414. if (($pStyle->getProtection()->getHidden() !== null) &&
  415. ($pStyle->getProtection()->getHidden() !== Protection::PROTECTION_INHERIT)) {
  416. $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == Protection::PROTECTION_PROTECTED ? 'true' : 'false'));
  417. }
  418. $objWriter->endElement();
  419. }
  420. }
  421. $objWriter->endElement();
  422. }
  423. /**
  424. * Write BorderPr.
  425. *
  426. * @param XMLWriter $objWriter XML Writer
  427. * @param string $pName Element name
  428. * @param Border $pBorder Border style
  429. */
  430. private function writeBorderPr(XMLWriter $objWriter, $pName, Border $pBorder)
  431. {
  432. // Write BorderPr
  433. if ($pBorder->getBorderStyle() != Border::BORDER_NONE) {
  434. $objWriter->startElement($pName);
  435. $objWriter->writeAttribute('style', $pBorder->getBorderStyle());
  436. // color
  437. $objWriter->startElement('color');
  438. $objWriter->writeAttribute('rgb', $pBorder->getColor()->getARGB());
  439. $objWriter->endElement();
  440. $objWriter->endElement();
  441. }
  442. }
  443. /**
  444. * Write NumberFormat.
  445. *
  446. * @param XMLWriter $objWriter XML Writer
  447. * @param NumberFormat $pNumberFormat Number Format
  448. * @param int $pId Number Format identifier
  449. */
  450. private function writeNumFmt(XMLWriter $objWriter, NumberFormat $pNumberFormat, $pId = 0)
  451. {
  452. // Translate formatcode
  453. $formatCode = $pNumberFormat->getFormatCode();
  454. // numFmt
  455. if ($formatCode !== null) {
  456. $objWriter->startElement('numFmt');
  457. $objWriter->writeAttribute('numFmtId', ($pId + 164));
  458. $objWriter->writeAttribute('formatCode', $formatCode);
  459. $objWriter->endElement();
  460. }
  461. }
  462. /**
  463. * Get an array of all styles.
  464. *
  465. * @param Spreadsheet $spreadsheet
  466. *
  467. * @return \PhpOffice\PhpSpreadsheet\Style\Style[] All styles in PhpSpreadsheet
  468. */
  469. public function allStyles(Spreadsheet $spreadsheet)
  470. {
  471. return $spreadsheet->getCellXfCollection();
  472. }
  473. /**
  474. * Get an array of all conditional styles.
  475. *
  476. * @param Spreadsheet $spreadsheet
  477. *
  478. * @return Conditional[] All conditional styles in PhpSpreadsheet
  479. */
  480. public function allConditionalStyles(Spreadsheet $spreadsheet)
  481. {
  482. // Get an array of all styles
  483. $aStyles = [];
  484. $sheetCount = $spreadsheet->getSheetCount();
  485. for ($i = 0; $i < $sheetCount; ++$i) {
  486. foreach ($spreadsheet->getSheet($i)->getConditionalStylesCollection() as $conditionalStyles) {
  487. foreach ($conditionalStyles as $conditionalStyle) {
  488. $aStyles[] = $conditionalStyle;
  489. }
  490. }
  491. }
  492. return $aStyles;
  493. }
  494. /**
  495. * Get an array of all fills.
  496. *
  497. * @param Spreadsheet $spreadsheet
  498. *
  499. * @return Fill[] All fills in PhpSpreadsheet
  500. */
  501. public function allFills(Spreadsheet $spreadsheet)
  502. {
  503. // Get an array of unique fills
  504. $aFills = [];
  505. // Two first fills are predefined
  506. $fill0 = new Fill();
  507. $fill0->setFillType(Fill::FILL_NONE);
  508. $aFills[] = $fill0;
  509. $fill1 = new Fill();
  510. $fill1->setFillType(Fill::FILL_PATTERN_GRAY125);
  511. $aFills[] = $fill1;
  512. // The remaining fills
  513. $aStyles = $this->allStyles($spreadsheet);
  514. /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */
  515. foreach ($aStyles as $style) {
  516. if (!isset($aFills[$style->getFill()->getHashCode()])) {
  517. $aFills[$style->getFill()->getHashCode()] = $style->getFill();
  518. }
  519. }
  520. return $aFills;
  521. }
  522. /**
  523. * Get an array of all fonts.
  524. *
  525. * @param Spreadsheet $spreadsheet
  526. *
  527. * @return Font[] All fonts in PhpSpreadsheet
  528. */
  529. public function allFonts(Spreadsheet $spreadsheet)
  530. {
  531. // Get an array of unique fonts
  532. $aFonts = [];
  533. $aStyles = $this->allStyles($spreadsheet);
  534. /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */
  535. foreach ($aStyles as $style) {
  536. if (!isset($aFonts[$style->getFont()->getHashCode()])) {
  537. $aFonts[$style->getFont()->getHashCode()] = $style->getFont();
  538. }
  539. }
  540. return $aFonts;
  541. }
  542. /**
  543. * Get an array of all borders.
  544. *
  545. * @param Spreadsheet $spreadsheet
  546. *
  547. * @return Borders[] All borders in PhpSpreadsheet
  548. */
  549. public function allBorders(Spreadsheet $spreadsheet)
  550. {
  551. // Get an array of unique borders
  552. $aBorders = [];
  553. $aStyles = $this->allStyles($spreadsheet);
  554. /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */
  555. foreach ($aStyles as $style) {
  556. if (!isset($aBorders[$style->getBorders()->getHashCode()])) {
  557. $aBorders[$style->getBorders()->getHashCode()] = $style->getBorders();
  558. }
  559. }
  560. return $aBorders;
  561. }
  562. /**
  563. * Get an array of all number formats.
  564. *
  565. * @param Spreadsheet $spreadsheet
  566. *
  567. * @return NumberFormat[] All number formats in PhpSpreadsheet
  568. */
  569. public function allNumberFormats(Spreadsheet $spreadsheet)
  570. {
  571. // Get an array of unique number formats
  572. $aNumFmts = [];
  573. $aStyles = $this->allStyles($spreadsheet);
  574. /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */
  575. foreach ($aStyles as $style) {
  576. if ($style->getNumberFormat()->getBuiltInFormatCode() === false && !isset($aNumFmts[$style->getNumberFormat()->getHashCode()])) {
  577. $aNumFmts[$style->getNumberFormat()->getHashCode()] = $style->getNumberFormat();
  578. }
  579. }
  580. return $aNumFmts;
  581. }
  582. }