Export en PDF

Default
,

Bonjour,

Après avoir réussi l'export en Excel, je me suis attaqué à l'export en PDF avec PhpExcel.
Cependant, même en utilisant l'exemple proposé ici : https://github.com/PHPOffice/PHPExcel/blob/1.8/Examples/01simple-download-pdf.php
Cela ne fonctionne pas à cause de ce code :

if (!PHPExcel_Settings::setPdfRenderer(
        $rendererName,
        $rendererLibraryPath
    )) {
    die(
        'NOTICE: Please set the $rendererName and $rendererLibraryPath values' .
        '<br />' .
        'at the top of this script as appropriate for your directory structure'
    );
}

Voici la fonction en entier

 function exportPDF() {

    /** Error reporting */
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    date_default_timezone_set('Europe/London');

    if (PHP_SAPI == 'cli')
        die('This example should only be run from a Web Browser');
    /** Include PHPExcel */
    require_once dirname(__FILE__) . '/../Classes/PHPExcel.php';
    //  Change these values to select the Rendering library that you wish to use
    //      and its directory location on your server
    //$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF;
    $rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF;
    //$rendererName = PHPExcel_Settings::PDF_RENDERER_DOMPDF;
    //$rendererLibrary = 'tcPDF5.9';
    $rendererLibrary = 'mPDF5.4';
    //$rendererLibrary = 'domPDF0.6.0beta3';
    $rendererLibraryPath = dirname(__FILE__).'/../Classes/PHPExcel/Writer/PDF/' . $rendererLibrary;

    // Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
->setLastModifiedBy("Maarten Balliauw")
                            ->setTitle("PDF Test Document")
                            ->setSubject("PDF Test Document")
                            ->setDescription("Test document for PDF, generated using PHP classes.")
                            ->setKeywords("pdf php")
                            ->setCategory("Test result file");

                            // Add some data
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Hello')
            ->setCellValue('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');

                        // Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A4', 'Miscellaneous glyphs')
            ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

                        // Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
$objPHPExcel->getActiveSheet()->setShowGridLines(false);

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

if (!PHPExcel_Settings::setPdfRenderer(
        $rendererName,
        $rendererLibraryPath
    )) {
    die(
        'NOTICE: Please set the $rendererName and $rendererLibraryPath values' .
        '<br />' .
        'at the top of this script as appropriate for your directory structure'
    );
}

// Redirect output to a client’s web browser (PDF)
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="01simple.pdf"');
header('Cache-Control: max-age=0');


$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->save('php://output');
exit;
}

Je dois avouer que je vois pas trop où est le problème, j'ai pourtant bien mis les chemins exacts.

Décrivez ici vos erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

13 Réponse

17162
,

Bonjour.
La raison est pourtant simple :

This repository has been archived by the owner. It is now read-only.
PHPExcel - DEAD
PHPExcel last version, 1.8.1, was released in 2015. The project was officially deprecated in 2017 and permanently archived in 2019.

The project has not be maintained for years and must not be used anymore. All users must migrate to its direct successor PhpSpreadsheet, or another alternative.

Tu n'es certes pas à blamer par rapport à cet avertissement étant donné le nombre récent d'Issues et de Pull Requests qui y ont été soumises, mais tu aurais pu le prendre en compte et plutôt utiliser celle qui y est proposée.
En plus de cela, tu as recopié exactement le code qui se situe dans la page d'exemple, alors que je ne pense pas que tu aies créé ton fichier qui contient ta fonction exportPDF dans le dossier Examples de la librairie.
De plus que dans la librairie il n'y a aucun dossier qui se nomme mPDF5.4 dans le dossier Classes/PHPExcel/Writer/PDF

Default
,

Donc il vaut mieux éviter phpExcel et passer à PhpSpreadsheet ?
Sinon j'ai voulu tester celui ci mais je me retrouve avec cela comme erreur

Fatal error: Uncaught Exception: Composer autoloader could not be found. Install dependencies with composer install and try again. in C:\wamp\www\ludotheque\Classes\Bootstrap.php on line 22
( ! ) Exception: Composer autoloader could not be found. Install dependencies with composer install and try again. in C:\wamp\www\ludotheque\Classes\Bootstrap.php on line 22

Mais je vois pas où se trouve autoloader..

17162
,

Donc il vaut mieux éviter phpExcel et passer à PhpSpreadsheet ?

Tout à fait.

Comment as-tu récupéré la librairie ?
Si tu n'as pas utilisé Composer pour récupérer la librairie, tu n'y arriveras pas étant donné que la librairie nécessite Composer pour fonctionner car elle à des dépendances requises et qu'elles doivent être installées via Composer.

Mais je vois pas où se trouve autoloader..

En ce qui concerne l'autoloader, il s'agit justement de l'autoloader de Composer, d'où l'importance d'utiliser Composer pour installer et utiliser la librairie.

Default
,

Composer ? C'est à dire?

17162
,

Composer ? C'est à dire?

Tutoriel Vidéo Composer.
C'est tout simplement un gestionnaire de dépendances pour PHP, je te laisses voir la suite, soit son utilité et comment l'installer sur ton système d'exploitation et l'utiliser dans le tutoriel.

Default
,

Bon j'ai essayer de suivre au mieux le tuto. Je me retrouve maintenant avec cela comme erreur :

Fatal error: Uncaught Error: Class 'Sample' not found in C:\wamp\www\ludotheque\model\modelAdmin.php on line 167
( ! ) Error: Class 'Sample' not found in C:\wamp\www\ludotheque\model\modelAdmin.php on line 167

function exportBDD() {

require './vendor/autoload.php';

require './vendor/phpoffice/PhpSpreadsheet/src/PhpSpreadsheet/Helper/Sample.php';
require './vendor/phpoffice/PhpSpreadsheet/src/PhpSpreadsheet/IOFactory.php';
require './vendor/phpoffice/PhpSpreadsheet/src/PhpSpreadsheet/Spreadsheet.php';

require_once './vendor/phpoffice/PhpSpreadsheet/src/Bootstrap.php';

    $helper = new Sample();
    if ($helper->isCli()) {
        $helper->log('This example should only be run from a Web Browser' . PHP_EOL);
        return;
    }
    // Create new Spreadsheet object
    $spreadsheet = new Spreadsheet();
    // Set document properties
    $spreadsheet->getProperties()->setCreator('Maarten Balliauw')
        ->setLastModifiedBy('Maarten Balliauw')
        ->setTitle('Office 2007 XLSX Test Document')
        ->setSubject('Office 2007 XLSX Test Document')
        ->setDescription('Test document for Office 2007 XLSX, generated using PHP classes.')
        ->setKeywords('office 2007 openxml php')
        ->setCategory('Test result file');
    // Add some data
    $spreadsheet->setActiveSheetIndex(0)
        ->setCellValue('A1', 'Hello')
        ->setCellValue('B2', 'world!')
        ->setCellValue('C1', 'Hello')
        ->setCellValue('D2', 'world!');
    // Miscellaneous glyphs, UTF-8
    $spreadsheet->setActiveSheetIndex(0)
        ->setCellValue('A4', 'Miscellaneous glyphs')
        ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');
    // Rename worksheet
    $spreadsheet->getActiveSheet()->setTitle('Simple');
    // Set active sheet index to the first sheet, so Excel opens this as the first sheet
    $spreadsheet->setActiveSheetIndex(0);
    // Redirect output to a client’s web browser (Xlsx)
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="01simple.xlsx"');
    header('Cache-Control: max-age=0');
    // If you're serving to IE 9, then the following may be needed
    header('Cache-Control: max-age=1');
    // If you're serving to IE over SSL, then the following may be needed
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
    header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
    header('Pragma: public'); // HTTP/1.0
    $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
    $writer->save('php://output');
    exit;
}
17162
,

Fatal error: Uncaught Error: Class 'Sample' not found in C:\wamp\www\ludotheque\model\modelAdmin.php on line 167

Cela veut simplement dire que la classe Sample n'est pas chargée, si tu as bien suivi le tutoriel vidéo, tu devrais savoir qu'il ne faut pas faire de require pour charger les classes, mais qu'il te faut utiliser use.
De plus qu'à première vue tu ne charges pas correctement l'autoloader de Composer étant donné que tu es censé installer les dépendances à la racine de ton projet qui se situe dans C:\wamp\www\ludotheque, que le fichier dans lequel tu fais un require de l'autoloader se situe dans C:\wamp\www\ludotheque\model et dans le chemin pour l'autoloader tu le définies comme si le dossier vendor de Composer se situe dans le même dossier que le fichier modelAdmin.php.
En plus de ça, si tu avais lu un minimum la documentation de la librairie, tu n'aurais pas fait la plupart de ces mauvaises manip.

<?php
require 'vendor/autoload.php'; // À modifier pour charger le fichier avec le bon chemin pour y accéder

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Hello World !');

$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');

À part l'inclusion de l'autoloader de Composer, est ce que tu vois d'autres inclusions dans ce morceau de code ?
Il te faut donc faire l'inclusion de l'autoloader et les use en début de ton fichier modelAdmin.php, puis tu initialises et utilises les classes dans ta fonction, soit :

<?php
require '../vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Helper\Sample;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
// ...
function exportBDD() {
    $helper = new Sample();
    // Suite du code ...
}
Default
,

Sa marche nickel super :) merci.

Tant que j'y suis, je suis entrain de voir aussi l'export en pdf, mais il me dit qu'il y a une erreur à ce niveau

Fatal error: Uncaught Error: Class 'Mpdf\Mpdf' not found in C:\wamp\www\ludotheque\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Writer\Pdf\Mpdf.php on line 20

une idée ?

17162
,

Oui, il te faut faire composer require mpdf/mpdf pour importer la librairie Mpdf dans ton projet, car la librairie n'importe que les librairies qui lui sont nécessaire pour son fonctionnement de base, les librairie concernant la génération de PDF n'en fait pas partie par exemple.
Quand tu as du faire la commande composer require phpoffice/phpspreadsheet, à la fin de l'import de la librairie et de ses dépendances directes, tu as du avoir plusieurs lignes du genre : phpoffice/phpspreadsheet suggest install mpdf/mpdf : Option for rendering PDF with PDF Writer.

Default
,

C'est ce que j'ai fait mais tu l'inclus comment ensuite au reste du code?

17162
,

Tu utilise use pour charger la classe de la librairie et ensuite tu instancies la classe là où tu en a besoin dans ton code, soit par exemple :

<?php
// Liste des use précédents
use Mpdf\Mpdf;
// Ensuite à l'endroit de ta page où tu veux utiliser la classe :
$pdf = new Mpdf();
// ...

Ou alors, tu peux faire sans le use, mais il te faudra en plus préfixer le nom de la classe par son namespace, soit :

<?php
// ...
$pdf = new Mpdf\Mpdf();
// ...
Default
,

Donc je met le use et ensuite je remplace new Spreadsheet par new Mpdf()?

function exportPDF() {

    /** Error reporting */
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    date_default_timezone_set('Europe/London');

    $helper = new Sample();
if ($helper->isCli()) {
    $helper->log('This example should only be run from a Web Browser' . PHP_EOL);
    return;
}
// Create new Spreadsheet object
$spreadsheet = new Spreadsheet();
// Set document properties
$spreadsheet->getProperties()->setCreator('Thomas Courtiol')
    ->setLastModifiedBy('Thomas Courtiol')
    ->setTitle('Ludothèque')
    ->setSubject('PDF Test Document')
    ->setDescription('Listes des jeux.')
    ->setKeywords('pdf php')
    ->setCategory('Test result file');
// Add some data
$spreadsheet->setActiveSheetIndex(0)
    ->setCellValue('A1', 'Hello')
    ->setCellValue('B2', 'world!')
    ->setCellValue('C1', 'Hello')
    ->setCellValue('D2', 'world!');
// Miscellaneous glyphs, UTF-8
$spreadsheet->setActiveSheetIndex(0)
    ->setCellValue('A4', 'Miscellaneous glyphs')
    ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');
// Rename worksheet
$spreadsheet->getActiveSheet()->setTitle('Simple');
$spreadsheet->getActiveSheet()->setShowGridLines(false);
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$spreadsheet->setActiveSheetIndex(0);
IOFactory::registerWriter('Pdf', \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf::class);
// Redirect output to a client’s web browser (PDF)
header('Content-Type: application/pdf');
header('Content-Disposition: attachment;filename="jeu.pdf"');
header('Cache-Control: max-age=0');
$writer = IOFactory::createWriter($spreadsheet, 'Pdf');
$writer->save('php://output');
exit;
}
17162
,

Je veux bien t'aider à résoudre des problèmes de code, mais je ne vais pas t'expliquer comment utiliser une librairie spécifique.
Si tu veux savoir comment utiliser la librairie Mpdf avec PhpSpreadsheet, il te suffit de regarder dans la documentation de la seconde : Reading and writing to file : Pdf.
Si tu veux utiliser la librairie Mpdf via PhpSpreadsheet, tu n'as pas besoin d'initialiser et importer la première, car la seconde le fait elle même.
Je t'avais seulement expliqué comment débuter avec Mpdf.