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 :
Cette balise
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 |
| |
' 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 |
Print | | ||||
| | ' Table principale
' Tableau de résultats avec les données Print |
Print | |
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 {
| "+ 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






