Excel.class.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. require_once (__DIR__.SLASH.'..'.SLASH.'constant.php');
  3. //Exemple d'utilisation de XLSXWriter : https://github.com/mk-j/PHP_XLSXWriter/tree/master/examples
  4. require_once (LIB_PATH.'XLSXWriter'.SLASH.'XLSXWriter.class.php');
  5. require_once (LIB_PATH.'SimpleXLSX'.SLASH.'SimpleXLSX.class.php');
  6. class Excel
  7. {
  8. /**
  9. * Parse un fichier xlsx et retourne le contenu lignes / colonnes
  10. * @param string $xlsxFile : chemin vers le fichier a parser OU flux si $isStream = true
  11. * @param bool $isStream : définit si l'entrée est un fichier ou un flux
  12. * @param int $sheetIndex : numero de l'onglet excel a parser (commence a 0)
  13. * @param bool $cellInfos : si passé a true, ajoute des infos de cellule (type etc...) plus lent.
  14. */
  15. public static function parse($xlsxFile,$isStream = false,$sheetIndex=1,$cellInfos = false) {
  16. $xlsx = SimpleXLSX::parse($xlsxFile,$isStream);
  17. if(!$xlsx) throw new Exception(SimpleXLSX::parseError());
  18. if($cellInfos){
  19. $rows = $xlsx->rowsEx($sheetIndex);
  20. }else{
  21. $rows = $xlsx->rows($sheetIndex);
  22. }
  23. return $rows;
  24. }
  25. /**
  26. * Retourne le contenu d'un tableau convertit au format XLSX
  27. * @param array $rows le tableau avec les lignes à exporter dans le fichier
  28. * @param array $mapping le mapping qui permet d'ajouter des libellé en fct des clés de colonne
  29. * Structure du tableau de mapping attendu : aaray(
  30. * 'Label' => 'clé',
  31. * 'Autre label' => 'autre clé',
  32. * etc...
  33. * );
  34. * @param string $sheetname le nom à donner à la feuille de calcul courante
  35. * @return string le stream du fichier généré
  36. */
  37. public static function exportArray($rows, $mapping, $sheetname='Classeur 1'){
  38. $data = $header = array();
  39. $style = array(
  40. 'border' => 'top,left,bottom,right',
  41. 'border-style' => 'thin'
  42. );
  43. if(empty($mapping) && isset($rows[0])){
  44. foreach($rows[0] as $key=>$value){
  45. $mapping[$key] = $key;
  46. }
  47. }
  48. foreach ($rows as $key => $item) {
  49. $itemContent = array();
  50. if (isset($mapping)) {
  51. foreach ($mapping as $label => $attributes) {
  52. $slug = is_array($attributes) ? (isset($attributes['slug']) ? $attributes['slug'] : '') : $attributes;
  53. $header[$label] = (is_array($attributes) && isset($attributes['type'])) ? $attributes['type'] : 'string';
  54. isset($item[$slug]) ? array_push($itemContent, $item[$slug]) : array_push($itemContent, '');
  55. }
  56. } else {
  57. foreach ($item as $field => $value) {
  58. array_push($itemContent, $item[$field]);
  59. }
  60. }
  61. array_push($data, $itemContent);
  62. }
  63. ob_start();
  64. $excel = new XLSXWriter();
  65. $excel->writeSheetHeader($sheetname, $header, array_merge($style, array('font-style'=> 'bold','border-color' => '#2a2a28')));
  66. foreach($data as $row)
  67. $excel->writeSheetRow($sheetname, $row, array_merge($style, array('border-color' => '#cecece')));
  68. $excel->writeToStdOut();
  69. $output = ob_get_clean();
  70. return $output;
  71. }
  72. /**
  73. * Export de données sur plusieurs feuilles Excel
  74. * @param array $content [Contenu à exporter]
  75. * Format du tableau de contenu attendu :
  76. * array(
  77. * 'Classeur 1' => array(
  78. * 'mapping' => array(
  79. * 'Libellé' => 'slug',
  80. * 'Libellé' => 'slug',
  81. * 'Libellé' => 'slug'
  82. * ),
  83. * 'rows' => array(
  84. * 0 => objet/entité exporté,
  85. * 1 => objet/entité exporté,
  86. * 2 => objet/entité exporté
  87. * )
  88. * ),
  89. * 'Classeur 2' => array(
  90. * 'mapping' => array(
  91. * 'Libellé' => 'slug',
  92. * 'Libellé' => 'slug',
  93. * 'Libellé' => 'slug'
  94. * ),
  95. * 'rows' => array(
  96. * 0 => objet/entité exporté,
  97. * 1 => objet/entité exporté,
  98. * 2 => objet/entité exporté
  99. * )
  100. * ), etc...
  101. * );
  102. * On place généralement $response['rows'] dans l'index 'rows' d'une feuille Excel
  103. *
  104. * @param string $filename [Nom du fichier à exporter]
  105. *
  106. * @return string [Fichier XSLX]
  107. */
  108. public static function exportMultipleSheets($content){
  109. $commonStyle = array('border'=> 'top,left,bottom,right', 'border-style'=> 'thin');
  110. $headerStyle = array_merge($commonStyle, array('font-style'=> 'bold','border-color'=> '#2a2a28'));
  111. $contentStyle = array_merge($commonStyle, array('border-color'=> '#cecece'));
  112. $styles = array(
  113. 'header' => $headerStyle,
  114. 'content'=> $contentStyle
  115. );
  116. $excel = new XLSXWriter();
  117. foreach ($content as $sheetName => $sheetContent) {
  118. $data = $header = array();
  119. foreach ($sheetContent['rows'] as $item) {
  120. $itemContent = array();
  121. if (isset($sheetContent['mapping'])) {
  122. foreach ($sheetContent['mapping'] as $label => $attributes) {
  123. $slug = is_array($attributes) ? (isset($attributes['slug']) ? $attributes['slug'] : '') : $attributes;
  124. $header[$label] = (is_array($attributes) && isset($attributes['type'])) ? $attributes['type'] : 'string';
  125. isset($item[$slug]) ? array_push($itemContent, $item[$slug]) : array_push($itemContent, '');
  126. }
  127. } else {
  128. foreach ($item as $field => $value) {
  129. array_push($itemContent, $item[$field]);
  130. }
  131. }
  132. array_push($data, $itemContent);
  133. }
  134. $excel->writeSheet($data, $sheetName, $header, $styles);
  135. }
  136. ob_start();
  137. $excel->writeToStdOut();
  138. $output = ob_get_clean();
  139. return $output;
  140. }
  141. }