Automation excel par javascript

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 369 fois - Téléchargée 17 fois

Contenu du snippet

Quelques lignes de codes javascript pour utiliser l'activex EXCEL.
J'ai utilisé ça pour obtenir la fonctionnalité excel qui permet, lors d'une impression, d'adapter l'état sur une page en hauteur et en largeur.
Ainsi le tableau encours est imprimé sur une page quelque soit sa taille (dans les limites acceptées par excel).
Je suis parti d'une source trouvée sur le net en y ajoutant les diverses fonctionnalités que je recherchais.(par ex : http://www.yaduk.co.uk/2009/07/22/javascript-export-html-table-excel-jscript/)
L'intérêt de ce source réside dans les instructions (certaines ne sont pas tés faciles à trouver sur le net) qu'il contient. Son fonctionnement est spécifique à l'application dans lequel est utilisée la fonction.
Dernière chose : ca ne fonctionne qu'AVEC IE !!! (Activex oblige !)

Source / Exemple :


<html>
<head>
<script type="text/javascript">
function Print_xl() {
			// déclaration de l'objet activeX
			var xlApp = new ActiveXObject("Excel.Application");
			// Silent-mode:
			//xlApp.Visible = true;
			xlApp.DisplayAlerts = false;
			var xlBook = xlApp.Workbooks.Add(); // déclaration du classeur
			xlBook.worksheets("feuil1").activate;
			var xlSheet = xlBook.activeSheet;// déclaration de la feuille
			xlSheet.Name="JavaScript Export to Excel";//on peu nommer le feuille
			//Declarations des constantes utilisées dans l'activex
// les alignements dans les cellules
			var xlVAlignBottom = -4107;
      var xlVAlignTop = -4160;
      var xlVAlignCenter = -4108;
      var xlVAlignDistributed = -4117;
      var xlVAlignJustify = -4130;
      
      var xlHAlignCenter = -4108;
      var xlHAlignCenterAcrossSelection = 7;
      var xlHAlignDistributed = -4117;
      var xlHAlignFill = 5;
      var xlHAlignGeneral = 1;
      var xlHAlignJustify = -4130;
      var xlHAlignLeft = -4131;
      var xlHAlignRight = -4152;
      
      // les bordures des cellules
      var xlSolid=1;
      
     	var xlContinuous = 1;
	var xlThin = 2;
	// les cotés des cellules		
	var xlBottom = -4107;
	var xlLeft = -4131;
	var xlTop = -4160;
	var xlRight =-4152;
	// orientation de la page		
	var xlPortrait=1;
			
	// on stock les lignes du tableau html dans un tableau de données. on aura ainsi le nombre de lignes
	var rows = tableau.getElementsByTagName("tr");
	var columns = 4;// parce que mon tableau a 4 colonnes
	var data = tableau.getElementsByTagName("td"); // les données du tableau html sont stockées dans data

	//Mise en forme de l'entete
    //ligne 1 et 2 hautes de 20 px
    xlSheet.Rows(1).RowHeight = 20;
    xlSheet.Rows(2).RowHeight = 20;
    //Fusion des cellules A1 et A2
    xlSheet.Range(xlSheet.Cells(2, 1),xlSheet.Cells(1,1)).mergecells=true;
    //xlSheet.Range("A1:A2").Select;
    // Insertion d'un  logo  en haut et a gauche de la feuille 
    // ce logo est dans le meme dossier que la page courante
    var chemin=document.referrer;// on récupère le chemin d'accés au la page courante et son nom
    chemin=chemin.substring(0,chemin.lastIndexOf("/")+1); // on ne garde que le chemin 
    xlSheet.Pictures.Insert (chemin +"votrelogo.jpg");
    // on modifie la taille du logo
    xlSheet.Pictures.ShapeRange.LockAspectRatio = true;
    xlSheet.Pictures.ShapeRange.Height = 27.75;
    xlSheet.Pictures.ShapeRange.Width = 110.25;
    xlSheet.Pictures.ShapeRange.Rotation = "0";
    // on le place précisement à 9 points du haut gauche
    xlSheet.Pictures.ShapeRange.Top=xlSheet.Pictures.ShapeRange.Top+9;
   // et 39 du coté gauche    xlSheet.Pictures.ShapeRange.Left=xlSheet.Pictures.ShapeRange.Left+39;  
    
    // Recup des textes d'entete du tableau HTML pour les mettres dans les cellules
    xlSheet.Cells(1, 4).Value = data[1].innerText;;
    xlSheet.Cells(1, 4).VerticalAlignment = xlVAlignCenter;// alignement centrer vertical dans la cellule
    xlSheet.Cells(1, 4).HorizontalAlignment = xlHAlignRight; // et centrer horizontal
    xlSheet.Cells(1, 4).Font.Size = 9; // taille de police 9
    xlSheet.Cells(1, 4).Font.Bold = "False" ;// pas de mise en gras
      
    xlSheet.Cells(2, 4).Value = data[3].innerText;
    xlSheet.Cells(2, 4).VerticalAlignment = xlVAlignCenter;
    xlSheet.Cells(2, 4).HorizontalAlignment = xlHAlignCenter;
    xlSheet.Cells(2, 4).Interior.ColorIndex = 5;
    xlSheet.Cells(2, 4).Interior.Pattern = xlSolid ;
    xlSheet.Cells(2, 4).Font.ColorIndex = 2;
    xlSheet.Cells(2, 4).Font.Size = 12;
    xlSheet.Cells(2, 4).Font.Bold = "True";
        
        
    xlSheet.Range("B1:D1").Mergecells=true;
    xlSheet.Range("B2:C2").Mergecells=true;
    xlSheet.Cells(3, 1).Value = data[4].innerText;
    xlSheet.Cells(3, 1).Font.Bold = "True";
     
    xlSheet.Cells(3, 2).Value = data[5].innerText;
    xlSheet.Cells(3, 2).Font.Bold = "True" ;
    xlSheet.Cells(3, 2).Interior.ColorIndex = 6;
    xlSheet.Cells(3, 2).Interior.Pattern = xlSolid ;
      
        
    
    xlSheet.Columns("B").WrapText = "True";
    xlSheet.Columns("B").VerticalAlignment = xlVAlignCenter;
       
        
    xlSheet.Cells(3, 3).Value = data[6].innerText;;
    xlSheet.Cells(3, 3).Font.Bold = "True";
    xlSheet.Cells(3, 3).Interior.ColorIndex = 6 ;
    xlSheet.Cells(3, 3).Interior.Pattern = xlSolid ;
        
        
    xlSheet.Cells(2, 2).Value = data[2].innerText;;
    xlSheet.Cells(2, 2).VerticalAlignment = xlVAlignCenter;
    xlSheet.Cells(2, 2).Font.Bold = "False";
     
        
    xlSheet.Columns("A").ColumnWidth = 50;
    xlSheet.Columns("A").VerticalAlignment = xlVAlignCenter;
      
        
    xlSheet.Columns("B").ColumnWidth = 15;
    xlSheet.Columns("B").VerticalAlignment = xlVAlignCenter;
    xlSheet.Columns("B").HorizontalAlignment = xlHAlignCenter;
        
    xlSheet.Columns("C").ColumnWidth = 15 ;
    xlSheet.Columns("C").VerticalAlignment = xlVAlignCenter;
    xlSheet.Columns("C").HorizontalAlignment = xlHAlignCenter;
    xlSheet.Columns("C").WrapText = "True";
        
            
       
    xlSheet.Columns("D").VerticalAlignment = xlVAlignTop;
    xlSheet.Columns("D").ColumnWidth = 50 ;
    xlSheet.Columns("D").WrapText = "True";
    
        
    xlSheet.Cells(3, 4).Value = data[7].innerText;
    xlSheet.Cells(3, 4).Font.Bold = "True" ;
    xlSheet.Cells(3, 4).VerticalAlignment = xlVAlignCenter;
    xlSheet.Cells(3, 4).HorizontalAlignment = xlHAlignCenter;
    xlSheet.Cells(3, 4).Interior.ColorIndex = 6;
    xlSheet.Cells(3, 4).Interior.Pattern = xlSolid;
      
  			
			//Parcourt du tableau pour compléter les cellules
			var d = 8;
			for (r=3;r<rows.length;r++) { // début en ligne 3 - a cause de l'entete du tableau    
				for (c=1;c<=4;c++) { // parcours des colonnes
                                  var Maligne= rows[r].className;
				  var Num_ligne=r+1;
                                  // mise en forme de la ligne en fonction de la classe de la ligne
				  if ((Maligne=="ligne_ge") || (Maligne=="ligne_obs") || (Maligne=="ligne_obs_droite") ) {
				         xlSheet.Range("a" + Num_ligne + ":" + "d" + Num_ligne).Mergecells=true;
                 xlSheet.Cells(Num_ligne, 1).value = data[d].innerText;
                 xlSheet.Cells(Num_ligne, 1).HorizontalAlignment = xlHAlignRight;
                  if (Maligne=="ligne_ge") {
                      xlSheet.Cells(Num_ligne, 1).HorizontalAlignment = xlHAlignLeft;
                      xlSheet.Cells(Num_ligne, 1).Font.ColorIndex = 2;
                      xlSheet.Cells(Num_ligne, 1).Font.Size = 12;
                      xlSheet.Cells(Num_ligne, 1).Font.Bold = "False";
                      xlSheet.Range("a" + Num_ligne + ":" + "d" + Num_ligne).Interior.ColorIndex = 3;
                      xlSheet.Range("a" + Num_ligne + ":" + "d" + Num_ligne).Interior.Pattern = xlSolid;
                  } 
                  if (Maligne=="ligne_obs") {
                      xlSheet.Cells(Num_ligne, 1).VerticalAlignment = xlVAlignTop;
                      xlSheet.Cells(Num_ligne, 1).HorizontalAlignment = xlHAlignLeft;
                      xlSheet.Cells(Num_ligne, 1).WrapText = "True";
                      xlSheet.Cells(Num_ligne, 1).RowHeight = 90;
                      xlSheet.Cells(Num_ligne, 1).Font.Name = "Arial";
                      xlSheet.Cells(Num_ligne, 1).Font.Size = 8;
                      xlSheet.Cells(Num_ligne, 1).Font.Italic = "True";               
                  }
                  if (Maligne=="ligne_obs_droite") {
                    xlSheet.Cells(Num_ligne, 1).HorizontalAlignment = xlHAlignRight;
                    xlSheet.Cells(Num_ligne, 1).Font.Name = "Arial";
                    xlSheet.Cells(Num_ligne, 1).Font.Size = 8;
                    xlSheet.Cells(Num_ligne, 1).Font.Italic = "True";
                  }
                  d=d+1;
                 break;
          } else {
					       xlSheet.cells(Num_ligne,c).value = data[d].innerText;
					}
					d = d + 1;
				}
			}
			// Encadrement du tableau
		  xlSheet.Range("a1:d" + Num_ligne).Borders(xlTop).LineStyle = xlContinuous;
      xlSheet.Range("a1:d" + Num_ligne).Borders(xlTop).Weight = xlThin;
      xlSheet.Range("a1:d" + Num_ligne).Borders(xlBottom).LineStyle = xlContinuous;
      xlSheet.Range("a1:d" + Num_ligne).Borders(xlBottom).Weight = xlThin;
      xlSheet.Range("a1:d" + Num_ligne).Borders(xlLeft).LineStyle = xlContinuous;
      xlSheet.Range("a1:d" + Num_ligne).Borders(xlLeft).Weight = xlThin;
      xlSheet.Range("a1:d" + Num_ligne).Borders(xlRight).LineStyle = xlContinuous;
      xlSheet.Range("a1:d" + Num_ligne).Borders(xlRight).Weight = xlThin; 
        
        // parametrage de la mise en page
        xlSheet.PageSetup.PrintTitleRows = "";
        xlSheet.PageSetup.PrintTitleColumns = "";
        xlSheet.PageSetup.CenterHorizontally = 1;
        xlSheet.PageSetup.CenterVertically = 1;
        xlSheet.PageSetup.Orientation = xlPortrait;
         xlSheet.PageSetup.CenterHeader = "";
        xlSheet.PageSetup.CenterFooter = "";
        xlSheet.PageSetup.RightFooter = "";
        xlSheet.PageSetup.LeftMargin = xlApp.InchesToPoints(0);
        xlSheet.PageSetup.RightMargin = xlApp.InchesToPoints(0);
        xlSheet.PageSetup.TopMargin = xlApp.InchesToPoints(0.5);
        xlSheet.PageSetup.BottomMargin = xlApp.InchesToPoints(0.5);
        xlSheet.PageSetup.HeaderMargin = xlApp.InchesToPoints(0.25);
        xlSheet.PageSetup.FooterMargin = xlApp.InchesToPoints(0.25);
        xlSheet.PageSetup.PrintArea = "A1:D" + Num_ligne;
        // pour ajuster sur une seule page en hauteur et en largeur
        xlSheet.PageSetup.Zoom = false;
        xlSheet.PageSetup.FitToPagesWide = 1;
        xlSheet.PageSetup.FitToPagesTall = 1;
         //Impression sur l'imprimante par défaut
        xlSheet.PrintOut ;
        // On fait croire que l'on a sauvegardé le tableau
        // et éviter le message de demande de sauvegarde
        xlBook.Saved=true;
						
	// Nettoyage des variable
	CollectGarbage();
	//Sortie de Excel
	xlApp.Quit();
		
}
</script>
</head>
<body>
<button  onclick='Print_xl();'>Impression</button>&nbsp;<br /><br /><Table id='tableau' border='1px'>
<Tr>
<Td  rowspan='2'><img  border='0' width='220' height='55' src='logo.jpg'><Td colspan='3' align=Right><Font size='1'>du texte</font></Td></TR>
<TR  class='ligne_titre1'><Td colspan='2' align=center>Titre</Td><Td  bgcolor='#0000FF'><B><Center><font color='#FFFFFF'><font size='4'>Titre</font></Center></B></Td></Tr>
<TR class='ligne_titre2' align=center>
<TD> Titre </TD>
<TD bgcolor='yellow'> Titre</TD>
<TD bgcolor='yellow'> Titre </TD>
<TD bgcolor='yellow'> Titre </TD>
</TR>
<TR class='ligne_ge'><TD colspan='4' bgcolor='red'><font color='#FFFFFF'><Font face='Arial'>Regroupement 1</font></TD></TR>
<TR class='ligne_acte'><TD>
Ligne 1</td><TD align=center >yzeuia &nbsp;</td>
<TD align=center >kdflmk &nbsp;</td>
<TD align=Left > &nbsp;</td>
</TR>
<TR class='ligne_acte'><TD>Ligne2</td><TD align=center >kmdfksm &nbsp;</td>
<TD align=center >dkfjsl&nbsp;</td>
<TD align=Left > &nbsp;</td>
</TR>
<TR class='ligne_acte'><TD>Ligne3/td><TD align=center >dlmskflm &nbsp;</td>
<TD align=center >dslmfksdml&nbsp;</td>
<TD align=Left > &nbsp;</td>
</TR>
<TR class='ligne_acte'><TD>ligne4</td><TD align=center > &nbsp;</td>
<TD align=center >jdlk &nbsp;</td>
<TD align=Left >kmlgkmfdkgmdfkgmkgmkd  kgdfmlkg mlkkg mk mk dmlkd gkmdflkgm k &nbsp;</td>
</TR>
<TR class='ligne_ge'><TD colspan='4' bgcolor='red'><font color='#FFFFFF'><Font face='Arial'>Autre regrgoupement</font></TD></TR>
<TR class='ligne_acte'><TD>
Ligne 1</td><TD align=center >70% &nbsp;</td>
<TD align=center >kmdflkml &nbsp;</td>
<TD align=Left > &nbsp;</td>
</TR>
<TR class='ligne_acte'><TD>Ligne 2</td><TD align=center >mdslfkmsdl&nbsp;</td>
<TD align=center >flmsdkmlkf&nbsp;</td>
<TD align=Left > &nbsp;</td>
</TR>
<TR class='ligne_acte'><TD>Ligne 3</td><TD align=center >mdlskfml &nbsp;</td>
<TD align=center >dlkjslkd &nbsp;</td>
<TD align=Left > &nbsp;</td>
</TR>
<TR class='ligne_acte'><TD>Ligne4</td><TD align=center >kdfmsl &nbsp;</td>
<TD align=center >sdfdf &nbsp;</td>
<TD align=Left > &nbsp;</td>
</TR>
<Tr class='ligne_obs_droite'><Td colspan='4' align='right'><p style='margin-top: 0; margin-bottom: 0'>du texte encore0</td></Tr>
<Tr class='ligne_obs'><Td colspan='4'><p style='margin-top: 0; margin-bottom: 0'>et enfin du texte <B></p></td></Tr>
</TABLE><BR>

</body>

</html>

Conclusion :


Voilà amusez vous bien avec EXCEL et JAVA.

A voir également

Ajouter un commentaire

Commentaires

cs_bpawaa
Messages postés
6
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
20 juillet 2010
-
Nickel. Je te conseille même de rajouter le lien de la msdn en commentaire dans la source ;o)

Je t'avoue ne pas avoir testé ta source, j'utilise déjà un script que j'apprécie, mais effectivement ce qui est vraiment intéressant dans la tienne c'est l'utilisation de ces variables. C'est ce qui manquais au script que j'utilise :o)
Penses à expliquer plus ce que tu fais, et surtout le "pourquoi" d'une variable ou d'une fonction, qui est quand même super important. ça permet à tout à chacun de s'approprier les sources que tu postes et donner de la puissance à celles-ci.

en tout cas tu es participatif, c'est cool ça :o)
bonne continuation!
Cpustack
Messages postés
27
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
23 avril 2012
-
@BPAWAA :
Re

Initialement, j'ai codé cette automation pour access et en jouant avec le debugger et l'enregistreur de macro d'excel, j'ai réussi a obtenir les quelques constantes qui m'intéressaient.
Avec les liens ci-dessous c'est nettement plus complet ;-)
Voilà ce que j'ai trouvé sur le net.
http://forum.hardware.fr/hfr/Programmation/API-Win32/automation-acceder-constantes-sujet_123323_1.htm
et
http://msdn.microsoft.com/en-us/library/aa221100.aspx
@+
cs_bpawaa
Messages postés
6
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
20 juillet 2010
-
@CPUSTACK :
ok. En fait ma question était plutôt pourquoi -4160. Que ce passe-t-il si l'on met -2000 ou 4000. Comment savoir le rendu sans faire 15000 tests en fait? Comment as-tu trouvé ces valeurs?
c'est pas pour être prise de tête, mais ça permet, si on sait comment manipuler ces valeurs, de personnaliser la fonction selon les modules ou applis dans lesquels on l'intègre.
Merci.
Cpustack
Messages postés
27
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
23 avril 2012
-
CHLADAVA : Bonjour,
Simplement un problème de sécurité au niveau d'IE. Il faut aller dans
outils>options internet>Onglet Avancé
il faut cocher les cases en rapport avec l'autorisation d'exécution des activex non signés( libellés variables en fonction de la version d'IE)

BPAWAA : Bonjour,
Ce sont des constantes qu'utilise excel. xlVAlignTop alignement dans le haut de la cellule.

@+
chladava
Messages postés
1
Date d'inscription
mercredi 23 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2010
-
j'ai copier la fonction Print_xl() pour la tester,mais lorsque je tente de l'exécuter il me renvoie le message suivant :"Un composant ActiveX ne peut pas créer un objet" comment résoudre ce pb?

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.