May 11, 2008

Αποτελεσματικότερη εξαγωγή (export) στο excel από το JHeadstart

Υπάρχουν διάφορα αξιόλογα άρθρα που περιγράφουν το πώς είναι δυνατόν να εξάγουμε ένα ADF πίνακα σε excel (όπως http://kuba.zilp.pl/?id=421, http://blogs.ittoolbox.com/oracle/jjflash/archives/exporting-from-adf-faces-to-csv-excel-23168) με τη βοήθεια του Apache POI (http://poi.apache.org/ ) Σε όλες τις προσεγγίσεις, είναι απαραίτητο να χρησιμοποιήσουμε μια μέθοδο σε ένα backing bean στην οποία ορίζεται το όνομα του ADF iterator (που κρατά τα δεδομένα), προχωρά στη δημιουργία του excel αρχείου και ενεργοποιείται με το πάτημα ενός κουμπιού.

Θέλοντας να εκμεταλλευτούμε τις templating δυνατότητες του JHeadstart, το όνομα του iterator μπορεί να γίνει παράμετρος ώστε να κατασκευάσουμε ένα επαναχρησιμοποιήσιμο κουμπί. Υπάρχει λοιπόν μια ειδική μεταβλητή ονόματι ITERATOR που μπορούμε να χρησιμοποιήσουμε στα vm's μας ώστε να αναφερθούμε στα τρέχοντα δεδομένα. Έτσι, η κατασκευή ενός γενικού κουμπιού εξαγωγής στο excel μπορεί να μοιάζει ως εξής:
<af:commandButton text="#{nls['button.exporttoexcel']}" id="ExportToExcelButton" action="#{navBean.onExportToExcelClick}" rendered="#{#ITERATOR().estimatedRowCount > 0}" >

<af:setActionListener from="#{#ITERATOR().name}" to="#{requestScope.iteratorName}" />

</af:commandButton >



Κατά αυτόν τον τρόπο, παιρνάμε σαν παράμετρο το όνομα του iterator, το οποίο μπορούμε μετέπειτα να χρησιμοποιήσουμε για την παραγωγή του excel αρχείου.

2 comments:

Anonymous said...

Καλησπέρα,

φαίνεται καλή η προσέγγιση γιατί δουλεύει η ειδική αυτή μεταβλητή, αλλά πως περνιέται το όνομα του Iterator σε μια γενική συνάρτηση, π.χ. στο Application Module? Εδώ φαίνεται να σώζεται σε μια μεταβλητή σ' ένα session bean.

Kαι επίσης έστω μια συνάρτηση στο Application Module. Πως προσπελαύνει το όνομα αυτό και πως βρίσκει από το όνομα μετά τον Iterator?

Serafeim Karapatis said...

Σωστά παρατηρείς πως σώζεται η τιμή του iterator σε ένα session bean. Από εκεί και πέρα, οι iterators συνδέονται με τα view objects και αποτελούν τη βάση που δουλεύουν τα data bindings. Οποιαδήποτε πρόσβαση σε δεδομένα σε μια σελίδα (όπως ορίζεται στο page definition της) γίνεται μέσω iterators, ποτέ απευθείας μέσω view objects.

Από ένα backing bean μπορείς να καλέσεις μια μέθοδο στο Application Module στο οποίο έχεις συνδεθεί όπως περιγράφεται στο http://download-uk.oracle.com/docs/html/B25947_01/bcservices005.htm