Anglais Francais Prosygma Italie
-
    hebergement asp
prosygma_logo

Techniques

Cette section permet de regrouper un ensemble de techniques ou de scripts qui ont l'originalité d'arriver à résoudre une difficulté avec le moindre effort ou qui sont particulièrement efficaces...

Une autre solution permettant de générer des fichiers Excel à la volée est de piloter une application Excel. Cela suppose qu'une version d'Excel est installé sur le serveur et que votre script s'exécute sur une plateforme Windows. C'est par là que cette solution est déjà à éviter. Elle pose d'ailleurs d'autres problèmes :

  1. Les applications office ont besoin d'un profil d'utilisateur pour fonctionner même lorsqu'elles sont pilotées par Automation : ainsi elles peuvent initialiser la position des barres de menus, les préférences au niveau des imprimantes, etc. Or les services IIS peuvent tourner sous des comptes qui ne sont pas celui de réels profil utilisateur ( comme SYSTEM ou bien IWAM_[nom_du_serveur] ) et le fait de lancer l'application Excel avec l'instruction createObject pourrait entraîner une erreur.
  2. Les applications Office proposent une interactivité avec le bureau qui peut porter à préjudice pour notre applicatioin Web. En effet pour certaines opérations ou même si un argument incorrect se présente avec l'utilisation de certaines fonctions de l'application, une fenêtre de dialogue modale peut apparaître et stopper ainsi toute exécution de l'application jusqu'à ce que l'on ait appuyer sur ENTER.
  3. A cause de l'utilisation des macros dans les applications Office, l'installation d'Excel reste un véritable trou dans la sécurité.
  4. Enfin il reste à trouver une solution afin de nettoyer régulièrement les fichiers produits sur le serveur.

Piloter une application excel avec PHP :
Voici comment piloter une application Excel depuis PHP en passant par l'interface COM de Microsoft.

<?php
   print "Hi";
#Instantiate the spreadsheet component.
#    $ex = new COM("Excel.sheet") or 
	Die ("Did not connect");
$exapp = new COM("Excel.application") or 
	Die ("Did not connect");

#Get the application name and version   
print "Application name:{$ex->Application->value}
" ; print "Loaded version: {$ex->Application->version}
"; $wkb=$exapp->Workbooks->add(); #$wkb = $ex->Application->ActiveWorkbook or Die ("Did not open workbook"); print "we opened workbook
"; $ex->Application->Visible = 1; #Make Excel visible. print "we made excell visible
"; $sheets = $wkb->Worksheets(1); #Select the sheet print "selected a sheet
"; $sheets->activate; #Activate it print "activated sheet
"; #This is a new sheet $sheets2 = $wkb->Worksheets->add(); #Add a sheet print "added a new sheet
"; $sheets2->activate; #Activate it print "activated sheet
"; $sheets2->name="Report Second page"; $sheets->name="Report First page"; print "We set a name to the sheet: $sheets->name
"; # fills a columns $maxi=20; for ($i=1;$i<$maxi;$i++) { $cell = $sheets->Cells($i,5) ; #Select the cell (Row Column number) $cell->activate; #Activate the cell $cell->value = $i*$i; #Change it to 15000 } $ch = $sheets->chartobjects->add(50, 40, 400, 100); # make a chartobject $chartje = $ch->chart; # place a chart in the chart object $chartje->activate; #activate chartobject $chartje->ChartType=63; $selected = $sheets->range("E1:E$maxi"); # set the data the chart uses $chartje->setsourcedata($selected); # set the data the chart uses print "set the data the chart uses
"; $file_name="D:/apache/Apache/htdocs/alm/tmp/final14.xls"; if (file_exists($file_name)) {unlink($file_name);} #$ex->Application->ActiveWorkbook->SaveAs($file_name); # saves sheet as final.xls $wkb->SaveAs($file_name); # saves sheet as final.xls print "saved
"; #$ex->Application->ActiveWorkbook->Close("False"); $exapp->Quit(); unset($exapp); ?>
Il est aussi facile de générer des fichiers Excel sur le serveur en utilisant ASP pour piloter par Automation l'application Excel :
	
<%
'Soit le fichier : EXCEL.INC
xlAutomatic = -4105

xlCenter=-4108
xlLeft = -4131
xlRight = -4152
xlBottom = -4107

xlNone = -4142

xlDiagonalDown = 5
xlDiagonalUp = 6
xlEdgeLeft = 7
xlEdgeTop = 8
xlEdgeBottom = 9
xlEdgeRight = 10
xlInsideVertical = 11
xlInsideHorizontal = 12

xlThin = 2
xlThick = 4
%>
	
	
'Et ensuite voilà comment générer un fichier excel au
'nom aléatoire et l'ouvrir pour l'utilisateur :

<!--#include file = "../Include/OpenConnection.asp"-->
<!--#include file = "../Include/EXCEL.INC"-->
<HTML>
<%
Dim rsAsp
Set rsAsp = Server.CreateObject("ADODB.Recordset")

Dim ex
Set ex=Server.CreateObject("Excel.Application")

Dim fs,f
Set fs=Server.CreateObject("Scripting.FileSystemObject")
f = fs.GetBaseName(fs.GetTempName()) & ".xls"

ex.Workbooks.Add

ex.ActiveSheet.Range("E1").Value = "Something"

ex.ActiveSheet.Range("A1:C1").Select
ex.Selection.Merge
ex.Selection.Value = "Title"
ex.Selection.Interior.ColorIndex=15
ex.Selection.Font.Bold=True
ex.Selection.Font.Size=12
ex.Selection.Font.ColorIndex=2

ex.ActiveSheet.Range("A2:C2").RowHeight = 24
ex.ActiveSheet.Range("A2:C2").HorizontalAlignment = xlCenter
ex.ActiveSheet.Range("A2:C2").VerticalAlignment = xlCenter
ex.ActiveSheet.Range("A2:C2").WrapText = True

ex.ActiveSheet.Columns("A:A").ColumnWidth = 10

rsAsp.Open "SELECT * FROM Table1", conn
Dim i
i=3

While not rsAsp.EOF
  ex.ActiveSheet.Cells(i,1).Value = rsAsp.Fields(0)
  ex.ActiveSheet.Cells(i,2).Value = rsAsp.Fields(1)
  rsAsp.MoveNext 
Wend

ex.ActiveWorkbook.SaveAs Server.MapPath(".") & "\" & f
ex.Quit

Set rsAsp = Nothing
Set ex = Nothing
Set fs = Nothing
%>
<body onload="document.location.href='<% =f %>'">
</HTML>
<!--#include file = "../include/CloseConnection.asp"-->
	

Dans la mesure où le client possèderait Excel installé sur sa machine la solution précédente de contrôle par Atomation peut éventuellement se faire directement sur le poste client. Evidemment avec les problèmes de sécurités que cela implique.

Une des méthodes les plus efficaces qu'il reste pour générer gratuitement des fichiers Excel est de passer par l'A.D.O.. Autrement dit, un fichier Excel modèle peut être créé et installer sur le serveur, ASP pourra ensuite l'interroger, le modifier comme s'il s'agissait d'une base de données via un accès ADO.
Nous pouvons trouvés plusieurs avantages à cette méthode :

  1. Les fichiers générés ne seront pas stockés sur le disque du serveur et supprimés aussitôt après utilisation.
  2. L'installation de l'application Excel n'est nullement requise sur le serveur. Il y a juste besoin de la bibliothèque ADO au moins 2.5 pour quelle permette l'utilisation d'ADODB.Stream

Dans l'exemple suivant, un fichier excel nommé mon_template.xls est créé en vue de servir de modèle. Afin de pouvoir effectuer les requêtes d'update, une zone a été définie dans le fichier Excel. Pour cela il vous suffit d'ouvrir votre fichier, de sélectionner le nombre de colonnes correspondant au nombre de champ de votre base que vous allez y inclure, et le nombre de lignes adéquats. Ensuite il faut définir la zone nommé : Menu insertion/Nom/Définir... Dans l'exemple suivant la zone a été nommée "xls_colonne".

        
<%
Response.Expires = -2000
Response.Buffer = TRUE

'--- Create temporary file
Dim path
path=Server.MapPath(".")

Dim fs, file
Set fs=Server.CreateObject("Scripting.FileSystemObject")
file = path & "\tmp\" & fs.GetTempName
fs.CopyFile path & "\templates\mon_template.xls", file

'--- Modifier le fichier excel
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=" & file & _
               ";Extended Properties=""Excel 8.0;HDR=NO;"""

Dim oProdConn, oProdRS
Set oProdConn = Server.CreateObject("ADODB.Connection")
Set oProdRS =  Server.CreateObject("ADODB.Recordset")
oProdConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;"& _
		" Data Source=" & _
                path & "\ma_base.mdb"

'Nous récupérons les données contenues dans matable   
'depuis la base Access
oProdRS.Open "SELECT * FROM matable", oProdConn
                   
Dim oRS 
Set oRS = Server.CreateObject("ADODB.Recordset")
oRS.Open "Select * from xls_colonne", oConn, 1, 3 
' Rappel : 1=adOpenKeyset, 3=adLockOptimistic
    


Do Until oProdRS.EOF
    oRS.AddNew
    For i = 0 To 2
        oRS.Fields(i).Value = oProdRS.Fields(i).Value
    Next
    oRS.Update
    oProdRS.MoveNext
Loop
    
oProdRS.Close
Set oProdRS = Nothing
oProdConn.Close
Set oProdConn = Nothing
    
oConn.Close
Set oConn = Nothing

'--- Envoyer le flux de sortie au 
'--- navigateur en définissant le type MIME
Response.ContentType = "application/vnd.ms-excel"

Dim vntStream

Set oMyObject = Server.CreateObject("ADODB.Stream")
oMyObject.Type = 1 'adTypeBinary
oMyObject.Open
oMyObject.LoadFromFile file 
vntStream = oMyObject.Read

Response.BinaryWrite(vntStream)

'--- Suppimer le fichier temporaire
'--- et les références.

oMyObject.Close
fs.DeleteFile file

Set oMyObject = Nothing
Set fs = Nothing

Response.End
%>