# CrossTab Impossible d'obtenir le HTML toHTML

**URL:** <https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604>\
**Category:** Feature request\
**Tags:** v4-0\
**Created:** [September 22, 2020, 4:09pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604 "2020-09-22T16:09:09Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 22, 2020, 4:09pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/1 "2020-09-22T16:09:09Z")

</div>

Bonjour

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().

```auto
	public void createRCMReport() {
		com.simplicite.util.Crosstab o = this.getCrosstab("BCSIRCMModificationRequestStatus-vs-Type");
		String crossTab = o.toHTML(this.getGrant(), false);
	}

```

J’obtiens alors ceci :

 ![image](https://community.simplicite.io/uploads/default/original/2X/3/303cfe1f8ee4db2d280b93f8d292baa530262b9c.png)

Aucune autre trace dans les logs.  
Mon utilisateur a bien tous les droits.

Pouvez-vous m’indiquer où est mon erreur ?

Cordialement  
Amandine T.

**[Platform]**  
Status=OK  
Version=4.0.P24  
BuiltOn=2020-09-08 13:58 (revision cc3e1c0a38d7b0549d655541696b9efd34201031)  
Encoding=UTF-8  
EndpointIP=21.0.9.8  
EndpointURL=[http://e1f8baa69103:8080](http://e1f8baa69103:8080)  
TimeZone=Europe/Paris  
SystemDate=2020-09-22 18:07:23

---

<div class="post-metadata">

**Author:** ![Francois](https://community.simplicite.io/user_avatar/community.simplicite.io/francois/32/6448_2.png) [@Francois](https://community.simplicite.io/u/Francois)\
**Post date:** [September 22, 2020, 7:02pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/2 "2020-09-22T19:02:00Z")

</div>

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` :

```java
Crosstab c = getCrosstab("name");
if (c!=null) {
  c.build(this); // this = current instance or any object with filters
  String html = c.toHTML(getGrant(), false);
}

```

---

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 23, 2020, 8:46am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/3 "2020-09-23T08:46:07Z")

</div>

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 ?

 ![image](https://community.simplicite.io/uploads/default/original/2X/a/a216b143bb1c242226d738bac8349edbdd697425.png)

Lorsque j’applique votre code ma variable html contient la référence à un printer (exemple : java.io.PrintWriter@c05da15)

Ai-je louper quelque chose ?

Cordialement

---

<div class="post-metadata">

**Author:** ![Francois](https://community.simplicite.io/user_avatar/community.simplicite.io/francois/32/6448_2.png) [@Francois](https://community.simplicite.io/u/Francois)\
**Post date:** [September 23, 2020, 1:23pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/4 "2020-09-23T13:23:50Z")

</div>

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…)

```java
	/**
	 * 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)

```

---

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 23, 2020, 1:36pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/5 "2020-09-23T13:36:17Z")

</div>

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 “…

” ?

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 23, 2020, 1:41pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/6 "2020-09-23T13:41:06Z")

</div>

Quel est votre code ? C’est sans doute un toString explicite ou implicite qui pose pb quelque part

---

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 23, 2020, 1:44pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/7 "2020-09-23T13:44:57Z")

</div>

```auto
	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

	}

```

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 23, 2020, 1:56pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/8 "2020-09-23T13:56:18Z")

</div>

Oui la méthode `toHTML` qui renvoie un String ne fait pas ce qu’il faut. On regarde

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 23, 2020, 3:49pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/9 "2020-09-23T15:49:49Z")

</div>

C’est bon c’est corrigé. C’est poussé donc ce sera disponible chez vous dès demain.

J’ai fait un test (affichage du HTML du tableau croisé en texte via une action):

```java
	public String action2() {
		try {
			Crosstab ct = getCrosstab(getName() + "-T1");
			ct.build(this);
			String t = ct.toHTML(getGrant(), false);
			return Message.formatSimpleText(t);
		} catch (Exception e) {
			return Message.formatSimpleError(e);
		}
	}

```

Ca marche:

 ![image](https://community.simplicite.io/uploads/default/original/2X/9/90fec1c26d666ad640e328d3a18eac6544723436.png)

---

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 24, 2020, 9:11am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/10 "2020-09-24T09:11:58Z")

</div>

Merci cela marche nickel.

Savez-vous s’il y a un moyen rapide de récupérer le CSS du thème admin pour l’intégrer dans le HTML généré ?

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 24, 2020, 9:14am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/11 "2020-09-24T09:14:56Z")

</div>

N’êtes vous pas en train de réinventer l’export du tableau croisé ?

---

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 24, 2020, 9:21am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/12 "2020-09-24T09:21:08Z")

</div>

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.

Y a t’il une meilleure façon de faire ?

Cordialement

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 24, 2020, 9:35am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/13 "2020-09-24T09:35:30Z")

</div>

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 ?

---

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 24, 2020, 9:37am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/14 "2020-09-24T09:37:53Z")

</div>

inliner le tableau.  
Merci pour votre réponse et vos explications.

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 24, 2020, 9:54am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/15 "2020-09-24T09:54:44Z")

</div>

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](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.

---

<div class="post-metadata">

**Author:** ![Francois](https://community.simplicite.io/user_avatar/community.simplicite.io/francois/32/6448_2.png) [@Francois](https://community.simplicite.io/u/Francois)\
**Post date:** [September 24, 2020, 11:30am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/16 "2020-09-24T11:30:58Z")

</div>

> [@Amandine](#):
>
> 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.

Il suffit de faire un replace dans le preAlert.

```java
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
}

```

---

<div class="post-metadata">

**Author:** ![Amandine](https://community.simplicite.io/letter_avatar_proxy/v4/letter/a/8baadc/32.png) [@Amandine](https://community.simplicite.io/u/Amandine)\
**Post date:** [September 24, 2020, 11:41am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/17 "2020-09-24T11:41:46Z")

</div>

Merci @david pour tes retours.

@Francois c’est effectivement ce que j’ai déjà implémenté. ^^

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 24, 2020, 11:43am UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/18 "2020-09-24T11:43:44Z")

</div>

Ah ben je passe pour quoi avec mes approches compliquées maintenant… ;-)

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 24, 2020, 12:15pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/19 "2020-09-24T12:15:48Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![david](https://community.simplicite.io/user_avatar/community.simplicite.io/david/32/5703_2.png) [@david](https://community.simplicite.io/u/david)\
**Post date:** [September 24, 2020, 1:25pm UTC](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604/20 "2020-09-24T13:25:45Z")

</div>

Done: [https://docs.simplicite.io/4.0/javadoc-beta/com/simplicite/util/Crosstab.html#toHTML(com.simplicite.util.Grant,boolean,boolean)](https://docs.simplicite.io/4.0/javadoc-beta/com/simplicite/util/Crosstab.html#toHTML(com.simplicite.util.Grant,boolean,boolean))

Il faut mettre `embedded` = `true` pour n’avoir que la table.

C’est en train d’être poussé sur toutes les branches

[Next page](https://community.simplicite.io/t/crosstab-impossible-dobtenir-le-html-tohtml/2604.md?page=2)
