我正在研究生成Excel文件的JasperReport报告。出于某种原因,我的单元格格式/类型不是它们应该如何。例如,我在单元格中有Date对象,但是当我生成Excel文件时,它将单元格类型设置为Number,或者Long类型是单元格中的文本,但单元格的格式是数字,并且当用户编辑日期单元格时(例如日期为11/02) / 2012更改为11/03/2012)它将日期转换为数字(41581.00)。
这是我的代码(它只是将弹出流输出到带有报告的浏览器窗口):
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>
(请不要问我为什么我会动态生成jasperreport模板文件,这就是我需要它的方式。)
答案 0 :(得分:9)
在新版 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>
答案 1 :(得分:3)
问题在于,因为我正在使用POI 3.5和JasperReports 3.7.0以及生成XLSX Excel格式。 JasperReports 3.7.1将支持POI 3.5(或者只是从SVN获取快照)。所以我做了什么,我只是回到旧的Excel类型(xls)文件,它工作得很完美。
答案 2 :(得分:2)
仅供参考
setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE);
或IS_DETECT_CELL_TYPE, Boolean.TRUE
是使日期更改为数字的那个。
答案 3 :(得分:2)
JasperReports 版本4.1.1 net.sf.jasperreports.export.xls.pattern 已经推出。
在属性表达式中
属性名称&gt;&gt; net.sf.jasperreports.export.xls.pattern
属性值&gt;&gt; @为文本,yyyy-mm-dd为日期格式,#,## 0.00; - #,## 0.00为货币等....