1 pièce(s) jointe(s)
extraire des donnée d'un fichier excel vers une BDD
Bonjour.
je m'exerce sur php (symfony) depuis quelques temps. je me situe plutôt du côté débutant !
Mais pour ne pas le rester trop longtemps, je fais une application sur la nutrition ( comme exercice ).
Pour résumer l'application: elle offre la possibilité pour une personne de savoir ce qu'il y a dans son assiette.
Elle pourra savoir combien de calories fait son plat composé de plusieurs aliments, sa quantité de protéines, lipides, glucides, vitamines, ...
Le tout sur un repas, un jour, une semaine, ...
J'ai donc besoin de savoir quelle est la composition nutritionnelle des aliments de base !
J'ai pour ça le site ciqual. Et ce site partage ses données... avec fichier excel.
J'aurais préféré une une BDD avec une API !
Je n'ai pas le choix, je vais devoir extraire ces données et les rentrer dans ma BDD.
Voici à quoi ressemble le fichier Excel:
Pièce jointe 645803
Il y a exactement 67 constituants pour chaque aliment ( 67 colonnes) pour 3185 aliments !
Je ne veux pas tous les constituants de chaque aliments, seulement une trentaine! ( ça fait déjà moins de données...)
Pour extraire, j'ai entendu parler de la librairie PhpSpreadsheet
Avec ce code appelé dans mon index.php, je récupère les coordonnées des cellules d'une ligne ( A2, B2, C2, ...) sous forme de tableau.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<?php
require __DIR__.'/vendor/autoload.php';
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter {
public function readCell($columnAddress, $row, $worksheetName = '') {
if ($row >= 2 && $row < 3) {
return true;
}
return false;
}
}
function extraction()
{
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xls');
$reader->setReadFilter( new MyReadFilter() );
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("ciqual_2020.xls");
$worksheet = $spreadsheet->getActiveSheet();
$coordinates = $worksheet->getCellCollection()->getCoordinates();
return $coordinates;
} |
Je pourrai ensuite obtenir les valeurs des cellules (avec une boucle sur les coordonnées ) :
Code:
1 2
|
$cellValue = $worksheet->getCell($coordinate)->getValue() |
En partant de là je crois avoir compris comment choisir des colonnes qui m'intéressent et je peux faire les 3185 aliments et mettre tout ça dans un tableau.
(un super tableau d'objets indexés)
Puis je bouclerai sur ce tableau pour remplir ma table en BDD...
D'où ma question: je m'y prends correctement ? Ou bien il y a une autre façon de faire ?
Merci pour vos réponses
Laurent.