Excel.class.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. //Parse un fichier xlsx et retourne le contenu
  9. public static function parse($xlsxFile) {
  10. return SimpleXLSX::parse($xlsxFile);
  11. }
  12. /**
  13. * Retourne le contenu d'un tableau convertit au format XLSX
  14. * @param array $rows le tableau avec les lignes à exporter dans le fichier
  15. * @param array $mapping le mapping qui permet d'ajouter des libellé en fct des clés de colonne
  16. * Structure du tableau de mapping attendu : aaray(
  17. * 'Label' => 'clé',
  18. * 'Autre label' => 'autre clé',
  19. * etc...
  20. * );
  21. * @param string $sheetname le nom à donner à la feuille de calcul courante
  22. * @return string le stream du fichier généré
  23. */
  24. public static function exportArray($rows, $mapping, $sheetname='Classeur 1'){
  25. $data = $header = array();
  26. $style = array(
  27. 'border' => 'top,left,bottom,right',
  28. 'border-style' => 'thin'
  29. );
  30. if(empty($mapping) && isset($rows[0])){
  31. foreach($rows[0] as $key=>$value){
  32. $mapping[$key] = $key;
  33. }
  34. }
  35. foreach ($rows as $key => $item) {
  36. $itemContent = array();
  37. if (isset($mapping)) {
  38. foreach ($mapping as $label => $attributes) {
  39. $slug = is_array($attributes) ? (isset($attributes['slug']) ? $attributes['slug'] : '') : $attributes;
  40. $header[$label] = (is_array($attributes) && isset($attributes['type'])) ? $attributes['type'] : 'string';
  41. isset($item[$slug]) ? array_push($itemContent, $item[$slug]) : array_push($itemContent, '');
  42. }
  43. } else {
  44. foreach ($item as $field => $value) {
  45. array_push($itemContent, $item[$field]);
  46. }
  47. }
  48. array_push($data, $itemContent);
  49. }
  50. ob_start();
  51. $excel = new XLSXWriter();
  52. $excel->writeSheetHeader($sheetname, $header, array_merge($style, array('font-style'=> 'bold','border-color' => '#2a2a28')));
  53. foreach($data as $row)
  54. $excel->writeSheetRow($sheetname, $row, array_merge($style, array('border-color' => '#cecece')));
  55. $excel->writeToStdOut();
  56. $output = ob_get_clean();
  57. return $output;
  58. }
  59. /**
  60. * Export de données sur plusieurs feuilles Excel
  61. * @param array $content [Contenu à exporter]
  62. * Format du tableau de contenu attendu :
  63. * array(
  64. * 'Classeur 1' => array(
  65. * 'mapping' => array(
  66. * 'Libellé' => 'slug',
  67. * 'Libellé' => 'slug',
  68. * 'Libellé' => 'slug'
  69. * ),
  70. * 'rows' => array(
  71. * 0 => objet/entité exporté,
  72. * 1 => objet/entité exporté,
  73. * 2 => objet/entité exporté
  74. * )
  75. * ),
  76. * 'Classeur 2' => array(
  77. * 'mapping' => array(
  78. * 'Libellé' => 'slug',
  79. * 'Libellé' => 'slug',
  80. * 'Libellé' => 'slug'
  81. * ),
  82. * 'rows' => array(
  83. * 0 => objet/entité exporté,
  84. * 1 => objet/entité exporté,
  85. * 2 => objet/entité exporté
  86. * )
  87. * ), etc...
  88. * );
  89. * On place généralement $response['rows'] dans l'index 'rows' d'une feuille Excel
  90. *
  91. * @param string $filename [Nom du fichier à exporter]
  92. *
  93. * @return string [Fichier XSLX]
  94. */
  95. public static function exportMultipleSheets($content){
  96. $commonStyle = array('border'=> 'top,left,bottom,right', 'border-style'=> 'thin');
  97. $headerStyle = array_merge($commonStyle, array('font-style'=> 'bold','border-color'=> '#2a2a28'));
  98. $contentStyle = array_merge($commonStyle, array('border-color'=> '#cecece'));
  99. $styles = array(
  100. 'header' => $headerStyle,
  101. 'content'=> $contentStyle
  102. );
  103. $excel = new XLSXWriter();
  104. foreach ($content as $sheetName => $sheetContent) {
  105. $data = $header = array();
  106. foreach ($sheetContent['rows'] as $key => $item) {
  107. $itemContent = array();
  108. if (isset($sheetContent['mapping'])) {
  109. foreach ($sheetContent['mapping'] as $label => $attributes) {
  110. $slug = is_array($attributes) ? (isset($attributes['slug']) ? $attributes['slug'] : '') : $attributes;
  111. $header[$label] = (is_array($attributes) && isset($attributes['type'])) ? $attributes['type'] : 'string';
  112. isset($item[$slug]) ? array_push($itemContent, $item[$slug]) : array_push($itemContent, '');
  113. }
  114. } else {
  115. foreach ($item as $field => $value) {
  116. array_push($itemContent, $item[$field]);
  117. }
  118. }
  119. array_push($data, $itemContent);
  120. }
  121. $excel->writeSheet($data, $sheetName, $header, $styles);
  122. }
  123. ob_start();
  124. $excel->writeToStdOut();
  125. $output = ob_get_clean();
  126. return $output;
  127. }
  128. }