111 votes

Lecture d'un fichier Excel en PHP

J'essaie de lire un fichier Excel (Office 2003). Il existe un fichier Excel qui doit être téléchargé et dont le contenu doit être analysé.

Via Google, je ne peux trouver que des réponses à ces sujets connexes (et insuffisants) : générer des fichiers Excel, lire des fichiers Excel XML, lire des fichiers Excel CSV, ou des projets abandonnés incomplets. Je possède Office 2003, donc si j'ai besoin de fichiers de cette application, ils sont disponibles. Il est installé sur ma boîte mais n'est pas et ne peut pas être installé sur mon hôte partagé.

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

1 votes

3 votes

Les deux liens sur l'Edit sont cassés !

1 votes

Tout comme une mise à jour de PhpSpreadsheet en github.com/PHPOffice/PhpSpreadsheet est la bibliothèque utilisée pour cela maintenant

62voto

Ionuț G. Stan Points 62482

Vous avez deux choix, pour autant que je sache :

  1. Lecteur de feuilles de calcul_Excel qui connaît le format binaire d'Office 2003
  2. PHPExcel qui connaît aussi bien Office 2003 qu'Excel 2007 (XML). (Suivez le lien, et vous verrez qu'ils ont mis à jour cette bibliothèque à PHPSpreadSheet )

PHPExcel utilise Spreadsheet_Excel_Reader pour le format Office 2003.

Mise à jour : j'ai dû une fois lire des fichiers Excel, mais j'ai utilisé le format XML d'Office 2003 pour les lire et j'ai dit aux personnes qui utilisaient l'application d'enregistrer et de télécharger uniquement ce type de fichier Excel.

0 votes

@NTulip : Je ne vois rien dans les listes de fonctionnalités ou la documentation de l'un ou l'autre pour suggérer qu'ils peuvent lire des fichiers Excel. Des exemples ?

0 votes

@Dinah, tu as raison. J'ai fait les changements appropriés dans ma réponse.

4 votes

PHPExcel a toujours été capable de lire et d'écrire une série de formats de feuilles de calcul. Je cite la première ligne de la page d'accueil qui n'est pas un titre : "Projet fournissant un ensemble de classes pour le langage de programmation PHP, qui vous permet de écrire à y lire de différents formats de fichiers, comme Excel 2007, PDF, HTML" (c'est moi qui souligne).

56voto

Luis Melgratti Points 6297

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

8 votes

Cela ne fonctionne pas pour moi, j'ai php 5.2+, cela me donne l'erreur "Assigning the return value of new by reference is deprecated".

0 votes

Même chose @hRaval, avez-vous trouvé une solution à ce problème plus tard ?

6 votes

Hé les gars, j'ai corrigé quelques trucs pour le rendre compatible avec les récentes versions de PHP 5 : pastebin.com/YNUZANcs Tous les crédits vont aux développeurs originaux.

25voto

Sergey Shuchkin Points 441

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

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

Sortie

Array (
    \[0\] => Array
        (
            \[0\] => ISBN
            \[1\] => title
            \[2\] => author
            \[3\] => publisher
            \[4\] => ctry
        )
    \[1\] => Array
        (
            \[0\] => 618260307
            \[1\] => The Hobbit
            \[2\] => J. R. R. Tolkien
            \[3\] => Houghton Mifflin
            \[4\] => USA
       )

)

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

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

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

if ( $csv = SimpleCSV::import('book.csv') ) {
    print_r( $csv );
}

1 votes

Voici la réponse qui a résolu mon problème en utilisant PHP7

20voto

Jimbo Points 121

Cela dépend de la façon dont vous voulez utiliser les données du fichier Excel. Si vous souhaitez les importer dans mysql, vous pouvez simplement les enregistrer dans un fichier au format CSV, puis utiliser la fonction fgetcsv pour l'analyser.

5voto

Vicky Points 67
// 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 votes

Cela semble correct si votre serveur PHP fonctionne sous Windows et si Excel est installé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X