Fichier Excel à la volée à partir de données Notes pour une visualisation à l’aide d’un navigateur web

Marco a écrit le Jeudi 3 Octobre 2002 à 21:33:26

Il est souvent intéressant de pouvoir exporter toutes sortes de données dans un fichier Excel à partir de documents Notes. Nous allons voir comment créer un fichier Excel à la volée en fonction de la demande de l'utilisateur.

 Pour l'exemple nous allons exporter les données des documents sélectionnés dans une vue en applet java au travers d'un navigateur web.

 Il faut savoir qu'Excel est capable d'interpreter les tableaux écrits en HTML, nous allons donc en profiter pour la génération du fichier sur le serveur sans à avoir à installer Office. Ce qui permet d'avoir un serveur "propre", sous windows mais aussi sous linux.
 Donc la manipulation va consisté à écrire du HTML dans un fichier ayant une extension .xls sur le serveur. Ce fichier doit se trouver dans le repertoire "\domino\html\", qui est le seul à être accessible via un navigateur. Pour cela il ne faut pas oublier de donner le droit aux utilisateurs d'executer des agents non restrictifs (permet d'écrire sur le disque dur du serveur).
 Cet exemple a été testé sur un serveur Windows NT et un poste en XP avec IE et Mozilla.

Voici un exemple de code de base Notes commenté. La demarche générale et le code de l'agent principal sont expliqués, pour ceux qui veulent avoir plus de détail je les invite à regarder la base d'exemple.

 Les points abordés :

•Recupérer les ID des docs séléctionner dans une vue en applet java
•Créer un fichier sur le serveur
•Ecrire dans un fichier

Créer un masque $$ViewTemplateDefault avec la une vue intégrée (La vue doit être en applet java). Créer un bouton (bouton d'action par exemple) avec dans l'événement onClick :

var pathname = window.location.pathname;
 var path = pathname.substring(0,(pathname.lastIndexOf('.nsf')+5));
 window.open(path+"tmpExport?openForm");

 Ce code permet d'ouvrir un masque de traitement dans une nouvelle fenêtre

 Créer un masque tmpExport.
 Ce masque devra contenir trois champs dans une section DIV :


 Les champs
 

 Cette balise
permet de masquer les champs à l'utilisateur, mais qu'ils soient bien présents en HTML et javascript

 Les trois champs sont :

•Un champ texte modifiable "remote_user" avec comme valeur "remote_user"
•Un champ texte modifiable SaveOptions avec comme valeur "0"
•Un champ texte modifiable "docId" sans valeur

Ensuite ajouter un texte type "Merci de patienter..." au milieu de la page.
 
Dans le unload du masque tmpExport mettre :
var docs = window.opener.document.applets.view.getSelectedDocumentsEx();
 if (docs.size() == 0) return false;
 var url='&UNIDs=';
 for (var i = 0; i  id=docs.elementAt(i);
 if (id.length()==32)
 url += '%%' + id;
 }
 window.document.forms[0].docId.value=url;
 window.document.forms[0].submit();

 Ce code permet de stocker les documents sélectionnés dans le champs docsId et de faire un submit(), ce qui permettra de pouvoir accéder à ces valeur à partir du documentContext dans l'agent de traitement

 Dans le webquerysave du masque tmpExport mettre le nom de l'agent qui va créer le fichier Excel ("ExportFile" ici) :
 
Agent ExportFile :
Sub Initialize
 Dim s As New NotesSession
 Dim db As Notesdatabase
 Dim view As NotesView
 Dim dc As NotesDocumentCollection
 Dim doc As NotesDocument
 Dim fileName As String
 Dim i As Integer
 Dim j As Integer
 Dim fileNum As Integer
 Dim strUNIDS As String
 Dim strUNID As String
 Dim query_string As String
 Dim tabID() As String
 
Set db=s.Currentdatabase
 Set doc=s.DocumentContext
 
'On recupère les ID passés dans l'url
 query_string= doc.getitemvalue("docId")(0)
 'on crée le fichier excel
 Call createFile(doc, fileName , fileNum)
 
i=-1
 
If Instr(query_string, "&UNIDs=%%") Then
 'S'il y a des ID sélectionné, on les récupères dans une table tabID
 strUNIDS = Strright( query_string, "&UNIDs=%%")
 strUNID = Strleft(strUNIDS, "%%")
 While Not(strUNID = "")
 i=i+1
 Redim Preserve tabID(i)
 strUNIDS = Strright(strUNIDS, "%%")
 tabID(i)=strUNID
 strUNID = Strleft(strUNIDS, "%%")
 Wend
 i=i+1
 Redim Preserve tabID(i)
 tabID(i)=strUNIDS
 End If
 If Ubound(tabID)< Then 'si aucun docs trouvé
 Print #fileNum%, ""
 Print #fileNum%, "No Data"
 Print #fileNum%, ""
 Print "test"
 Exit Sub
 End If
 Call printHeader(fileNum) 'On écrit le début du code HTML (HEAD, BODY...)
 
For i=0 To Ubound(tabID) ' On écrit les lignes du tableau (une ligne par doc sélectionné)
 Call ExportDonnees(tabID(i), fileNum%)
 Next
 
Call printBottom(fileNum) 'On écrit la fin du code HTML
 Close fileNum%
 Print "[/" & fileName & "]" 'redirection vers le fichier XLS pour ouverture
 End Sub

 
Pour la base d'exemple :
 Copier la base sur un serveur domino (conigurer pour une accès web). Signer la base. Interdire l'accès à anonymous dans la LCA (pour connaitre le nom de l'utiliseteur lors du nommage du fichier XLS). Autoriser l'exectution d'agents restrictif pour ceux qui vont tester l'application.
 Aller dans la vue ALL et tester :-)

 Voir "presentation de la base" et "utilisation de la base" pour les conditions d'utilisation de cette exemple.


 

Commentaire(s)

Re: Fichier Excel à la volée à partir de données Notes pour une visualisation à l´aide d´un navigateur web

Marco le 11/08/2004 10:30:53

Bonjour à tous, presque deux ans après avoir écrit cet article j'ai à nouveau besoin de faire un export d'une vue en web.

Alors voici un script générique qui permet d'exporter n'importe quelle vue d'une base très facilement dans un fichier Excel à télécharger.

Ne pas oublier de mettre un alias à votre agent avec l'extension .xls, par exemple agentExport.xls

Ensuite vous n'aves plus qu'à appeller l'agent en lui passant en paramètre le nom de la vue :

http://lurldelabase/agenExport.xls?openagent&nomVueAERxporter&

Ne pas oublier le & final.

Le code :

Sub Initialize

' Agent d'export des données d'une vue

Dim session As New NotesSession

Dim db As NotesDatabase

Dim view As NotesView

Dim doc As NotesDocument

Dim allentries As NotesViewEntryCollection

Dim entry As NotesViewEntry

Dim viewName As String

Dim i As Integer

Set db = session.CurrentDatabase

Set doc = session.Documentcontext

viewName = Mid(doc.Query_String(0), Instr (doc.Query_String(0), "&view=" )+6)

viewName = Mid(viewName, 1, Instr (viewName, "&" )-1)

Set view = db.GetView( viewName )

Set allentries = view.Allentries ' on récupère toutes les lignes de la vue

' On envois l'entête pour que le fichier soit téléchergé et non ouvert dans le navigateur

Print |Content-type: application/force-download|

Print |Content-Disposition: attachment; filename="ContactUS.xls"|

' On spécifie le type d'application pour que le fichier soit ouvert sous Excel et le charset pour ne pas avoir de surprise avec les accents ou autres

Print |Content-Type: application/vnd.ms-excel; charset=iso-8859-1|

' Table principale dans laquelle sera inséré le contenu

Print |

| ' Table principale, séparation

Print |

 

|

' Titre du document

Print |

Export de la vue : | + view.Name + |

|

Print |

 | ' Table principale

' Ligne de séparation

Print | |

Print |

 | ' Table principale

' Information sur la date d'update

Print |

Date| & Format(Now(), "Medium Date") & || & allentries.count & | documents
|

Print |

  
 | ' Table principale

' Tableau de résultats avec les données

Print |

|

' Titres des colones

Print |

|

Forall column In view.Columns ' On récupère les titres pour chaque colonne, s'il ny en a pas il ne seront pas affichés

Print |

|

End Forall

Print |

|

Set entry = allentries.Getfirstentry() ' on se place sur la première ligne

i = 0

' On parcours toutes les lignes de la vue pour aller chercher les données et faire un tableau

While Not(entry Is Nothing)

i = i + 1

Print |

|

Forall valeurColumn In entry.ColumnValues ' Toutes les colones

If (valeurColumn = "") Then valeurColumn = " "

Print |

|

End Forall

Print |

|

Print |

|

Set entry = allentries.Getnextentry(entry) ' Ligne suivante

Wend

Print |

| & column.Title & |
| + valeurColumn + | | & i & |
| ' fin des données

Print |

| ' Table principale

End Sub

Voila un bel export à la volée, cette fois Gérald sera d'accord avec moi, c'est à la volée quel que soit le vocabulaire ;-)

Re: Fichier Excel à la volée à partir de données Notes pour une visualisation à l´aide d´un navigateur web

Gérald le 13/04/2004 16:10:12

Bonjour Patrick,

Quel est le message dans la log serveur ?

As-tu pensé à signer la base avec un id autorisé à tourner des agents sur le serveur ?

As tu sélectionné la case "Exécuter agent en tant qu'utilisateur Web" dans le propriétés de l'agent ?

...

Re: Fichier Excel à la volée à partir de données Notes pour une visualisation à l´aide d´un navigateur web

patrick le 06/04/2004 16:41:46

Bonjour,

Je ne comprends pas ce script fonctionne tres bien en locale par contre des que je place la base sur le serveur j'ai une page "Impossible d'afficher......"

Quelqu'un aurait il une explication

Merci

Re: Fichier Excel à la volée à partir de données Notes pour une visualisation à l´aide d´un navigateur web

Gérald le 07/03/2003 10:46:15

Excusez moi.

La ligne "i% = Cint(doc.HierarchieLevel(0))" est à supprimer et merci de lire Subtilité à la place de "sutilité".

Re: Fichier Excel à la volée à partir de données Notes pour une visualisation à l´aide d´un navigateur web

Gérald le 06/03/2003 17:48:42

C'est donc une question de vocabulaire : Pour moi, à la volée veut dire de façon impromtue donc non prévue. Ce qui implique l'absence d'un environnement pré-programmé.

Si tu dois écrire un agent essaie celui-ci qui est encore plus rapide :

Sub Initialize

Dim session As New NotesSession

Dim db As NotesDatabase

Dim view As NotesView

Dim doc As NotesDocument

Set db = session.CurrentDatabase

Set view = db.GetView( "xxxxx" )

Print {Content-Type:application/vnd.ms- excel}

Print {

}

Set doc = view.GetFirstDocument

While Not(doc Is Nothing)

ligne$ = ""

i% = Cint(doc.HierarchieLevel(0))

Forall cl In doc.ColumnValues

If Ligne$ = "" Then

Ligne$ = Ligne$ + "

"

Else

Ligne$ = Ligne$ + "

"

End If

End Forall

Print |

| + Ligne$ + ||

Set doc = view.GetNextDocument(doc)

Wend

Print {

"+ cl + " " + cl + "
}

End Sub

Il n'y a que le nom de la vue à mettre à jour et sutilité appeler ton agent quelquechose.xls

En suite, il faut l'activer à travers un browser via le lien url qui sera alors

http://monserveur/mabase.nsf/monagent.xls?OpenAgent

Tu peux encore améliorer l'agent en passant le nom de la vue en paramètres, ou en rajoutant judicieusement des tag font, color, b, i, u, etc qu'Excel sait interpréter...

Bon courage.

Je n´ai pas très bien compris

Marco le 21/02/2003 13:12:00

Mais je ne vois pas en quoi le fait d'ouvrir un fichier par un menu (ton exemple) plutôt qu'en un clic sur un lien (mon exemple) influ sur le fait que le fichier soit créé "à la volée".

Ce que j'ai voulu dire par ce terme, c'est que au moment ou tu clic le fichier n'existe pas et 1 seconde plus tard tu l'as sur ton poste avec les informations calculées en temps réel.

Re: Fichier Excel à la volée à partir de données Notes pour une visualisation à l´aide d´un navigateur web

Gérald le 21/02/2003 11:59:34

Ce n'est pas franchement ce que j'appelle "à la volée"...:?

Pour moi la création d'un fichier Excel à la volée consiste à ouvrir Excel, puis Fichier --> Ouvrir et là, en guise de "nom de fichier" l'URL de ma vue. Par "mauvais" exemple : http://www.dominux.net/

Je dis "mauvais" car dans ce cas, même si ça marche, ce n'est guère exploitable. Mais c'est à la volée:D

Ajouter un commentaire





Se souvenir de mes informations?



Les balises HTML ne sont pas permises dans les commentaires. Pour faire un lien, il suffit de donner l'URL, préfixée par http://.