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.)
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