【问题标题】:Excel Cell Format in JasperReport ReportJasperReport 报告中的 Excel 单元格格式
【发布时间】:2010-01-05 00:23:59
【问题描述】:

我正在处理生成 Excel 文件的 JasperReport 报告。出于某种原因,我的单元格格式/类型不是应有的样子。例如,我的单元格中有 Date 对象,但是当我生成 Excel 文件时,它将单元格类型设置为数字,或者长类型是单元格中的文本,但单元格的格式是数字,并且当用户编辑日期单元格时(例如日期 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 模板文件,这正是我需要的。)

【问题讨论】:

    标签: java excel jasper-reports


    【解决方案1】:

    在新版本的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>
    

    关于这个参数的信息是here。使用示例为here

    【讨论】:

      【解决方案2】:

      问题是/是因为我使用的是 POI 3.5 和 JasperReports 3.7.0 并生成 XLSX Excel 格式。 JasperReports 3.7.1 将支持 POI 3.5(或仅从 SVN 获取快照)。所以我所做的只是回到旧的 Excel 类型 (xls) 文件,它运行良好。

      【讨论】:

        【解决方案3】:

        仅供参考

        setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 
        

        IS_DETECT_CELL_TYPE, Boolean.TRUE 是使日期更改为数字的那个。

        【讨论】:

        • 所以你的意思是当这个标志在 excel 中的单元格上时不会正确地将日期类型识别为日期。当它设置为 FALSE 时,数字字段会出错。那么,我怎样才能让这两种类型在 xlsx 中都能正常工作?
        【解决方案4】:

        JasperReports 版本 4.1.1 net.sf.jasperreports.export.xls.pattern 已推出。

        check here

        在属性表达式中

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

        属性值 >> @ 表示文本,yyyy-mm-dd 表示日期格式,#,##0.00;-#,##0.00 表示货币等......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多