Exporter un tableau sous excel (bis)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 478 fois - Téléchargée 29 fois

Contenu du snippet

Je voulais faire un commentaire à la contribution 16372 d'@lphonse
mais mon texte est sans doûte trop long.
Ma contribution n'est qu'une adaptation de cette superbe contribution.

J'ai travaillé sur les couleurs en reprenant toDecimal cité dans un commentaire
Voici mes modestes adaptations :
attention j'ai squizzé la gestion des styles d'@lphonse (par flemme).
Bravo @alphonse et shubacca c'est génial !!!!!!!!!!!

la function todecimal trouvée sur ce site (localstone id 16365) est intacte
par contre j'ai simplifié HTMLtoRGB

j'ai mis en dur une couleur de fond de la table
car je n'ai pas réussi à la récupérer dans le html
vcolorTABLE=HTMLtoRGB("#FFFFE0");

La partie intéressante :

if (eSrc.cells(i).bgColor != "") {
vcouleurHEXA=eSrc.cells(i).bgColor;
vcolor=HTMLtoRGB(vcouleurHEXA);

for (var j = 0; j < eSrc.cells(i).colSpan; j ++)
oExcel.ActiveSheet.Cells(r,c+j).Interior.Color = vcolor ;
}
else
{
for (var j = 0; j < eSrc.cells(i).colSpan; j ++)
oExcel.ActiveSheet.Cells(r,c+j).Interior.Color = vcolorTABLE ;
}

Source / Exemple :


// javascript entier : (sans les styles)

<script LANGUAGE=javascript>
<!--
			function toDecimal(toDecimal_number) {
				var toDecimal_sum = 0;
				for (i = 0 ; i < toDecimal_number.length ; i++) {
					var toDecimal_string = toDecimal_number.substr(i, 1);
					var toDecimal_power = toDecimal_number.length - 1 - i;
					switch (toDecimal_string) {
						case 'a' : case 'A' : toDecimal_string = 10; break;
						case 'b' : case 'B' : toDecimal_string = 11; break;
						case 'c' : case 'C' : toDecimal_string = 12; break;
						case 'd' : case 'D' : toDecimal_string = 13; break;
						case 'e' : case 'E' : toDecimal_string = 14; break;
						case 'f' : case 'F' : toDecimal_string = 15; break;
					}
					toDecimal_sum += toDecimal_string * (Math.pow(16, toDecimal_power));
				}
				return (toDecimal_sum);
			} 
			
			function HTMLtoRGB(str) {
	R=str.substr(1,2);
	V=str.substr(3,2);
	B=str.substr(5,2);
	return (toDecimal(R)+ (toDecimal(V)*256) + (toDecimal(B)*256*256));
			}
		
/*---------------------------------------------------------
  Nom de la fonction : exportToXL
  Description : Rempli une feuille Excel avec le contenu 
    d'un tableau
  Entrées :
    id -> id du tableau à exporter
  Sorties :
    En cas d'erreur renvoie false
---------------------------------------------------------*/
function exportToXL(id) {
eSrc=document.all(id) // recherche le composant ayant cet id
var oExcel;    // Application Excel
var oExcelSheet;  // Feuille de calcul
var oWkBooks;
var cols;    // Nombre de colonnes du tableau

oExcel = new ActiveXObject('Excel.Application');
oWkBooks = oExcel.Workbooks.Add;
oExcelSheet = oWkBooks.Worksheets(1);

oExcelSheet.Activate();
    
if (eSrc.tagName != 'TABLE') {
  alert('L\'export vers Excel ne fonctionne qu\'avec un tableau.');
  return false;
}
vcolorTABLE=HTMLtoRGB("#FFFFE0");

// on calcule ici le nombre de cellule du tableau.
	nb_cellule=eSrc.cells.length
	for (var i = 0; i < eSrc.cells.length; i ++)
	{
		nb_cellule=nb_cellule+eSrc.cells(i).colSpan-1	
	}

// on en deduit le nombre de colonne de notre fichier excel
	cols = Math.ceil(nb_cellule / eSrc.rows.length);

// nombre de cellule qu'il faut "passer " a cause du colspan
nb_colspan=0 
// on initialise les valeures des cellules des tableau excel   
	for (var i = 0; i < eSrc.cells.length; i ++)
	{
	  var c, r;
	  r = Math.ceil((i+nb_colspan+1) / cols);  //lignes excel  en cours
	  c = (i+nb_colspan+1)-((r-1)*cols)    //colonnes  excel en cours
	  nb_colspan = nb_colspan+eSrc.cells(i).colSpan-1; // mise a jour de nb_colspan
// gestion du colspan, on effectue un centrage sur plusieurs cellules ...
	   if (eSrc.cells(i).colSpan > 1 ) 
	   	for (var j = 0; j < eSrc.cells(i).colSpan; j ++){		
	   		oExcel.ActiveSheet.Cells(r,c+j).HorizontalAlignment = 7 ;
	   		 //  xlCenterAcrossSelection = 7 dans VBA 
	   	}	
	   	
// pour le codage des couleurs 

if (eSrc.cells(i).bgColor != "") {
vcouleurHEXA=eSrc.cells(i).bgColor;

if (vcouleurHEXA=="lightyellow")
vcouleurHEXA="#FFFFE0";

if (vcouleurHEXA=="lightgreen")
vcouleurHEXA="#90EE90";

if (vcouleurHEXA=="lightblue")
vcouleurHEXA="#ADD8E6";

vcolor=HTMLtoRGB(vcouleurHEXA);

	   	for (var j = 0; j < eSrc.cells(i).colSpan; j ++)
	   	oExcel.ActiveSheet.Cells(r,c+j).Interior.Color = vcolor ;	
}
else
{
	   	for (var j = 0; j < eSrc.cells(i).colSpan; j ++)
	   	oExcel.ActiveSheet.Cells(r,c+j).Interior.Color = vcolorTABLE ;
}

	        
//En tête de colonnes
	  if (eSrc.cells(i).tagName == 'TH') {  
	    oExcel.ActiveSheet.Cells(r,c).Font.Bold = true;
	    }
	  
	      
// Texte en gras
	  if (eSrc.cells(i).childNodes.length > 0 && eSrc.cells(i).childNodes(0).tagName == "B"){ 
	    oExcel.ActiveSheet.Cells(r,c).Font.Bold = true;
	    }  
	    
	  // Rempli le contenu 
	  oExcel.ActiveSheet.Cells(r,c).Value = eSrc.cells(i).innerText;
	}
oExcel.ActiveSheet.Cells.EntireColumn.AutoFit; // ajuster la largeur des colonnes sous excel.

oExcelSheet.Application.Visible = true;

}
//-->
</script>

Conclusion :


Merci à @lphone et shubacca
j'espère qu'on va arriver à faire évoluer tout ça ensemble

(couleur des caractères, bgcolor de la table, encadrement, gestion des css, lecture du caption etc...)

Attention :
Le contrôle activex ne fonctionne que si on a autorisé les activex dans les options du navigateur
(activex non signés)

A+

phm

A voir également

Ajouter un commentaire

Commentaires

Messages postés
21
Date d'inscription
mardi 25 mars 2008
Statut
Membre
Dernière intervention
6 juin 2010

Ok Merci ça marche bien avec un tableau statique, mais le probléme c'est que j'ai un tableau dynamique qui est rempli avec les données de la BD, et dans ce cas ci ça ne marche plus. comment faire alors? Merci d'avance!
Messages postés
49
Date d'inscription
jeudi 17 janvier 2002
Statut
Membre
Dernière intervention
23 avril 2009

C'est
qui ne va pas.
ça fait doublon avec <table width="200" border="1" id="tableau">

il faut renommer le div
Messages postés
21
Date d'inscription
mardi 25 mars 2008
Statut
Membre
Dernière intervention
6 juin 2010

Merci pour le code mais la fonction ne s'execute pas chez moi. Qu'est qu'il faut faire? y'a t'il quelque chose à faire sur le tableau. SVP j'attend votre reponse
voici mon code.

<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Export</title>
<style type="text/css">
<!--
.InEo {visibility:hidden; font-size: 9px; }
.InEo {visibility:visible; font-size: 9px }
-->
</style>
<SCRIPT type="text/javascript">
function exportToExcel(tableau) {
oExcel = new ActiveXObject('Excel.Application');
oWkBooks = oExcel.Workbooks.Add;
oExcelSheet = oWkBooks.Worksheets(1);
oExcelSheet.Activate();
nbrCellules = tableau.cells.length;
for (i = 0; i < tableau.cells.length; i++) {
nbrCellules = nbrCellules + (tableau.cells(i).colSpan * tableau.cells(i).rowSpan) - 1;
}
nbrColonnes = Math.ceil(nbrCellules / tableau.rows.length);
tab = new Array();
for (j = 0; j < nbrCellules; j++) {
tab.push('*');
}
decal = 0;
for (k = 0; k < tableau.cells.length; k++) {
if ((tableau.cells(k).colSpan 1) && (tableau.cells(k).rowSpan 1)) {
if (k != (tableau.cells.length - 1)) {
while (tab.slice((k + decal), (k + decal + 1)) == '') {
decal = decal + 1;
}
}
tab.splice((k + decal),1,tableau.cells(k).innerText);
} else if ((tableau.cells(k).colSpan > 1) && (tableau.cells(k).rowSpan == 1)) {
tab.splice((k + decal),1,tableau.cells(k).innerText);
for (l = 0; l < (tableau.cells(k).colSpan - 1); l++) {
tab.splice((k + decal + l + 1),1,'');
}
decal = decal + tableau.cells(k).colSpan - 1;
} else if ((tableau.cells(k).colSpan == 1) && (tableau.cells(k).rowSpan > 1)) {
tab.splice((k + decal),1,tableau.cells(k).innerText);
for (m = 0; m < (tableau.cells(k).rowSpan - 1); m++) {
tab.splice((k + decal + ((m + 1) * nbrColonnes)),1,'');
}
} else if ((tableau.cells(k).colSpan > 1) && (tableau.cells(k).rowSpan > 1)) {
tab.splice((k + decal),1,tableau.cells(k).innerText);
for (n = 0; n < tableau.cells(k).rowSpan ; n++) {
for (o = 0; o < tableau.cells(k).colSpan ; o++) {
if ((n == 0) && (o != 0)) {
tab.splice((k + decal + n + 1),1,'');
decal = decal + 1;
} else if (n != 0) {
tab.splice(k + decal + (nbrColonnes - tableau.cells(k).colSpan) + o + 1 + ((n - 1) * nbrColonnes),1,'');
}
}
}
}
}
for (m = 0; m < tab.length; m++) {
r = Math.ceil((m + 1) / nbrColonnes);
c = (m + 1) - ((r - 1) * nbrColonnes);
oExcel.ActiveSheet.Cells(r,c).Value = tab.slice(m,(m + 1));
}
oExcelSheet.Application.Visible = true;
}
</SCRIPT>

</head>




















</html>
Messages postés
2
Date d'inscription
mercredi 22 août 2007
Statut
Membre
Dernière intervention
22 août 2007

J'ai des problèmes avec les <html:select>. En exportant vers excel ca me montre tous les options et non pas l'option selecte
Messages postés
3
Date d'inscription
mardi 7 août 2007
Statut
Membre
Dernière intervention
8 août 2007

Code finalisé pour gestion des rowspan:
http://www.javascriptfr.com/code.aspx?ID=43694
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.