Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Victor AMORIM
Export vers Excel
June 23, 2010 8:04 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Bonjour,

j'aimerais savoir s'il est possible à partir d'un portlet JSP d'exporter le contenu d'une table ou d'un search-container vers un document excel ou pdf?

De ce que j'ai vu sur le forum il semblerait que certains utilisent le "display-tag table":
http://www.liferay.com/community/forums/-/message_boards/message/4827936

Est-ce la bonne solution?

Merci.
Tanweer Ahmed Ansari
RE: Export vers Excel
June 23, 2010 9:51 AM
Answer

Tanweer Ahmed Ansari

Rank: Regular Member

Posts: 217

Join Date: March 11, 2010

Recent Posts

Bonjour Victor,

You can absolutely export your data from Search Container to Excel.
The data which you are displaying in Search Container must be in some list.Get that list in a Servlet .
In your Servlet,
 1          
 2                 public static final String COMMA = ",";
 3                
 4                 res.setContentType("application/CSV");
 5                 res.setHeader("Cache-Control", "public");
 6                 res.setHeader("Pragma", "public");
 7                 res.setHeader("Content-Disposition", "attachment; filename=\"Applicant.csv" + "\"");
 8                
 9                 String content="Name"+COMMA+"Age"+"\n\n";
10                 for(int i=0;i<mylist.size();i++) {
11                      List employ = MPEmployLocalServiceUtil.findByPrimaryKey((mylist.get(i).getRegId()));
12                      content+=mylist.get(i).getName()+COMMA+mylist.get(i).getAge()+"\n";
13                  }
14                 res.getOutputStream().print(content);


In the above code ,
mylist is the List which we obtained from the jsp page.From this list we are extracting the name and age and adding it to the content.Finally we are printing data in the excel sheet.

Hope this answers your question.

CHEERS
Victor AMORIM
RE: Export vers Excel
July 2, 2010 3:00 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Thanks
Victor AMORIM
RE: Export vers Excel
July 6, 2010 5:45 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Bonjour,

je n'ai pas encore développé de servlet, j'aurais donc besoin de plus de conseils à ce sujet.

Je me suis renseigné de mon coté mais j'ai l'impression qu'on ne peut pas créer une servlet avec le plugin sdk. En effet eclipse propose de créer des servlet sur le projet sdk et non sur mon portlet qui est par conséquent intégré au sdk.

Merci
Tanweer Ahmed Ansari
RE: Export vers Excel
July 6, 2010 11:41 AM
Answer

Tanweer Ahmed Ansari

Rank: Regular Member

Posts: 217

Join Date: March 11, 2010

Recent Posts

AMORIM Victor:
Bonjour,

je n'ai pas encore développé de servlet, j'aurais donc besoin de plus de conseils à ce sujet.

Je me suis renseigné de mon coté mais j'ai l'impression qu'on ne peut pas créer une servlet avec le plugin sdk. En effet eclipse propose de créer des servlet sur le projet sdk et non sur mon portlet qui est par conséquent intégré au sdk.

Merci


Salut,
Nous ne pouvons absolument développer des servlets avec des plugins SDK
Victor AMORIM
RE: Export vers Excel
July 7, 2010 12:10 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Merci pour tes réponses,

Je voudrais savoir s'il est néanmoins possible de créer un servlet et de l'appeler à partir de mon portlet? J'ai vu qu'un servlet pouvait être appelé à partir d'une simple url.
Puis comment cela ce passe? Faut-il aussi générer un .war pour l'ajouter à liferay?

Je continu de chercher de mon coté.

Merci.
Baptiste Grenier
RE: Export vers Excel
July 7, 2010 12:21 AM
Answer

Baptiste Grenier

Rank: Regular Member

Posts: 100

Join Date: June 30, 2009

Recent Posts

AMORIM Victor:
Je voudrais savoir s'il est néanmoins possible de créer un servlet et de l'appeler à partir de mon portlet? J'ai vu qu'un servlet pouvait être appelé à partir d'une simple url.
Puis comment cela ce passe? Faut-il aussi générer un .war pour l'ajouter à liferay?

Bonjour,
Il est tout à fait possible d'inclure une servlet dans un portlet développé avec le Plugins SDK:
Il faut ajouter la classe Java de la servlet dans docroot/WEB-INF/src.../MaServlet.java et ensuite il faut ajouter une déclaration et un mapping pour la servlet dans le docroot/WEB-INF/web.xml:
1<servlet>
2    <servlet-name>MaServlet</servlet-name>
3    <servlet-class>org.plop.liferay.portlets.MaServelt</servlet-class>
4  </servlet>
5  <servlet-mapping>
6    <servlet-name>MaServlet</servlet-name>
7    <url-pattern>/maservlet</url-pattern>
8  </servlet-mapping>

Par contre, je ne sais pas si tu en as besoin, mais je ne sais pas trop comment faire pour accèder à l'objet themeDisplay à partir de la servlet.
Victor AMORIM
RE: Export vers Excel
July 7, 2010 1:10 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Merci pour la réponse,

je vais essayer ta méthode, pour le themeDisplay je t'avoue que moi-meme je ne sais pas si j'aurais à l'utilisé pour l'export.
Le but étant d'exporter une liste d'informations obtenu après une recherche de l'utilisateur et de l'exporter sur excel. Donc j'utiliserais dans ma class java ce que ma conseillé Tanweer Ahmed Ansari.

Merci à tous les deux.
Victor AMORIM
RE: Export vers Excel
July 8, 2010 1:45 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Bonjour,

Cela fonctionne bien. Je récapitule pour être sur d'avoir bien compris, puis ça servira certainement à d'autres.
Un portlet ne peut pas télécharger ou générer un fichier binaire. Pour cela il faut alors utiliser une servlet et l'appeler à partir du portlet.
Le plugin SDK que j'utilise permet de créer facilement des portlets est d'autres composants pour liferay. Néanmoins bien que j'ai le WTP pour eclispe, on ne peut pas créer de servlet dans le plugin SDK. Il demande un projet web dynamique (pour produire un war).
Pour générer mon servlet j'ai alors suivi le conseil de Baptiste Grenier. Je l'ai générer avec éclipse et j'ai copier la classe java dans :

docroot/WEB-INF/src/com/nomPortlet/servlet/ExportExcel.java

Voici le code de ma servlet:
  1import java.io.IOException;
  2import java.sql.Timestamp;
  3import java.text.DateFormat;
  4import java.text.SimpleDateFormat;
  5import java.util.ArrayList;
  6import java.util.Date;
  7import java.util.List;
  8
  9import javax.servlet.ServletException;
 10import javax.servlet.http.HttpServletRequest;
 11import javax.servlet.http.HttpServletResponse;
 12
 13import org.apache.poi.hssf.usermodel.HSSFCell;
 14import org.apache.poi.hssf.usermodel.HSSFRow;
 15import org.apache.poi.hssf.usermodel.HSSFSheet;
 16import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 17import org.apache.poi.hssf.usermodel.HSSFHeader;
 18import org.apache.poi.hssf.usermodel.HSSFFooter;
 19
 20import java.util.StringTokenizer;
 21import javax.servlet.ServletOutputStream;
 22
 23/**
 24 * Servlet implementation class for Servlet: ExportExcel
 25 *
 26 */
 27 public class ExportExcel extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
 28   static final long serialVersionUID = 1L;
 29   public static final String COMMA = ";";      
 30   
 31    /* (non-Java-doc)
 32     * @see javax.servlet.http.HttpServlet#HttpServlet()
 33     */
 34    public ExportExcel() {
 35        super();
 36    }      
 37   
 38    /* (non-Java-doc)
 39     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 40     */
 41    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 42            
 43        System.out.println("Export Excel GET");
 44        //On récupère les patramètres
 45        String typeFichier = request.getParameter("typeFichier");
 46        String exportStr = request.getParameter("exportStr");
 47
 48        //String exportTab1[] = exportStr.split("$$");
 49        //int nbLignes = exportTab1.length;
 50       
 51        //Preparation de la date pour le nom du fichier
 52        Date dateExport = new Date();
 53        Timestamp timeStampDate = new Timestamp(dateExport.getTime());
 54        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy-HH-mm");
 55        String affDate = formatter.format(timeStampDate);
 56       
 57        response.setHeader("Cache-Control", "public");
 58        response.setHeader("Pragma", "public");
 59        //On donne le nom du fichier
 60        response.setHeader("Content-Disposition", "attachment; filename=\"Export"+affDate+"."+typeFichier+"\"");
 61
 62        //On récupère le flux de sortie
 63        ServletOutputStream out = response.getOutputStream();
 64       
 65        //On indique le type d'export que l'on va faire
 66        if(typeFichier.equals("xls")){
 67            System.out.println("Type XLS");
 68            response.setContentType("application/vnd.ms-excel");
 69            // On crée l'Excel Workbook et le Sheet
 70            HSSFWorkbook wb = new HSSFWorkbook();
 71            HSSFSheet sheet = wb.createSheet("Annuaire CHIELVR");
 72            //HSSFHeader header = sheet.getHeader();
 73            //header.setCenter("Annuaire CHIELVR header");
 74
 75            HSSFRow row = null;
 76            HSSFCell cell = null;
 77            String entreeStr = "";
 78            //String[] exportTab2 = null;
 79            //On récupère le nombre de lignes et on boucle dessus
 80            StringTokenizer st = new StringTokenizer(exportStr,"$$");
 81            for(int i = 0; i < st.countTokens(); i++ ) {
 82                //On creer la ligne
 83                row = sheet.createRow(i);
 84                //On récupère l'entrée
 85                entreeStr = st.nextToken();
 86                //On coupe la ligne pour obtenir les différents champs de l'entrée
 87                StringTokenizer st2 = new StringTokenizer(entreeStr,";");
 88                String token = "";
 89                for(int j = 0; j < st2.countTokens(); j++ ) {
 90                    cell = row.createCell(j);
 91                    token = st2.nextToken();
 92                    if(token != null){
 93                        cell.setCellValue(token);
 94                    }else{
 95                        cell.setCellValue(" ");
 96                    }
 97                }
 98            }
 99            //On écris le contenu du workbook sur le flux de sortie
100            wb.write(out);
101            out.close();
102        }else if(typeFichier.equals("csv")){
103            
104            System.out.println("Type CSV");
105            String print = "";
106            response.setContentType("application/CSV");
107            StringTokenizer st = new StringTokenizer(exportStr,"$$");
108            int cptToken =  st.countTokens();
109            String content = "" ;
110            for(int i = 0; i < cptToken; i++ ) {
111                print = st.nextToken();
112                content += print;
113                content += "\n";
114            }
115            out.print(content);
116        }
117    }      
118   
119    /* (non-Java-doc)
120     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
121     */
122    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
123        System.out.println("Export Excel POST");
124    }                
125}


Et il faut déclarer la servlet dans web.xml:
 1<web-app>
 2    <servlet>
 3        <description>
 4        </description>
 5        <display-name>ExportExcel</display-name>
 6        <servlet-name>ExportExcel</servlet-name>
 7        <servlet-class>ExportExcel</servlet-class>
 8    </servlet>
 9    <servlet-mapping>
10        <servlet-name>ExportExcel</servlet-name>
11        <url-pattern>/ExportExcel</url-pattern>
12    </servlet-mapping>
13</web-app>


Puis on peut l'appeller avec un simple lien dans une jsp:
1<a href="<%=response.encodeURL(request.getContextPath()+"/ExportExcel") %>?typeFichier=xls&exportStr=<%=exportStr %>" > Export Excel </a>


Il me reste deux problèmes:
-Le fichier excel n'est aps correctement rempli, il manque certaines collonnes.
-Lorsqu'il y a trop de lignes le popup proposant l'ouverture de excel n'apparait pas et le fichier n'est pas généré.
Pour la première ca devrais se régler avec quelque tests. par contre la deuxième j'ai l'impression que c'est un problème de taille maximale du ServletOutputStream.

Merci encore pour votre aide.
Juan Fernández
RE: Export vers Excel
July 8, 2010 4:09 AM
Answer

Juan Fernández

LIFERAY STAFF

Rank: Liferay Legend

Posts: 1227

Join Date: October 2, 2008

Recent Posts

Salut Amorim:

Vous avez un bon exemple de la façon dont Liferay implémente cette fonctionnalité dans le fichier GetFile.java et je pense que ça peux servir de référence a vôtre problème.

Salutations,
Juan Fernández
Liferay Core Engineer
Victor AMORIM
RE: Export vers Excel
July 8, 2010 5:51 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Merci, désolé mais je ne trouve pas cette classe, j'ai fait une recherche dans l'ext et dans portal mais je n'ai rien trouvé.

Merci de bien vouloir me donner la package.
Victor AMORIM
RE: Export vers Excel
July 13, 2010 1:47 AM
Answer

Victor AMORIM

Rank: Junior Member

Posts: 70

Join Date: April 26, 2010

Recent Posts

Bonjour,

j'ai résolu mon problème, il venait de ma boucle for dans ma servlet.
il faut mettre:
1
2int nbLignes = st.countTokens();
3for(int i = 0; i < nbLignes; i++ ) {

au lieu de:
1
2for(int i = 0; i < st.countTokens(); i++ ) {

Autant pour moi.

Merci
djo vitch
RE: Export vers Excel
June 6, 2013 3:28 AM
Answer

djo vitch

Rank: New Member

Posts: 24

Join Date: April 4, 2013

Recent Posts

it's not working for me.the servlet not found Etat HTTP 404 - Servlet ExportQP n'est pas disponible.