Bonjour,

quelqu'un a t il deja eu l'occasion de developper la generation d'etat Excel via l'API de communication asynchrones DWR?

En fait je souhaites exporter les données des tableaux de mes jsp au format excel...donc pouvoir faire apparaitre la dialog box pertmettant d'ouvrir ou de sauvegarder mon fichier...

voici mon code de test:

.jsp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<title>Test DWR</title>
  <script type='text/javascript' src='dwr/engine.js'> </script>
  <script type='text/javascript' src='dwr/util.js'> </script>
  <script type='text/javascript' src='dwr/interface/ReportDWRAction.js'> </script>
<script>
function reportExcel(){
    alert("msg");
    ReportDWRAction.doReport();
 }
</script>
</head>
<body>
 
<form name="formDWR" action="FormDWRAction.do" method="post" style="width:50%;margin:auto;background-color:#c1d9fc;padding-bottom:15px;">
 
 <a href="#" onClick="reportExcel();">Rapport Excel</a>
 
 </form>
</body>
</html>
.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
 
package ma.gfi.testDwr;
 
import java.io.IOException;
import java.util.ArrayList;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.SQLException;
import javax.servlet.jsp.PageContext;
import jxl.Workbook;
import jxl.format.Colour;
import jxl.format.ScriptStyle;
import jxl.format.UnderlineStyle;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
 
 
public class ReportDWRAction{
 
	private ArrayList<ArrayList<String>> liste0 = new ArrayList<ArrayList<String>>();
 
 
	 public void doReport() {
		//nous précisons dans l’en-tête de la réponse de la Servlet, que le document est un
			// fichier Excel, puis nous précisons le nom de fichier
 
		    WebContext ctx = WebContextFactory.get();
		    HttpServletResponse response = ctx.getHttpServletResponse();
			response.setContentType("application/octet-stream");
			response.setHeader("Content-Type","application/force-download");
			response.setHeader("Content-Disposition", "attachment; filename=monfichier.xls;");
 
			// nous créyons notre liste de liste
			  ArrayList<String> l1 = new ArrayList<String>();
			  l1.add("aaa");
			  l1.add("bbb");
			  liste0.add(l1);
			// Maintenant, nous récupérons le flux de sortie de la Servlet, car c’est sur lui que nous allons écrire le
			// fichier Excel, c’est ce qui va nous permettre de l’envoyer au navigateur en affichant la boîte de dialogue
			// téléchargement de fichier.
				try	{
 
				// ServletOutputStream out2 = response.getOutputStream();
			    	  // création du classeur
			    	  WritableWorkbook classeur = Workbook.createWorkbook(response.getOutputStream());
			    	  // création d'une feuille de calcul
			    	  WritableSheet feuille = classeur.createSheet("Page 1", 0);
			    	  writeDataSheet(feuille, liste0);
 
			    	  // Pour finir, nous sauvegardons le classeur, puis nous le fermons avant de l’envoyer sur la sortie de la Servlet
 
			    	// Envoi au navigateur et fermeture
			    	  classeur.write();
			    	  classeur.close();
			    	  response.flushBuffer();
			    	  response.getOutputStream().flush();
			    	  response.getOutputStream().close();
			    	  System.gc();
			   }
			    catch (IOException e)
			    {
			      e.printStackTrace();
			    }
			    catch (WriteException e)
			    {
			      e.printStackTrace();
			    }
	 }
 
 
 
	private void writeDataSheet(WritableSheet s, ArrayList<ArrayList<String>> liste ) 
	    throws WriteException
	  {			int indexRow=1 ,indexCol =0;
 
			  int index=0;
				for (ArrayList<String> data : liste) {
			      	for (String element : data) {
			      				element = element.replaceAll("&39;", "'");
			      				element = element.replaceAll("&32;", " ");
			      				data.set(index, element);
			      				index++;
			      	}
			      	index = 0;
		       }
	  			//format des cellules du nom des colonnes
				WritableFont arial10font = new WritableFont(WritableFont.ARIAL, 14,WritableFont.BOLD, true, UnderlineStyle.NO_UNDERLINE,Colour.BLUE, ScriptStyle.NORMAL_SCRIPT);
				WritableCellFormat arial10format = new WritableCellFormat(arial10font);
 
				//noms de colonnes à la ligne 0 avec le format spécifique
				for ( String colNom : liste.get(liste.size()-1)) {
					Label label = new Label(indexCol, 0, colNom, arial10format);
					s.addCell(label);
					indexCol++;
				}
				indexCol = 0;
				for (ArrayList<String> data : liste.subList(0, (liste.size()-1))) {
	            	for (String element : data) {
	            		Label label = new Label(indexCol, indexRow,element);
	            		s.addCell(label);
	            		indexCol++;
	            	}
	            	indexRow++;
	            	indexCol = 0;
	             }
	 }
 
}
dwr.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
    "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
 
<dwr>
  <allow>
    <create creator="new" javascript="ReportDWRAction">
      <param name="class" value="ma.gfi.testDwr.ReportDWRAction"/>
      <include method="doReport"/>
    </create>
  </allow>
  </dwr>

Le message d'erreur qui s'affiche est le suiavant:

java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse