Ich habe folgendes Problem. Ich will eine Liste durchlaufen und diese in XLS transformieren.
Die export-Methode sieht wie folgt aus.
Jetzt kommt mein eigebtliches Problem. Meine workbook()-Methode die in den OutputStream geschrieben wird sieht wie folgt aus:
1)
Wenn sich innerhalb der Methode diese beiden Iteratoren befinden, dann bekomme ich wunderbar in Exel eine Tabelle mit den Inhalten von getBetriebsmittel und getBenennung angezeigt. So soll es sein. Trotzdem ist das bestimmt total häßlich gemacht. Ich kann ja nicht für 20 verschiedene Werte 20 Iteratoren laufen lassen. Das muss doch besser gehen!!!
2)
Wenn die Methode so aussieht, dann bekomme ich folgende Exception geworfen:
somit muss der fehler in der for-schleife liegen. kann es sein, dass nach dem ersten durchlauf der iterator nicht auf das erste element zeigt?
wäre schön, wenn ihr mir dazu was sagen könnten und mir erklären könnt was ich falsch mache. danke
Die export-Methode sieht wie folgt aus.
Code:
public String exportieren(){
..
try{
FacesContext context = FacesContext.getCurrentInstance();
if(!context.getResponseComplete()){
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "inline; filename=\"test.xls\"");
OutputStream out;
out = response.getOutputStream();
workbook().write(out);
out.flush();
out.close();
context.responseComplete();
}
..
}
Jetzt kommt mein eigebtliches Problem. Meine workbook()-Methode die in den OutputStream geschrieben wird sieht wie folgt aus:
1)
Code:
private HSSFWorkbook workbook(){
..
for(ListIterator<Maschinendaten> iter = test.listIterator(); iter.hasNext();){
//Zellen mit Daten füllen
row = sheet.createRow(rowIndex++);
cell = row.createCell((short) 0);
cell.setCellValue(iter.next().getBetriebsmittel());
}
rowIndex = 1;
for(ListIterator<Maschinendaten> iter = test.listIterator(); iter.hasNext();){
//Zellen mit Daten füllen
row = sheet.createRow(rowIndex++);
cell = row.createCell((short) 1);
cell.setCellValue(iter.next().getBenennung());
}
..
}
Wenn sich innerhalb der Methode diese beiden Iteratoren befinden, dann bekomme ich wunderbar in Exel eine Tabelle mit den Inhalten von getBetriebsmittel und getBenennung angezeigt. So soll es sein. Trotzdem ist das bestimmt total häßlich gemacht. Ich kann ja nicht für 20 verschiedene Werte 20 Iteratoren laufen lassen. Das muss doch besser gehen!!!
2)
Code:
private HSSFWorkbook workbook(){
..
for(ListIterator<Maschinendaten> iter = test.listIterator(); iter.hasNext();){
//Zellen mit Daten füllen
row = sheet.createRow(rowIndex++);
cell = row.createCell((short) 0);
cell.setCellValue(iter.next().getBetriebsmittel());
cell = row.createCell((short) 1);
cell.setCellValue(iter.next().getBenennung());
}
..
}
Wenn die Methode so aussieht, dann bekomme ich folgende Exception geworfen:
Code:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:604)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:326)
org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:342)
org.apache.myfaces.shared_impl.renderkit.html.HtmlResponseWriterImpl.write(HtmlResponseWriterImpl.java:591)
org.apache.myfaces.taglib.core.ViewTag.doAfterBody(ViewTag.java:149)
org.apache.jsp.sicherheit.maendern_jsp._jspx_meth_f_005fview_005f0(maendern_jsp.java:152)
org.apache.jsp.sicherheit.maendern_jsp._jspService(maendern_jsp.java:110)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:419)
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
somit muss der fehler in der for-schleife liegen. kann es sein, dass nach dem ersten durchlauf der iterator nicht auf das erste element zeigt?
wäre schön, wenn ihr mir dazu was sagen könnten und mir erklären könnt was ich falsch mache. danke