Installation
Pour gérer des fichiers Excel sur un site créé avec Symfony, on va utiliser le package PhpSpreadsheet. Pour l’installer, on utilise la commande Composer
composer require phpoffice/phpspreadsheet
Création d’un fichier Excel
Nous allons reprendre ici, l’exemple présenté dans la documentation officielle (PhpSpreadsheet Documentation)
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
[...]
#[Route('/excel/create', name: 'create_excel')]
public function create(): Response
{
$spreadsheet = new Spreadsheet();
$activeWorksheet = $spreadsheet->getActiveSheet();
$activeWorksheet->setCellValue('A1', 'Hello World !');
$writer = new Xlsx($spreadsheet);
$writer->save('hello world.xlsx');
$this->addFlash('success', 'Fichier Excel Créé');
return $this->redirectToRoute('app_excel');
}
Pour créer un fichier Excel, commencez par créer un nouvel objet $spreadsheet représentant un classeur (ligne 7).
Ensuite, récupérez l’objet représentant la première feuille de calcul grâce à la méthode getActiveSheet() (ligne8).
La méthode setCellValue() ajoute une valeur à une cellule spécifique de la feuille de calcul (ligne 9).
Vous pouvez également utiliser la méthode fromArray() pour ajouter un tableau entier de données à la feuille de calcul. Voici l’exemple proposé dans la documentation officielle.
$arrayData = [
[NULL, 2010, 2011, 2012],
['Q1', 12, 15, 21],
['Q2', 56, 73, 86],
['Q3', 52, 61, 69],
['Q4', 30, 32, 0],
];
$spreadsheet->getActiveSheet()
->fromArray(
$arrayData, // The data to set
NULL, // Array values with this value will not be set
'C3' // Top left coordinate of the worksheet range where
// we want to set these values (default is A1)
);
Une fois le classeur prêt, vous l’écrivez dans un fichier Excel en créant un nouvel objet de la classe Xlsx (ligne 11) et en utilisant la méthode save() pour sauvegarder le fichier dans le dossier public de votre projet (ligne 12).
Lire un fichier Excel
On lit également les fichiers Excel depuis un contrôleur. En voici un exemple :
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
[...]
#[Route('excel/read', name: 'read_excel')]
public function read(): Response {
$inputFileName = "hello world.xlsx"; // A remplacer
$reader = new XlsxReader();
$spreadsheet = $reader->load($inputFileName);
$worksheet = $spreadsheet->getSheet(0);
$title = $worksheet->getCell("A1");
return $this->render('excel/index.html.twig', [
'controller_name' => $title,
]);
}
À la ligne 6, on récupère le chemin vers le fichier à lire. Ici, j’ai repris le fichier généré dans la section précédente, mais il est également possible de le récupérer par téléversement.
Cette fois-ci, pour lire le fichier Excel, on crée, un objet Xlsx depuis le package PhpOffice\PhpSpreadsheet\Reader\Xlsx (ligne 7) .Comme la classe Xlsx est déjà chargée dans mon fichier, nous pouvons la renommer XlsxReader pour éviter les conflits.
À partir de ce lecteur, on peut charger le classeur dans l’objet $spreadsheet (ligne 8), ce qui nous permet de récupérer la première feuille (ligne 9) et la cellule « A1 » de cette feuille (ligne 10).
Autres fonctionnalités
Le package PhpSpreadsheet permet de lire et d’écrire dans des fichiers Excel de différentes manières grâce aux méthodes implémentées.
La classe représentant les feuilles de calcule fournit, en autres, un itérateur pour parcourir toutes les lignes d’une feuille de calcul une à une. Voici, comment l’utiliser :
foreach ($worksheet->getRowIterator(2) as $row) {
$rowIndex = $row->getRowIndex();
$col1 = $worksheet->getCell([1, $rowIndex])->getValue();
$col2 = $worksheet->getCell([2, $rowIndex])->getValue();
}
Dans cette exemple, l’itérateur commence à la ligne 2, afin de ne pas lire la ligne d’intitulés de colonne. La méthode getRowIndex(), permet de récupérer le numéro de la ligne.
La méthode getCell() peut s’utiliser avec le nom de la cellule (ex: "A1") et ses coordonnées, via un tableau [numCol, nomRow].
Pour en savoir plus sur le package PhpSpreadsheet , n’hésitez pas à consulter la documentation officielle.
