JasperReport报表中的Excel单元格格式

我正在处理生成Excel文件的JasperReport报告。 出于某种原因,我的单元格格式/types不是他们应该如何。 例如我在我的单元格中有Date对象,但是当我生成Excel文件时,它将单元格types设置为Number,或者Longtypes是单元格中的文本,但单元格的格式是数字,也是用户编辑date单元格(例如,date为11/02 / 2012更改为11/03/2012)将date转换为编号(41581.00)。

这里是我的代码(它只是输出popup窗口到浏览器窗口的报告):

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; } 

下面是我的jasper报告xml文件中前几行的示例:

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

(请不要问我为什么要dynamic生成jasperreport模板文件,这就是我需要的。)

在新版本的JasperReports中引入了net.sf.jasperreports.export.xls.pattern参数。

例子:

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

关于这个参数的信息在这里 。 使用的样本在这里 。

问题是/因为我使用POI 3.5和JasperReports 3.7.0和生成XLSX Excel格式。 JasperReports 3.7.1支持POI 3.5(或者从SVN获取快照)。 所以我做了我刚刚回到旧的Exceltypes(xls)文件,它的工作完美。

只是供参考

 setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 

IS_DETECT_CELL_TYPE, Boolean.TRUE是使date更改为数字。

JasperReports版本4.1.1引入了net.sf.jasperreports.export.xls.pattern

在这里检查

在属性expression式中

属性名称 >> net.sf.jasperreports.export.xls.pattern

属性值 >>为文本,date格式为yyyy-mm-dd,#,## 0.00; – #,## 0.00为货币等。