<?php

/**
 * Librairie d'utilisation de PHPExcel version 1.7.8, 2012-10-12
 * Toute modification sur cette librairie peut entrainer des conséquences néfastes sur l'utilisation des fonctions suivantes. 
 * @version 1.0 - 13/11/2012
 */
// Librairies utilisées pour l'utilisabilité de la librairie présente
include('PHPExcel/Classes/PHPExcel/IOFactory.php');
include('PHPExcel/Classes/PHPExcel/Cell/DataType.php');
include('PHPExcel/Classes/PHPExcel/RichText.php');
include('PHPExcel/Classes/PHPExcel.php');
include('PHPExcel/Classes/PHPExcel/Writer/Excel2007.php');

/**
 * Retourne le nombre total de colonne présent d'ans la feuille'une feuille
 * @param type $fichier Le chemin absolu vers le fichier
 * @param type $numeroFeuille Le numéro de la feuille à étudier
 * @return int Le nombre de colonne
 */
function getNombreColonne($fichier, $numeroFeuille) {
    $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $derniereColonne = $feuille->getHighestColumn();
    $numeroDerniereColonne = PHPExcel_Cell::columnIndexFromString($derniereColonne);
    return $numeroDerniereColonne;
}

/**
 * Retourne le nombre total de ligne d'une feuille.
 * ATTENTION : Cette fonction compte également les lignes vides situées entre des données
 * @param type $fichier Le chemin absolu vers le fichier
 * @param type $numeroFeuille Le numéro de la feuille à étudier
 * @return int Le nombre de ligne présent dans la feuille
 */
function getNombreLigne($fichier, $numeroFeuille) {
    $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $derniereLigne = $feuille->getHighestRow();
    return $derniereLigne;
}

/**
 * Permet de compter le nombre de ligne non vide présentes dans une feuille de données
 * @param type $fichier Le chemin absolu vers le fichier 
 * @param type $numeroFeuille Le numéro de la feuille à traiter
 * @return int Le nombre de ligne non vide
 */
function getNombreLigneNonVide($fichier, $numeroFeuille) {
    $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $compteurColonne = 0;
    $compteurLigne = 0;
    // Parcours des lignes 
    foreach ($feuille->getRowIterator() as $ligne) {
        // Parcours des colonnes
        $nullData = 0;
        foreach ($ligne->getCellIterator() as $cellule) {
            $contenu = trim($cellule->getValue());
            if (!empty($contenu)) {
                $compteurColonne++;
            } else {
                $nullData++;
            }
        }
        if ($compteurColonne>0) {	//$nullData != $compteurColonne
            $compteurLigne++;
        }
        $compteurColonne = 0;
    }
    return $compteurLigne;
}

/**
 * Permet de détecter si une liste d'entete contenue dans une feuille 
 * @param type $fichier Le chemin absolu vers le fichier 
 * @param type $numeroFeuille Le numéro de la feuille à étudier
 * @return boolean Vrai si il existe des doublons, faux dans les autres cas
 */
function isDoublonEntete($fichier, $numeroFeuille) {
    $result = false;
    $data = array();
    $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $compteurLigne = 0;
    foreach ($feuille->getRowIterator() as $ligne) {
        // Parcours des colonnes
        $nullData = 0;
        $compteurColonne = 0;
        foreach ($ligne->getCellIterator() as $cellule) {
            $contenu = trim($cellule->getValue());
            if (!empty($contenu)) {
                $data[$compteurLigne][$compteurColonne] = $contenu;
                $compteurColonne++;
            } else {
                $nullData++;
            }
        }
        if ($nullData != $compteurColonne) {
            $compteurLigne++;
        }
        if ($compteurLigne == 1) {
            break;
        }
    }
    for ($i = 0; $i < $compteurColonne; $i++) {
        $dataRef = $data[0][$i];
        $nombreOccurence = 0;
        for ($j = 0; $j < $compteurColonne; $j++) {
            $dataComp = $data[0][$j];
            if ($dataComp == $dataRef) {
                $nombreOccurence++;
            }
        }
        if ($nombreOccurence > 1) {
            $result = true;
        }
    }
    return $result;
}

/**
 * Permet de récuperer la 1ère ligne non vide d'une feuille d'un classeur excel
 * @param type $fichier Le chemin absolu vers le fichier
 * @param type $numeroFeuille Le numéro de la feuille à étudier
 * @return type data[] Une liste de texte de longueur égale au nombre de colonne
 */
function recuperationEntete($fichier, $numeroFeuille) {
    $data = array();
    $entete = array();
    $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $compteurLigne = 0;
    foreach ($feuille->getRowIterator() as $ligne) {
        // Parcours des colonnes
        $nullData = 0;
        $compteurColonne = 0;
        foreach ($ligne->getCellIterator() as $cellule) {
            $contenu = trim($cellule->getValue());
            if (!empty($contenu)) {
                $data[$compteurLigne][$compteurColonne] = $contenu;
                $compteurColonne++;
            } else {
                $nullData++;
            }
        }
        if ($nullData != $compteurColonne) {
            $compteurLigne++;
        }
        if ($compteurLigne == 1) {
            break;
        }
    }
    for ($i = 0; $i < $compteurColonne; $i++) {
        //$entete[$i] = htmlentities(trim(stripslashes($data[0][$i])));
        $entete[$i] = trim(stripslashes($data[0][$i]));
        //$entete[$i] = str_replace("'","&acute;",$entete[$i]);
		$entete[$i] = str_replace("\"","",$entete[$i]);
        $entete[$i] = str_replace(CHR(10), "", $entete[$i]);
        $entete[$i] = str_replace(CHR(13), "", $entete[$i]);
        //$entete[$i] = utf8_encode($entete[$i]);
        $entete[$i] = utf8_decode($entete[$i]);
    }
    return $entete;
}
 
/**
 * Fonction permettant de lire une feuille excel
 * Format supporté 97-2003, 2007, ODS
 * @param type $fichier Le chemin absolu vers le fichier
 * @param type $numeroFeuille Le numéro de la feuille à charger en mémoire
 * @return type data[][] Retourne un tableau de données sous la forme $data[numéro de ligne][lettre de colonne]
 */
function readingExcelToArrayWithLetter($fichier, $numeroFeuille) {
    $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $data = array();
    $compteurColonne = 0;
    $compteurLigne = 0;
    // Parcours des lignes 
    foreach ($feuille->getRowIterator() as $ligne) {
        // Parcours des colonnes
        $nullData = 0;
        $compteurColonne = 0;
        foreach ($ligne->getCellIterator() as $cellule) {
            $contenu = trim($cellule->getValue());
           // if (!empty($contenu)) {
               

				$data[$compteurLigne][$cellule->getColumn()] = trim(stripslashes($contenu));
				$data[$compteurLigne][$cellule->getColumn()] = str_replace("'","_",$data[$compteurLigne][$cellule->getColumn()]);
                $data[$compteurLigne][$cellule->getColumn()] = str_replace(CHR(10), "", $data[$compteurLigne][$cellule->getColumn()]);
                $data[$compteurLigne][$cellule->getColumn()] = str_replace(CHR(13), "", $data[$compteurLigne][$cellule->getColumn()]);
				$data[$compteurLigne][$cellule->getColumn()] = utf8_decode($data[$compteurLigne][$cellule->getColumn()]);
                $compteurColonne++;
          //  } else {
           //     $nullData++;
           // }
        }
       // if ($nullData != $compteurColonne) {
            $compteurLigne++;
       // }
    }
    return $data;
}

function readingExcelToArrayWithLetterXls($fichier, $numeroFeuille) {
    $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $data = array();
    $compteurColonne = 0;
    $compteurLigne = 0;
    // Parcours des lignes 
    foreach ($feuille->getRowIterator() as $ligne) {
        // Parcours des colonnes
        $nullData = 0;
        $compteurColonne = 0;
        foreach ($ligne->getCellIterator() as $cellule) {
            $contenu = trim($cellule->getValue());
            if (!empty($contenu)) {
               
				$data[$compteurLigne][$cellule->getColumn()] = trim(stripslashes($contenu));
				$data[$compteurLigne][$cellule->getColumn()] = str_replace("'","_",$data[$compteurLigne][$cellule->getColumn()]);
                $data[$compteurLigne][$cellule->getColumn()] = str_replace(CHR(10), "", $data[$compteurLigne][$cellule->getColumn()]);
                $data[$compteurLigne][$cellule->getColumn()] = str_replace(CHR(13), "", $data[$compteurLigne][$cellule->getColumn()]);
                $compteurColonne++;
            } else {
                $nullData++;
            }
        }
        if ($compteurColonne>0) {	//$nullData != $compteurColonne
            $compteurLigne++;
        }
    }
    return $data;
}

/**
 * Permet d'écrire les données contenues dans un tableau, possédant des lettres en entête de colonne, sur un fichier au format Microsoft Excel 97-2003. Ces données peuvent être typés de manière général par la classe PHPExcel_Cell_DataType
 * @see PHPExcel_Cell_DataType.php
 * @param type $fichier Le chemin absolu du fichier à créer. Doit contenir l'extension .xls 
 * @param type $numeroFeuille Le numéro de la feuille à écrire
 * @param type $nomFeuille Le nom à lui donner
 * @param type $data Un tableau de données sous la forme data[numéro de ligne][lettre de colonne]
 * @param type $attributsFichiers Un tableau d'attribut de données où les attributs correspondent à : 0->Créateur, 1->Auteur de la dernière modification, 2->Le titre du fichier, 3->Le sujet du fichier, 4->La description du fichier, 5->Les mots clés utiles au référencement système du fichier, 6-> La catégorie d'appartenance du fichier
 * @param type $typage Le typage correspond aux éléments statiques définis dans PHPExcel_Cell_DataType.php, la syntaxe de passage d'argument est donc sous la forme PHPExcel_Cell_DataType::TYPE_STRING
 */
function writingArrayWithLetterToExcel5WithType($fichier, $numeroFeuille, $nomFeuille, $data, $attributsFichiers, $typage) {

	$object = new PHPExcel();
    $object->getProperties()->setCreator($attributsFichiers[0])
            ->setLastModifiedBy($attributsFichiers[1])
            ->setTitle($attributsFichiers[2])
            ->setSubject($attributsFichiers[3])
            ->setDescription($attributsFichiers[4])
            ->setKeywords($attributsFichiers[5])
            ->setCategory($attributsFichiers[6]);
    foreach ($data as $key => $ligne) {
        foreach ($ligne as $colonne => $valeur) {
            //if($fichier=="upload/filexls/99999_11_sortie.xls"){
				//echo "j";
				//exit();
				$object->setActiveSheetIndex($numeroFeuille)->setCellValueExplicit('' . $colonne . ($key + 1), utf8_encode($valeur), $typage);
			//}else{
				//$object->setActiveSheetIndex($numeroFeuille)->setCellValueExplicit('' . $colonne . ($key + 1), $valeur, $typage);
			//}
        }
    }
    $object->getActiveSheet()->setTitle($nomFeuille);
    $writer = new PHPExcel_Writer_Excel5($object);
    $writer->save($fichier);
}

/**
 * Permet d'extraire une quantité déterminée de ligne d'un fichier puis des les charger en mémoire sous forme de tableau ayant pour colonne des nombres
 * @param type $fichier Le chemin absolu vers le fichier 
 * @param type $numeroFeuille Le numéro de la feuille à étudier
 * @param type $nombreLigneExtraite Le nombre de ligne voulu en mémoire. Attention la selection commence à la ligne 0 qui contiendra les entêtes
 * @return type data[][] Un tableau à deux dimensions possédant les caracteristiques suivantes : data[numéro de ligne][numéro de colonne]
 */
function readingExtractOfExcelToArrayWithNumber($fichier, $numeroFeuille, $nombreLigneExtraite)
{
     $objetPHPExcel = PHPExcel_IOFactory::load($fichier);
    $feuille = $objetPHPExcel->getSheet($numeroFeuille);
    $data = array();
    $compteurColonne = 0;
    $compteurLigne = 0;
    // Parcours des lignes 
    foreach ($feuille->getRowIterator() as $ligne) {
        // Parcours des colonnes
        $nullData = 0;
        $compteurColonne = 0;
        foreach ($ligne->getCellIterator() as $cellule) {
            $contenu = trim($cellule->getValue());
            //if (!empty($contenu)) {
                $data[$compteurLigne][$compteurColonne] = trim(stripslashes($contenu));
				$data[$compteurLigne][$compteurColonne] = str_replace("'","_",$data[$compteurLigne][$compteurColonne]);
                $data[$compteurLigne][$compteurColonne] = str_replace(CHR(10), "", $data[$compteurLigne][$compteurColonne]);
                $data[$compteurLigne][$compteurColonne] = str_replace(CHR(13), "", $data[$compteurLigne][$compteurColonne]);
                $compteurColonne++;
            //} else {
              //  $nullData++;
            //}
        }
        //if ($nullData != $compteurColonne) {
            $compteurLigne++;
        //}
        if($compteurLigne > $nombreLigneExtraite)
        {
            break;
        }
    }
    return $data;
}

//Permet de compléter le fichier pour les action sans ciblage (une ligne de libellé avec une ligne de contenu
function overwrittingArrayWithLetterToExcel5WithTypeNoCiblage($fichier, $numeroFeuille, $data, $typage) {
	$objetPHPExcel = PHPExcel_IOFactory::load($fichier);
	$sheet = $objetPHPExcel->getSheet($numeroFeuille);
	$nombreColonne = 0;
	$nombreLigne = 2;
	for($k = 1; $k <= $nombreLigne; $k++) {
			$parcoursData = 0;
			for($j = $nombreColonne; $j < ($nombreColonne + sizeof($data[0])); $j++) {
						if($k == 1 ) {
							//$objetPHPExcel->setActiveSheetIndex($numeroFeuille)->setCellValueByColumnAndRow($j, $k, "Test", $typage);
							$objetPHPExcel->setActiveSheetIndex($numeroFeuille)->setCellValueByColumnAndRow($j, $k, $data[0][$parcoursData], $typage);
						} else {
							$objetPHPExcel->setActiveSheetIndex($numeroFeuille)->setCellValueByColumnAndRow($j, $k, $data[1][$parcoursData], $typage);
						}
						$parcoursData++;
			}
	}

	$writer = new PHPExcel_Writer_Excel5($objetPHPExcel);
	$writer->save($fichier);
}

function overwrittingArrayWithLetterToExcel5WithType($fichier, $numeroFeuille, $data, $typage) {

	$objetPHPExcel = PHPExcel_IOFactory::load($fichier);
	$sheet = $objetPHPExcel->getSheet($numeroFeuille);
	$nombreColonne = getNombreColonne($fichier, $numeroFeuille);
	$nombreLigne = getNombreLigne($fichier, $numeroFeuille);
	for($k = 1; $k <= $nombreLigne; $k++) {
			$parcoursData = 0;
			for($j = $nombreColonne; $j < ($nombreColonne + sizeof($data[0])); $j++) {
						if($k == 1 ) {
							//$objetPHPExcel->setActiveSheetIndex($numeroFeuille)->setCellValueByColumnAndRow($j, $k, "Test", $typage);
							$objetPHPExcel->setActiveSheetIndex($numeroFeuille)->setCellValueByColumnAndRow($j, $k, $data[0][$parcoursData], $typage);
						} else {
							//$objetPHPExcel->setActiveSheetIndex($numeroFeuille)->setCellValueByColumnAndRow($j, $k, $data[1][$parcoursData], $typage);
							$objetPHPExcel->setActiveSheetIndex($numeroFeuille)->getCellByColumnAndRow($j, $k)->setValueExplicit($data[1][$parcoursData], $typage);
						}
						$parcoursData++;
			}
	}

	$writer = new PHPExcel_Writer_Excel5($objetPHPExcel);
    $writer->save($fichier);
}

?>