I am working on a JasperReport post that generates an Excel file. For some reason, cell formats / types are not what they should be. For example, I have a Date object in my cell, but when I create the Excel file, it sets the cell type to Number or Long type is the text in the cell, but the cell format is the number, and also when the custom cell is the date of editing (for example, with the date 02/11/2012 changed to 03/11/2012), it converts the date to a number (41581.00).
Here is my code (it just displays a pop-up stream in a browser window with a report):
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; }
And here is an example of the first few lines in my jasper XML report file:
<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>
(Please do not ask me why I create the jasperreport template file on the fly, as I need it.)
java excel jasper-reports
Maxim
source share