Page 1 sur 1

Export Excel directement dans le navigateur avec une xPage

MessagePublié: 10 Août 2010 à 16:53
par mike76
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();

MessagePublié: 10 Nov 2010 à 10:00
par lcheret
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

MessagePublié: 20 Juil 2011 à 13:40
par Arthur Filliot
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();