j’ai besoin de récupérer le HTML d’une crossTab.
Lorsque j’exécute l’action createReport, il récupère bien le crosstable mais cela plante lors de l’instruction .toHTML().
public void createRCMReport() {
com.simplicite.util.Crosstab o = this.getCrosstab("BCSIRCMModificationRequestStatus-vs-Type");
String crossTab = o.toHTML(this.getGrant(), false);
}
J’imagine que votre tableau n’a pas été calculé. pour exporter les données toJSON, toExcel… il faut préparer les données en mémoire sur un objet métier via build :
Crosstab c = getCrosstab("name");
if (c!=null) {
c.build(this); // this = current instance or any object with filters
String html = c.toHTML(getGrant(), false);
}
Merci pour votre retour. J’avais pas vu cette instructions dans les tutoriels.
Nous sommes bien d’accord que la méthode toHTML est censée me retourner directement le HTML, non ?
Il y a 2 verbes toHTML, le second premet de préciser un PrintWriter autre qu’un simple String (pour écrire dans un fichier, output stream http…)
/**
* Publish pivot table as raw HTML
* @param g Grant
* @param cubes true generate data as cubes, false generates as pivot table
* @return Publish pivot table as raw HTML
*/
public String toHTML(Grant g, boolean cubes)
{
PrintWriter out = new PrintWriter(new StringWriter());
toHTML(g, cubes, out);
return out.toString();
}
/**
* Publish pivot table as raw HTML on specified print writer.
* @param g Grant
* @param cubes true generate data as cubes, false generates as pivot table
* @param out Print writer
*/
public void toHTML(Grant g, boolean cubes, PrintWriter out)
Merci j’avais bien compris la javadoc .
Toutefois j’ai un soucis avec la méthode toHTML(Grant g, boolean cubes) . Au lieu de me retourner le contenu de mon StringWriter, elle me retourne un texte contenant le nom de l’objet StringWriter.
Comment puis-je faire pour obtenir “…
public void createRCMReport() {
Crosstab crosstab = this.getCrosstab("BCSIRCMModificationRequestStatus-vs-Type");
String htmlCrossTab;
if (crosstab == null) {
htmlCrossTab = "";
} else {
crosstab.build(this);
htmlCrossTab = crosstab.toHTML(getGrant(), false);
}
AppLog.info(htmlCrossTab, getGrant()); // Ici je m'attends à récupérer mon crosstab au format HTML "<table>...</table>". Au lieu de ça je récupère java.io.PrintWriter@c05da15
}
C’est possible :s
Mon besoin est : je veux qu’un des mes tableaux croisés soit envoyé par mail toutes les semaines.
J’ai donc créé une action qui lance une alerte. J’ai défini le contenu de l’alerte avec un message contenant le mot [CROSSTAB] et je souhaite remplacer ce texte par le contenu du crosstab.
J’avoue ne pas savoir si les APIs d’export du tableau croisé sont facilement utilisables dans votre contexte. Je vais regarder.
En tout cas le HTML issu de toHTML est volontairement minimaliste (<table><tr><td>) car sa raison d’être était de pouvoir être récupéré par les Excel legacy comme source de données externe (ce qui est deprecated avec les versions modernes d’Excel qui savent appeler des services REST).
Bref ajouter des styles issus de la UI à ce HTML n’a donc aucun de sens, ça n’améliorera en rien la présentation de ce HTML brut.
Si vous voulez vraiment intégrer (inliner) ce HTML dans le corps HTML d’un mail (i.e. pas en pièce jointe) mieux vaut mettre vos propres styles (et faire attention de n’intégrer que le contenu du <body> de ce HTML dans le HTML de votre mail, pour ne pas avoir 2 tags body).
Votre besoin c’est d’inliner le tableau croisé dans le corps de votre mail ou de le mettre dans un format X ou Y en pièce jointe de ce mail ?
OK dans ce cas qques styles ad hoc dans le corps de votre mail + un coup de JSoup (lib intégrée à Simplicité) pour extraire le body (ex: https://jsoup.org/cookbook/input/parse-body-fragment) et ou l’enrichir et ça devrait le faire.
Autre approche on peut ajouter une variante de la méthode toHTML qui ne générerait que le contenu du body, j’ai regardé c’est facile à faire, ça peut être fait aujourd’hui.
PS: Pour une pièce jointe la bonne approche aurait effectivement été plutôt de taper sur les APIs d’export standard du tableau croisé, je ne creuse pas ce sujet donc.
public String preAlert(Alert a) {
if (a!=null && "myAlert".equals(a.getName()) {
String lang = getGrant().getLang();
String body = a.getContent(lang);
body = body.replace("[CROSSTAB]", "...");
a.setContent(lang, body);
}
return null; // no error
}
Cela dit mon point sur le contenu du body reste valable. Il ne faut pas remettre un <html>, <head> ou <body> dans un body. Donc avoir un toHTML avec un argument embedded = true/false ne serait pas inutile.