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
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.