2010-01-05 5 views
6

Ich arbeite an JasperReport Bericht, der Excel-Datei generiert. Aus irgendeinem Grund sind meine Zellenformate nicht so, wie sie sein sollten. Zum Beispiel habe ich Date-Objekt in meiner Zelle, aber wenn ich Excel-Datei generieren legt es Zellentyp auf Nummer, oder Long-Typ ist Text in der Zelle, sondern Zelle Format ist Nummer und auch wenn Benutzer bearbeiten Datumszelle (zum Beispiel mit Datum 11/02/2012 geändert am 11/03/2012) es konvertiert Datum in Zahl (41581.00).Excel-Zellenformat in JasperReport Bericht

Hier ist mein Code (es gibt nur den Popup-Stream mit dem Bericht an das Browser-Fenster):

public void generateXLSPopup(String tmpltFileLocation, Map<String, Object> params, Collection vo) { 
    log.fine("ReportEngine: Start Generate XLS Popup Report Function!"); 

    Filename f = new Filename(tmpltFileLocation); 

    String xlsFileName = f.getFileName() + "_" + sDateFormated + ".xlsx"; 

    try { 
     JasperPrint jasperPrint = getJRPrint(tmpltFileLocation, params, new JRBeanCollectionDataSource(vo)); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     JRXlsxExporter exporter = getCommonXlsxExporter(); 

     exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint); 
     exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, baos); // fill byte array output stream 

     exporter.exportReport(); 

     FacesContext context = FacesContext.getCurrentInstance(); 
     HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); 

     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
     response.setHeader("Content-disposition", "attachment; filename=" + xlsFileName); 
     response.setContentLength(baos.size()); 
     response.getOutputStream().write(baos.toByteArray()); 
     context.responseComplete(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    log.fine("ReportEngine: Finish Generate XLS Popup Report Function!"); 
} 


private JRXlsxExporter getCommonXlsxExporter(){ 
    JRXlsxExporter exporter = new JRXlsxExporter(); 
    exporter.setParameter(JRXlsExporterParameter.IGNORE_PAGE_MARGINS, Boolean.TRUE); 
    exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); 
    exporter.setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 
    exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); 
    exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); 
    exporter.setParameter(JExcelApiExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); 
    //exporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); 


    return exporter; 
} 

Und hier ist das Beispiel der ersten Zeilen in meiner Jaspis Bericht XML-Datei:

<textField isStretchWithOverflow="true" isBlankWhenNull="true"> 
       <reportElement style="alternateStyle" stretchType="RelativeToBandHeight" x="0" y="0" width="100" height="20"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.Long"><![CDATA[$F{id}]]></textFieldExpression> 
      </textField> 
      <textField isStretchWithOverflow="true" isBlankWhenNull="true"> 
       <reportElement style="alternateStyle" stretchType="RelativeToBandHeight" x="200" y="0" width="100" height="20"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.String"><![CDATA[$F{emsProdNo}]]></textFieldExpression> 
      </textField> 
      <textField isStretchWithOverflow="true" isBlankWhenNull="true"> 
       <reportElement style="alternateStyle" stretchType="RelativeToBandHeight" x="100" y="0" width="100" height="20"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.String"><![CDATA[$F{courseName}]]></textFieldExpression> 
      </textField> 
      <textField isStretchWithOverflow="true" pattern="MMMMM dd, yyyy" isBlankWhenNull="true"> 
       <reportElement style="alternateStyle" stretchType="RelativeToBandHeight" x="300" y="0" width="98" height="20"/> 
       <textElement> 
        <font isUnderline="true"/> 
       </textElement> 
       <textFieldExpression class="java.util.Date"><![CDATA[$F{startDate}]]></textFieldExpression> 
      </textField> 
      <textField isStretchWithOverflow="true" isBlankWhenNull="true"> 
       <reportElement style="alternateStyle" stretchType="RelativeToBandHeight" x="474" y="0" width="81" height="20"/> 
       <textElement/> 
       <textFieldExpression class="java.lang.String"><![CDATA[$F{endDateStr}]]></textFieldExpression> 
      </textField> 

(Bitte fragen sie mich nicht, warum ich on the fly Jaspervorlagendatei bin zu erzeugen, das ist, wie ich es brauche.)

Antwort

3

Das Problem ist/war, weil ich bin mit POI 3.5 und Jasper s 3.7.0 und Generieren des XLSX Excel-Formats. POI 3.5 wird in JasperReports 3.7.1 unterstützt (oder einfach Snapshot von SVN bekommen). Also, was ich getan habe, ging ich einfach auf die alte Excel-Datei (xls) zurück und es funktionierte perfekt.

2

Gerade FYI

setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 

oder IS_DETECT_CELL_TYPE, Boolean.TRUE ist derjenige, der die Date-Nummer ändern macht.

+1

Also was Sie sagen, ist Wenn dieses Flag in der Zelle in Excel aktiviert ist, wird der Datumstyp nicht korrekt als Datum erkannt. Wenn dies auf FALSE gesetzt ist, gehen Nummernfelder falsch. Also, wie kann ich beide Arten gut arbeiten, ich xlsx? – tropikalista

7

In eine neue Version von JasperReports der Parameter net.sf.jasperreports.export.xls.pattern eingeführt.

Die Probe:

<textField pattern="EEE, MMM d, yyyy"> 
    <reportElement x="100" y="12" width="75" height="11"> 
     <property name="net.sf.jasperreports.export.xls.pattern" value="ddd, mmm d, yyyy"/> 
    </reportElement> 
    <textElement textAlignment="Right"/> 
    <textFieldExpression class="java.sql.Timestamp"><![CDATA[$F{dateField}]]> 
    </textFieldExpression> 
</textField> 

Informationen zu diesem Parameter ist here. Die verwendete Probe ist here.

2

Jasper Version 4.1.1 net.sf.jasperreports.export.xls.pattern eingeführt.

check here

In Eigenschaften Ausdrücke

Eigenschaften Name >> net.sf.jasperreports.export.xls.pattern

Eigenschaften Wert >> @ für Text, yyyy -mm-dd für Datumsformat, #, ## 0.00; - #, ## 0.00 für Währung, etc ....

Verwandte Themen