Je trouve le script très intéressant et je rejoins le commentaire de MKOURKCH. Avez vous eu des pistes pour adapter la largeur ou la hauteur du tableau pour que l'on puisse voir l'intégralité du contenu des cellules?
Autre modification sur laquelle je cherche une solution: éviter que le tableau ne soit édité sur la même cellule par 2 personnes à la fois (accès concurrent) l'idée est de relire le fichier juste avant la sauvegarde et d'interdire l'écrasement d'une cellule modifiée entre temps.)
Votre script est parfait mais j'aime bien l'etendre un peu pour rendre des celulles resizable en fonction du text qu'elles contiennent .
Quelqu'un a t'il une idée pour ça (des que on sort de la celulle onBlur() sa taille doit changer ) .
Voila, j'ai pu remarquer que quand on ouvre la page une seconde fois, les modifications apportés n'apparaisent pas en ligne (ce qui est un peu génant pour ma part).
Si vous voulez que les modifications faites auparavant apparaissent à la prochaine ouverture vous pouvez changer le fichier index.php avec cela.
------------------------------------------------
<?php
//Config du tableur par défaut
$col = 5;
$ligne = 100;
// On prend la valeur 'Ligne' et la valeur 'col'
$ligne = $_POST["ligne"];
$col = $_POST["col"];
// Ensuite, on épure le tableau:
// On a plus besoin de 'col', 'ligne' ,'action', et 'doc'
// donc, on les efface.
$_GET["doc"]=$_POST["doc"];
array_splice($_POST, 0, 4);
// Ensuite, nous reste le tableau contenant les valeurs des cellules.
// On va donc charger ces données dans une variables bi-dimensionnelle
// afin de pouvoir la traiter
$tblDB = array();
$varCol = 0;
$varLigne = 1;
reset ($_POST);
while (list ($key, $val) = each ($_POST)) {
$varCol++;
$tblDB[$varLigne][$varCol]=$val;
if($varCol==$col){
$varCol=0;
$varLigne++;
}
}
// Maintenant que le tableau a été créé, il faut le traiter.
// Il se peut qu'il y ait des lignes à la fin non utilisée,
// et donc ce n'est pas la peine de les enregistrer, donc,
// il faut les supprimer.
$etiquette = "";
$num = count($tblDB); // Retourne le nombre de lignes
// Tant qu'on a pas terminé
while($etiquette<>"fin"){
$var = "";
// On met dans une variable chaque colonnes
for($a=1;$a<=count($tblDB[$num]);$a++){
$var.=$tblDB[$num][$a];
}
// Si la somme de toutes les colonnes de la ligne
// est vide, alors, on supprime cette ligne
// et on enlève '1' au compteur '$num'
// Sinon, c'est que c'est bon
if($var==""){
array_splice($tblDB, $num, 1);
$num--;
}else{
$etiquette="fin";
}
// Si il n'y a aucun enregistrement, on sort
if($num==0){
$etiquette="fin";
}
}
// Ensuite, on enregistre!
// (Même technique que l'affichage)
$texte = "";
$fp=fopen($_GET["doc"],"w");
for($a=0;$a<count($tblDB);$a++){
for($b=1;$b<=count($tblDB[$a]);$b++){
$texte.=$tblDB[$a][$b].";";
}
// Comme à la fin de chaque ligne il y a ';'
// (une cellule de trop), on la supprime
fputs($fp,substr($texte,0,-1)."\r\n");
$texte="";
}
fclose($fp);
}
// On regarde si il y a un fichier à ouvrire:
// Si oui, on charge ce fichier
// dans une variable bi-dimensionnelle.
$fp=fopen("tableau.csv","r+");
$dim1=0;
while(!feof($fp)){
$dim1++;
$tmp=fgets($fp,1000);
if($tmp!=""){
$tbl[$dim1] = explode(";",$tmp);
$col=sizeof($tbl[$dim1]);
}
}
fclose($fp);
// Dabord, on va créer la ligne du haut qui contient les lettres
// $asc=65 donne 'A', donc, à chaque fois, on incrémente de 1 pr monter dans l'alphabet
$tableur = "<tr>";
$asc=65;
$tableur.= "<td class="clsFOND"> </td>\n";
for($a=$asc;$a<($asc+$col);$a++){
$tableur.="<td class="clsFOND">".chr($a)."</td>\n";
}
$tableur.= "</tr>\n\n";
// Maintenant, on va tracer le tableau en colone
for($i=1;$i<=$ligne;$i++){
$tableur.= "<tr>";
$tableur.= "<td class="clsFOND" style="width:32px"> $i </td>";
// Puis en ligne
for($j=0;$j<$col;$j++){
$tableur.= "<td class="clsCEL"></td>\n";
}
$tableur.= "</tr>\n\n";
}
?>
<script>
// Code JavaScript pour la navigation entre celulles.
// Quand on utilise les flèches, on change de celulle active.
// Il semblerait qu'il y ait des problèmes de compatibilités...
// Voilà donc la liste des explorateurs testés:
// Testé sous:
// - FireFox : Marche pas
// - IE : Marche très bien!
// - NetScape : Marche pas
// - Opera : Marche pas
// Ceci est sans doute dut aux deux attribus factices ('col' et 'ligne')
// L'idée n'était pas mauvaise! Mais, à creuser! Mdr!
function txtKeyDown(txt, evt) {
bouge = false;
obj = document.getElementById(txt);
nomId = obj.id;
nomId = nomId.split("_");
col_ = nomId[1];
ligne_ = nomId[2];
codeClavier = -1;
if(document.all){
codeClavier = event.keyCode;
codeClavier = event.keyCode;
}else{
codeClavier = evt.which;
codeClavier = evt.which;
}
// On presse la flèche de gauche
if (codeClavier == 37) {
col_--;
bouge = true;
}
// On presse la flèche du haut
else if(codeClavier == 38){
ligne_--;
bouge = true;
}
// On presse la flèche de droite
else if(codeClavier == 39){
col_++;
bouge = true;
}
// On presse la flèche du bas
else if(codeClavier == 40){
ligne_++;
bouge = true;
}
if (bouge && document.getElementById("c_"+col_+"_"+ligne_) != null) {
objDest = document.getElementById("c_"+col_+"_"+ligne_);
objDest.focus();
}
}
</script>
</head>
'lu,
Je vais continuer dans la série des mercie. J'ai un petit projet dans mon coin et je me demandais comment réaliser ce genre de chose utile.
Donc, bah merci !
ciao
Salut,
sans trop approfondir j'ai changé certaines lignes de ton code et ça marche sans les bugs sur ie, netscape et firefox (les dernières versions)
J'ai remplacé :
>> $tableur.= "<td class="clsCEL">> <script>
>> var col_;
>> var ligne_;
>> // Code JavaScript pour la navigation entre celulles.
>> // Quand on utilise les flèches, on change de celulle active.
>> // Il semblerait qu'il y ait des problèmes de compatibilités...
>> // Voilà donc la liste des explorateurs testés:
>> // Testé sous:
>> // - FireFox : Marche pas
>> // - IE : Marche très bien!
>> // - NetScape : Marche pas
>> // - Opera : Marche pas
>> // Ceci est sans doute dut aux deux attribus factices ('col' et 'ligne')
>> // L'idée n'était pas mauvaise! Mais, à creuser! Mdr!
>> function txtKeyDown(txt){
>> col_ = document.getElementById(txt).col;
>> ligne_ = document.getElementById(txt).ligne;
>> // On presse la flèche de gauche
>> if(event.keyCode==37){
>> col_--;
>> focuss();
>> }
>> // On presse la flèche du haut
>> else if(event.keyCode==38){
>> ligne_--;
>> focuss();
>> }
>> // On presse la flèche de droite
>> else if(event.keyCode==39){
>> col_++;
>> focuss();
>> }
>> // On presse la flèche du bas
>> else if(event.keyCode==40){
>> ligne_++;
>> focuss();
>> }
>> }
>> function focuss(){
>> // Normalement, ici on met la gestion de l'erreur
>> // Mais je n'ai pas encore trouvé comment.
>> // Bug: Si on est en tout début ou en fin de tableau,
>> // Et qu'il n'y a pas de suivante, il y a une erreur.
>> // Par exemple, mettez vous sur 'A1' et pressez la flèche du haut.
>> if(document.getElementById("c"+col_+"l"+ligne_).type=="text"){
>> document.getElementById("c"+col_+"l"+ligne_).focus();
>> }
>>
>> }
>> </script>
par :
<script>
// Code JavaScript pour la navigation entre celulles.
// Quand on utilise les flèches, on change de celulle active.
// Il semblerait qu'il y ait des problèmes de compatibilités...
// Voilà donc la liste des explorateurs testés:
// Testé sous:
// - FireFox : Marche pas
// - IE : Marche très bien!
// - NetScape : Marche pas
// - Opera : Marche pas
// Ceci est sans doute dut aux deux attribus factices ('col' et 'ligne')
// L'idée n'était pas mauvaise! Mais, à creuser! Mdr!
function txtKeyDown(txt, evt) {
bouge = false;
obj = document.getElementById(txt);
nomId = obj.id;
nomId = nomId.split("_");
col_ = nomId[1];
ligne_ = nomId[2];
codeClavier = -1;
if (document.all) {
codeClavier = event.keyCode;
codeClavier = event.keyCode;
} else {
codeClavier = evt.which;
codeClavier = evt.which;
}
// On presse la flèche de gauche
if (codeClavier == 37) {
col_--;
bouge = true;
}
// On presse la flèche du haut
else if(codeClavier == 38){
ligne_--;
bouge = true;
}
// On presse la flèche de droite
else if(codeClavier == 39){
col_++;
bouge = true;
}
// On presse la flèche du bas
else if(codeClavier == 40){
ligne_++;
bouge = true;
}
if (bouge && document.getElementById("c_"+col_+"_"+ligne_) != null) {
objDest = document.getElementById("c_"+col_+"_"+ligne_);
objDest.focus();
}
}
</script>
8 mars 2010 à 14:53
Autre modification sur laquelle je cherche une solution: éviter que le tableau ne soit édité sur la même cellule par 2 personnes à la fois (accès concurrent) l'idée est de relire le fichier juste avant la sauvegarde et d'interdire l'écrasement d'une cellule modifiée entre temps.)
5 juil. 2007 à 16:12
Quelqu'un a t'il une idée pour ça (des que on sort de la celulle onBlur() sa taille doit changer ) .
merci.
12 janv. 2007 à 21:29
Situ veux créer des fichiers excel avec ta source, ca pourrait t'intéresser :
www.phpcs.com/codes/LECTURE-FICHIER-EXCEL_41045.aspx
Cordialement,
Ben
18 déc. 2006 à 13:10
Il y a un projet dans le même style à la page suivante :
www.javascriptfr.com/codes/TABLEUR-TYPE-EXCEL_40676.aspx
C'est un tableur en ligne avec des fonctions intéresssantes comme le calcul...
Il serait peut etre intéressant que vous collaboriez.
Ben
28 nov. 2006 à 23:04
Voila, j'ai pu remarquer que quand on ouvre la page une seconde fois, les modifications apportés n'apparaisent pas en ligne (ce qui est un peu génant pour ma part).
Si vous voulez que les modifications faites auparavant apparaissent à la prochaine ouverture vous pouvez changer le fichier index.php avec cela.
------------------------------------------------
<?php
//Config du tableur par défaut
$col = 5;
$ligne = 100;
if(isset($_POST["action"]) && $_POST["action"]=="enreg" ){
// On prend la valeur 'Ligne' et la valeur 'col'
$ligne = $_POST["ligne"];
$col = $_POST["col"];
// Ensuite, on épure le tableau:
// On a plus besoin de 'col', 'ligne' ,'action', et 'doc'
// donc, on les efface.
$_GET["doc"]=$_POST["doc"];
array_splice($_POST, 0, 4);
// Ensuite, nous reste le tableau contenant les valeurs des cellules.
// On va donc charger ces données dans une variables bi-dimensionnelle
// afin de pouvoir la traiter
$tblDB = array();
$varCol = 0;
$varLigne = 1;
reset ($_POST);
while (list ($key, $val) = each ($_POST)) {
$varCol++;
$tblDB[$varLigne][$varCol]=$val;
if($varCol==$col){
$varCol=0;
$varLigne++;
}
}
// Maintenant que le tableau a été créé, il faut le traiter.
// Il se peut qu'il y ait des lignes à la fin non utilisée,
// et donc ce n'est pas la peine de les enregistrer, donc,
// il faut les supprimer.
$etiquette = "";
$num = count($tblDB); // Retourne le nombre de lignes
// Tant qu'on a pas terminé
while($etiquette<>"fin"){
$var = "";
// On met dans une variable chaque colonnes
for($a=1;$a<=count($tblDB[$num]);$a++){
$var.=$tblDB[$num][$a];
}
// Si la somme de toutes les colonnes de la ligne
// est vide, alors, on supprime cette ligne
// et on enlève '1' au compteur '$num'
// Sinon, c'est que c'est bon
if($var==""){
array_splice($tblDB, $num, 1);
$num--;
}else{
$etiquette="fin";
}
// Si il n'y a aucun enregistrement, on sort
if($num==0){
$etiquette="fin";
}
}
// Ensuite, on enregistre!
// (Même technique que l'affichage)
$texte = "";
$fp=fopen($_GET["doc"],"w");
for($a=0;$a<count($tblDB);$a++){
for($b=1;$b<=count($tblDB[$a]);$b++){
$texte.=$tblDB[$a][$b].";";
}
// Comme à la fin de chaque ligne il y a ';'
// (une cellule de trop), on la supprime
fputs($fp,substr($texte,0,-1)."\r\n");
$texte="";
}
fclose($fp);
}
// On regarde si il y a un fichier à ouvrire:
// Si oui, on charge ce fichier
// dans une variable bi-dimensionnelle.
$fp=fopen("tableau.csv","r+");
$dim1=0;
while(!feof($fp)){
$dim1++;
$tmp=fgets($fp,1000);
if($tmp!=""){
$tbl[$dim1] = explode(";",$tmp);
$col=sizeof($tbl[$dim1]);
}
}
fclose($fp);
// Dabord, on va créer la ligne du haut qui contient les lettres
// $asc=65 donne 'A', donc, à chaque fois, on incrémente de 1 pr monter dans l'alphabet
$tableur = "<tr>";
$asc=65;
$tableur.= "<td class="clsFOND"> </td>\n";
for($a=$asc;$a<($asc+$col);$a++){
$tableur.="<td class="clsFOND">".chr($a)."</td>\n";
}
$tableur.= "</tr>\n\n";
// Maintenant, on va tracer le tableau en colone
for($i=1;$i<=$ligne;$i++){
$tableur.= "<tr>";
$tableur.= "<td class="clsFOND" style="width:32px"> $i </td>";
// Puis en ligne
for($j=0;$j<$col;$j++){
$tableur.= "<td class="clsCEL"></td>\n";
}
$tableur.= "</tr>\n\n";
}
?>
<html>
<head>
<title>Tableur</title>
<style>
.clsTextBox{
border-top:0px solid black;
border-bottom:0px solid black;
border-right:0px solid black;
border-left:0px solid black;
}
.clsFOND{
border-top:0px solid black;
border-bottom:1px solid black;
border-right:1px solid black;
border-left:0px solid black;
background:url('images/fond.jpg');
font:bold;
text-align:center;
}
.clsCEL{
text-align:center;
border-bottom:1px solid black;
border-right:1px solid black;
}
.clsTABLE{
border-left:1px solid black;
border-top:1px solid black;
}
</style>
<script>
// Code JavaScript pour la navigation entre celulles.
// Quand on utilise les flèches, on change de celulle active.
// Il semblerait qu'il y ait des problèmes de compatibilités...
// Voilà donc la liste des explorateurs testés:
// Testé sous:
// - FireFox : Marche pas
// - IE : Marche très bien!
// - NetScape : Marche pas
// - Opera : Marche pas
// Ceci est sans doute dut aux deux attribus factices ('col' et 'ligne')
// L'idée n'était pas mauvaise! Mais, à creuser! Mdr!
function txtKeyDown(txt, evt) {
bouge = false;
obj = document.getElementById(txt);
nomId = obj.id;
nomId = nomId.split("_");
col_ = nomId[1];
ligne_ = nomId[2];
codeClavier = -1;
if(document.all){
codeClavier = event.keyCode;
codeClavier = event.keyCode;
}else{
codeClavier = evt.which;
codeClavier = evt.which;
}
// On presse la flèche de gauche
if (codeClavier == 37) {
col_--;
bouge = true;
}
// On presse la flèche du haut
else if(codeClavier == 38){
ligne_--;
bouge = true;
}
// On presse la flèche de droite
else if(codeClavier == 39){
col_++;
bouge = true;
}
// On presse la flèche du bas
else if(codeClavier == 40){
ligne_++;
bouge = true;
}
if (bouge && document.getElementById("c_"+col_+"_"+ligne_) != null) {
objDest = document.getElementById("c_"+col_+"_"+ligne_);
objDest.focus();
}
}
</script>
</head>
<form action="index.php" method="post" name="frmTABLEUR">
">
">
">
<?
echo $tableur;
?>
</form>
</html>
------------------------------
Cette modification n'est pas de moi, mais grâce à un ami.
Merci à lui.
Ben.
PS: merci à M rreivax car ta source est tout simplement géniale...