XlsxImport.class.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. require_once(__DIR__.SLASH.'CsvImport.class.php');
  3. class XlsxImport extends CsvImport{
  4. public $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
  5. public $extension = 'xlsx';
  6. public $description = 'Fichier tableur excel enrichis';
  7. public $meta = array();
  8. /* convertis le fichier en tableau lignes / colonnes
  9. Le tableau final doit avoir la forme :
  10. array( <-- excel
  11. array( <-- ligne
  12. array( <-- cellule
  13. 'value' => '' <-- valeur cellule
  14. 'color' => '' <-- propriété optionelle "couleur" (ou autre)
  15. )
  16. )
  17. )
  18. */
  19. public function toArray($file){
  20. //on prend l'onglet 1 si aucun onglet configuré
  21. $sheetIndex = isset($this->meta) && isset($this->meta['worksheet']) && is_numeric($this->meta['worksheet']) ? $this->meta['worksheet']-1 : 0;
  22. $sheetIndex = $sheetIndex<0 ? 0 : $sheetIndex;
  23. $rows = Excel::parse($file,false,$sheetIndex,false);
  24. $emptyLines = 0;
  25. $finalArray = array();
  26. if(!is_array($rows)) $rows = array();
  27. foreach($rows as $line){
  28. //si + de 10 lignes vides on arrette de lire (evite les excels sans fin)
  29. if($this->emptyLine($line,true)) $emptyLines++;
  30. if($emptyLines>10) break;
  31. $finalLine = array();
  32. foreach($line as $cell){
  33. $cell = str_replace("\n","<br>",$cell);
  34. $finalLine[]= array('value'=>$cell);
  35. }
  36. $finalArray[] = $finalLine;
  37. }
  38. return $finalArray;
  39. }
  40. //vérifie si une ligne est a vide ou non
  41. public function emptyLine($line,$raw = false){
  42. if($raw) return str_replace(array(';',' ',"\t","\n","\r"),'',$line) == '';
  43. $oneFilled = false;
  44. foreach($line as $cell){
  45. if( $this->emptyCell($cell) ) continue;
  46. $oneFilled = true;
  47. break;
  48. }
  49. //if($oneFilled){
  50. //foreach($line as $cell){
  51. // var_dump($cell['value'],$this->emptyCell($cell));
  52. //}
  53. //}
  54. return !$oneFilled;
  55. }
  56. //vérifie si une cellule est a vide ou non
  57. public function emptyCell($cell){
  58. $val = str_replace(array(';',' ',"\t","\n","\r"),'',$cell['value']);
  59. //1900-01-18 00:00:00 compoense le bug de SimpleXLSX qui detecte 1900-01-18 00:00:00 sur une cellule vide de type date
  60. return $val == '' || $val =='1970-01-01 00:00:00';
  61. }
  62. //Déduction du type d'une celleule a partir de sa valeur
  63. public function cellType($headerCell,$valueCell){
  64. return parent::cellType($headerCell,$valueCell);
  65. }
  66. //Réglages spécifiques a ce modèle d'import
  67. public function settings(){
  68. $fields = array();
  69. $fields = array(
  70. 'worksheet' => array(
  71. 'type' => 'integer',
  72. 'legend' => 'Optionnel (defaut: 1)',
  73. 'label' => 'Numéro de l\'onglet a importer'
  74. )
  75. );
  76. return $fields;
  77. }
  78. }
  79. ?>