jeudi 30 octobre 2014

Comment exporter facilement ses données dans différents formats ( pdf, excel ...) avec Grails ?


Dans le site que je suis en train de réaliser, j'ai des tableaux de données et je veux pouvoir les exporter facilement dans le format désiré.Pour cela, il existe un plugin Grails : export
Avec ce plugin, vous allez pouvoir ajouter ceci dans vos page HTML :



Ce tutoriel va expliquer comment installer et configurer ce plugin ainsi que les petits problèmes que j'ai rencontré.

Installation du plugin


Pour installer le plugin, il vous faut ajouter dans BuildConfig.groovy :


repositories {
...
mavenRepo "http://repo.grails.org/grails/core"
...
}
plugins {
...

compile ":export:1.6"
...
}

Si vous ne spécifiez pas le repositories Maven ( ce n'est pas dans la documentation), vous allez avoir l'erreur ci-dessous :

Resolve error obtaining dependencies: Could not find artifact org.odftoolkit:odfdom-java:jar:0.8.5 in grailsCentral (http://repo.grails.org/grails/plugins) (Use --stacktrace to see the full trace)
Error |


Modification de la page GSP

 <head>
     ... 
     <r:require module="export"/>
     ... 
 </head>
 <body>
     <export:formats /> 
 </body>

Le tag d'export va permettre l'affichage de la barre des icons.

Remarques :
  • Vous pouvez mettre le tag export tag n'importe où dans la GSP
  • Vous  pouvez spécifier le format désiré :

<export:formats formats="['csv', 'excel', 'ods', 'pdf', 'rtf', 'xml']" /> 


Modification de votre controller

Voici mon controlleur ( avec seulement le code utile ) :


class ToolsController {

    // Export service provided by Export plugin

    def exportService

    def grailsApplication  //inject GrailsApplication

    def index() {

        if(!params.max) {

            params.max = 10

        }

        if ((params.extension != null)) {

            log.info(params.get('zest'))

            def format=params.extension

            if ("xls".equals(params.extension)) {

                format="excel"

            }

            if(format && format != "html"){

                response.contentType = grailsApplication.config.grails.mime.types[format]

                response.setHeader("Content-disposition", "attachment; filename=check.${params.extension}")

                List fields = ["machineName", "fileName", "confServerName"]

                Map labels = ["machineName": "Nom de machine", "fileName": "Nom de fichier",   "confServerName":"Valeur du ServerName"]

                Map formatters = new HashMap()

                Map parameters = new HashMap()

                exportService.export(format, response.outputStream,Check.list(params), fields, labels, formatters, parameters)

            }

        }

   }

}

Dans mon code, j'utilise une classe Domaine : Check avec 3 membres: machineName, fileName, confServerName.Ils sont spécifiés dans le code car c'est ce que je veux afficher dans le pdf.

Remarques :
  • J'ai rencontré quelques problèmes avec la valeur de params.format.Elle était toujours null et je ne sais pas pourquoi.Mon code est donc un peu différent de la documentation.
  • Il est aussi possible d'ajuster la taille des colonnes et de mettre le titre des colonnes en gras en utilisant formatters et parameters.Voir la documentation pour plus de détails : http://grails.org/plugin/export
Pour information, voici ma configuration  :
  • Grails 2.3.11
  • Plugin ; runtime ":resources:1.2.1"