info2gestion

Accueil

PHP

PHPOffice

PHPSpreadsheet

Ecriture d'un classeur libreoffice calc - exemple

La librairie PHPSpreadSheet permet d'accéder à des documents ou classeurs en lecture et de créer des documents ou classeurs. Actuellement, cette librairie ne propose pas la fonctionnalité de modification d'un document ou classeur existant.

Cependant, il est possible d'ouvrir un classeur en lecture et créer un document ou classeur avec les données du classeur ouvert précédemment. Dans ce traitement, les données peuvent être modifiées et enregistrées dans un nouveau classeur.

L'exemple suivant propose d'ouvrir un classeur, de modifier et d'enregistrer les données dans un nouveau classeur.


Exemple saisie des éléments variables du salaire brut

Contrôle de la rémunération brute totale avec le montant minimum au 1er janvier 2024

+ AVANTAGES EN NATURE
(Logement, nourriture, etc…)

+ PRIMES DE PRODUCTION /
RENDEMENT INDIVIDUEL

+ PRIME DE RENDEMENT GLOBALE
(avec intervention du salarié)

+ PRIME DE FIN D'ANNEE
(Si lié au travail effectif du salarié)

+ COMMISSION SUR CHIFFRE AFFAIRE (CA)

+ PRIME DE PERFORMANCE

+ PARTIE VARIABLE SUR CA

+ PRIME POUVOIR ACHAT
(Si liée à une prestation de travail)

+ PRIME D'INVENTAIRE

+ PRIME DE VACANCES
(Uniquement le mois du versement)

+ PRIME DE 13eme MOIS
(Uniquement le mois du versement)

Enregistre la saisie dans un classeur
classeur en téléchargement ci-dessous





Le script ci-dessus montre de manière basique une intéraction entre un formulaire de saisie web et un classeur qui s'ouvre en local sur une application de tableur graphique (libre office, open office ou excel).

Cet exemple montre que le classeur en sortie contient tous les calculs pour cette saisie et que donc le script ne contient aucuns calculs.

L'avantage de cette situation est une économie de ligne de code dans le script. La maintenance du script est également simplifiée. Un inconvénient est de devoir créer un formulaire web qui contient les champs de saisie avec les contrôles qui vont avec. Dans cet exemple, le formulaire est entièrement géré avec du html (et une feuille de style).

Un autre avantage est de pouvoir contrôler la saisie sur un classeur et d'éviter une altération des données volontaire ou involontaire par un utilisateur. Dans une session cloud, ce contrôle se fait avec des permissions.

Dans cet exemple, ce contrôle s'effectue avec un formulaire qui copie les données saisie dans un nouveau classeur sans modifier le classeur source. Le script ci-dessous montre une gestion possible de cet exemple avec les principales étapes.

Script PHP utilisé pour cet exemple


<?php

require_once 'vendor/autoload.php';
$reader = new \PhpOffice\PhpSpreadsheet\Writer\Ods();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

 // controle de saisie
 $boo1 = false // pas de saisie
 $boo2 = true; // saisie invalide

 if (is_numeric($_POST['frm_sal'])) { // champ formulaire salaire
  $vnm_sal = $_POST['frm_sal'];
  $boo1 = true;
 } elseif (empty($_POST['frm_sal'])){
  $vnm_sal = "";
 } else  {
  echo "<p>Saisie erronée</p>";
  $boo2 = false;
 }

 if (is_numeric($_POST['frm_avnat'])) { // champs avantage nature
  $vnm_sal = $_POST['frm_avnat'];
  $boo1 = true;
 } elseif (empty($_POST['frm_avnat'])){
  $vnm_sal = "";
 } else  {
  echo "<p>Saisie erronée</p>";
  $boo2 = false;
 }

 // gestion des autres champs identique
 if (...)...{...}...

 // OUVERTURE EN MEMOIRE

 if ($boo1){ // controle au moins 1 saisie, on continue
   $reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods();
   $filename = 'fichier_en_lecture.ods';
   $spreadsheet = $reader->load($filename);
   $sheet = $spreadsheet->getSheet(0);

   // ECRITURE EN MEMOIRE

   $sheet->setCellValue('B2', $frm_sal);
   $sheet->setCellValue('B3', $frm_avnat);
   ...
   $sheet->setCellValue('B...', $...);
   // application d'un format affichage des nombres
   $sheet->getStyle('B:B')->getAlignment()->setHorizontal('right');

   // à cette étape, on peut lire une valeur du classeur existant
   // et par exemple passer cette valeur à javascript...

   //on enregistre les données en mémoire dans un nouveau classeur
   $nouveauClasseur = 'classeur_en_ecriture.ods';
   $writer = new \PhpOffice\PhpSpreadsheet\Writer\Ods($spreadsheet);
   $writer->save($nouveauClasseur);

 } // boo1
 else {
   echo "<p style=color:crimson>Aucuns montants saisis</p>";
 } // else boo1
} // SERVER['REQUEST_METHOD']

?>

Le script de cet exemple est une version basique pour afficher le contenu d'un classeur source qui contient des calculs et se servir des données du classeur pour créer un nouveau classeur avec les calculs du classeur source.