Export Excel directement dans le navigateur avec une xPage

Toutes les astuces concernant les XPages

Export Excel directement dans le navigateur avec une xPage

Messagepar mike76 » 10 Août 2010 à 16:53

Créez un bouton dans une xPage.
Ce bouton doit ouvrir une autre xPage "export_excel.xsp".
Dans cette dernière dans l'événement "afterRenderResponse" collez ce code :
Code : Tout sélectionner
var exCon = facesContext.getExternalContext();
var writer = facesContext.getResponseWriter();
var response = exCon.getResponse();
var viewNav:NotesViewNavigator = database.getView('AllContacts').createViewNav();   // dans mon cas AllContacts est la vue que je veux exporter
var viewEnt:NotesViewEntry = viewNav.getFirst();
var output:string = "";

// boucle permettant de récupérer toutes les valeurs des colonnes
// en les formattant en HTML
while (viewEnt != null) {
   output += "<tr>";
   
   for (var x in viewEnt.getColumnValues()) {
      output += "<td>" + x + "</td>";
   }
   
   output += "</tr>";
   
    viewEnt = viewNav.getNext(viewEnt);
}
     
response.setHeader("Content-Type","application/vnd.ms-excel");     
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Disposition", "attachment; filename=contacts.xls");

writer.write("<meta charset=UTF-8>");
writer.write("<table>");
writer.write("<thead><tr>");
writer.write("<td><b>Country</b></td>");
writer.write("<td><b>Group Name</b></td>");
writer.write("</tr></thead>");
writer.write(output);
writer.write("</table>");
writer.endDocument();
mike76
V.I.P.
V.I.P.
 
Message(s) : 2122
Inscrit(e) le : 12 Oct 2006 à 13:14
Localisation : ROUEN

Messagepar lcheret » 10 Nov 2010 à 10:00

Salut,

Je dois exporter une bonne dizaine de colonnes. J'ai créé ma Xpage (form + view) qui reprend exactement le même nom des colonnes du fichier excel.

Comment je dois modifier ton script pour pouvoir l'utiliser?

Sais-tu comment faire pour faire une incrémentation auto, dans une des colonnes? En fait j'ai créé un bouton Add, et lorsque je clique dessus il m'ouvre une autre Xpage formatée de façon à entrer les données avec un dessus un bouton save. Ce que je voudrais c'est que la première colonne soit automatique incrémentée +1 à chaque nouvelle entrée.
Idem si je dois dire : Tu ne peux pas sauvegarder si tu n'as pas rempli ce champs là (tous les champs sont obligatoires, mais je ne sais psa comment faire le script pour me mettre c emeessag et me refuser la sauvegarde).

Merci de ton aide
lcheret
Premier posts
Premier posts
 
Message(s) : 13
Inscrit(e) le : 10 Nov 2010 à 09:54

Messagepar Arthur Filliot » 20 Juil 2011 à 13:40

Les exports sont plus efficaces au format CSV.
Attention également au format d'encodage du fichier (ISO-8859-1 s'il y a des accents), pour modifier l'encodage, il faut utiliser un streamWriter plutot qu'un responseWriter :

Code : Tout sélectionner
var exCon = facesContext.getExternalContext();
var response = exCon.getResponse();
var stream = response.getOutputStream();
var output = "some lines";
...
response.setContentType("application/csv-tab-delimited-table;charset=ISO-8859-1");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Disposition",'attachment; filename="export.csv"');                  stream.write(output.getBytes(java.nio.charset.Charset.forName("ISO-8859-1")));


La XPages en elle-même peut rester au format UTF-8 sans problème.
Par contre, ne pas oublier ensuite de vider le cache et terminer le cycle de vie :

Code : Tout sélectionner
stream.flush();
facesContext.responseComplete();
stream.close();
Arthur Filliot
Découvre Dominoarea
Découvre Dominoarea
 
Message(s) : 2
Inscrit(e) le : 20 Juil 2011 à 13:29


Retour vers XPages