Exporter un tableau sous excel (bis)

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

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.