web-dev-qa-db-fra.com

Lecture d'un fichier Excel dans PHP

J'essaie de lire un fichier Excel (Office 2003). Un fichier Excel doit être téléchargé et son contenu analysé.

Par l'intermédiaire de Google, je ne peux que trouver des réponses aux questions suivantes (et insuffisantes): génération de fichiers Excel, lecture de fichiers XML Excel, lecture de fichiers Excel CSV ou projets abandonnés incomplets. Je possède Office 2003, donc si j’ai besoin de fichiers de ce répertoire, ils sont disponibles. Il est installé sur mon ordinateur, mais ne l'est pas et ne peut pas être installé sur mon hôte partagé.

Modifier: jusqu'à présent, toutes les réponses pointent vers PHP-ExcelReader et/ou cet article supplémentaire sur la façon de l'utiliser.

90
Dinah

J'utilise PHP-ExcelReader pour lire les fichiers xls, et fonctionne très bien.

44
Luis Melgratti

Vous avez 2 choix autant que je sache:

  1. Spreadsheet_Excel_Reader , qui connaît le format binaire d'Office 2003
  2. PHPExcel , qui connaît à la fois Office 2003 et Excel 2007 (XML). (Suivez le lien et vous verrez qu'ils ont mis à niveau cette bibliothèque vers PHPSpreadSheet )

PHPExcel utilise Spreadsheet_Excel_Reader pour le format Office 2003.

Mise à jour: j'ai déjà eu à lire des fichiers Excel, mais j'ai utilisé le format XML Office 2003 pour les lire et j'ai informé les utilisateurs de l'application de sauvegarder et de télécharger uniquement ce type de fichier Excel.

58
Ionuț G. Stan

Cela dépend de la manière dont vous voulez utiliser les données du fichier Excel. Si vous voulez l'importer dans mysql, vous pouvez simplement l'enregistrer en tant que fichier au format CSV, puis utiliser fgetcsv pour l'analyser.

18
Jimbo

Lire XLSX (Excel 97-2003)
https://github.com/shuchkin/simplexls

if ( $xls = SimpleXLS::parse('book.xls') ) {
    print_r( $xls->rows() );
} else {
    echo SimpleXLS::parseError();
}

Lire XLSX (Excel 2003+)
https://github.com/shuchkin/simplexlsx

if ( $xlsx = SimpleXLSX::parse('book.xlsx') ) {
    print_r( $xlsx->rows() );
} else {
    echo SimpleXLSX::parseError();
}

Sortie

 Tableau (
 [0] => Tableau 
 (
 [0] => ISBN 
 [1] => titre 
 [2] => auteur 
 [3] => éditeur 
 [4] => ctry 
) 
 [1] => Tableau 
 (
 [0] => 618260307 
 [1] => Le Hobbit 
 [2] => JRR Tolkien 
 [3] => Houghton Mifflin 
 [4] => USA 
) 
 
) 

Lecteur php CSV
https://github.com/shuchkin/simplecsv

9
Sergey Shuchkin

Il y a un grand article pour expliquer comment lire/écrire des fichiers Excel avec du code php. Il a été recommandé d'utiliser MS-Excel Stream Handler PHP, qui est l'un des bibliothèque de classe supérieure pour ça :)

3
Leopathu

Essaye ça...

J'ai utilisé le code suivant pour lire "xls et xlsx"

    <?php
    include 'Excel_reader.php';       // include the class
    $Excel = new PhpExcelReader;      // creates object instance of the class
    $Excel->read('Excel_file.xls');   // reads and stores the Excel file data

    // Test to see the Excel data stored in $sheets property
    echo '<pre>';
    var_export($Excel->sheets);

    echo '</pre>';

    or 

 echo '<pre>';
    print_r($Excel->sheets);

    echo '</pre>';

Référence: http://coursesweb.net/php-mysql/read-Excel-file-data-php_pc

// Here is the simple code using COM object in PHP
class Excel_ReadWrite{

    private $XLSHandle;
    private $WrkBksHandle;
    private $xlBook;

    function __construct() {
        $this->XLSHandle = new COM("Excel.application") or die("ERROR: Unable to instantaniate COM!\r\n"); 
    }

    function __destruct(){
        //if already existing file is opened
        if($this->WrkBksHandle != null)
        {   
            $this->WrkBksHandle->Close(True);
            unset($this->WrkBksHandle);
            $this->XLSHandle->Workbooks->Close();
        }
        //if created new xls file
        if($this->xlBook != null)
        {
            $this->xlBook->Close(True);
            unset($this->xlBook);
        }
        //Quit Excel Application
        $this->XLSHandle->Quit();
        unset($this->XLSHandle);
    }

    public function OpenFile($FilePath)
    {
        $this->WrkBksHandle = $this->XLSHandle->Workbooks->Open($FilePath);
    }

    public function ReadData($RowNo, $ClmNo)
    {
       $Value = $this->XLSHandle->ActiveSheet->Cells($RowNo, $ClmNo)->Value;
       return $Value;
    }  

    public function SaveOpenedFile()
    {
        $this->WrkBksHandle->Save(); 
    }  

    /***********************************************************************************
    * Function Name:- WriteToXlsFile() will write data based on row and column numbers
    * @Param:- $CellData- cell data
    * @Param:- $RowNumber- xlsx file row number
    * @Param:- $ColumnNumber- xlsx file column numbers
   ************************************************************************************/
   function WriteToXlsFile($CellData, $RowNumber, $ColumnNumber)
   {
       try{
               $this->XLSHandle->ActiveSheet->Cells($RowNumber,$ColumnNumber)->Value = $CellData;
           }
       catch(Exception $e){
               throw new Exception("Error:- Unable to write data to xlsx sheet");
           }
   }


   /****************************************************************************************
    * Function Name:- CreateXlsFileWithClmName() will initialize xls file with column Names
    * @Param:- $XlsColumnNames- Array of columns data
    * @Param:- $XlsColumnWidth- Array of columns width
   *******************************************************************************************/
   function CreateXlsFileWithClmNameAndWidth($WorkSheetName = "Raman", $XlsColumnNames = null, $XlsColumnWidth = null)
   {
       //Hide MS Excel application window
       $this->XLSHandle->Visible = 0;
       //Create new document
       $this->xlBook = $this->XLSHandle->Workbooks->Add();

       //Create Sheet 1
       $this->xlBook->Worksheets(1)->Name = $WorkSheetName;
       $this->xlBook->Worksheets(1)->Select;

       if($XlsColumnWidth != null)
       {
           //$XlsColumnWidth = array("A1"=>15,"B1"=>20);
           foreach($XlsColumnWidth as $Clm=>$Width)
           {
               //Set Columns Width
               $this->XLSHandle->ActiveSheet->Range($Clm.":".$Clm)->ColumnWidth = $Width;
           }    
       }
       if($XlsColumnNames != null)
       {
           //$XlsColumnNames = array("FirstColumnName"=>1, "SecondColumnName"=>2);
           foreach($XlsColumnNames as $ClmName=>$ClmNumber)
           {
               // Cells(Row,Column)
               $this->XLSHandle->ActiveSheet->Cells(1,$ClmNumber)->Value = $ClmName;
               $this->XLSHandle->ActiveSheet->Cells(1,$ClmNumber)->Font->Bold = True;
               $this->XLSHandle->ActiveSheet->Cells(1,$ClmNumber)->Interior->ColorIndex = "15";
           }
       }
   }
   //56 is for xls 8
    public function SaveCreatedFile($FileName, $FileFormat = 56)
    {
        $this->xlBook->SaveAs($FileName, $FileFormat);
    }

    public function MakeFileVisible()
    {
       //Hide MS Excel application window`enter code here`
       $this->XLSHandle->Visible = 1;
    }
}//end of Excel class
2
Vicky