Формат ячеек Excel в отчете JasperReport

Я работаю над отчетом JasperReport, который генерирует файл Excel. По какой-то причине мои форматы/типы ячеек не такие, какими они должны быть. Например у меня есть объект 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;
}

и вот пример первых нескольких строк в моем xml-файле отчета jasper:

<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 на лету, вот как мне это нужно.)

4 ответов


В новой редакции 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. POI 3.5 будет поддерживаться в JasperReports 3.7.1 (или просто получить снимок из SVN). Итак, что я сделал, я просто вернулся к старому файлу типа Excel (xls), и он работал идеально.


просто FYI

setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 

или IS_DETECT_CELL_TYPE, Boolean.TRUE - это тот, который делает дату, чтобы изменить количество .


JasperReports версия 4.1.1 net.научная фантастика.jasperreports.экспорт.формате xls.шаблон.

регистрация здесь

в выражениях свойства

имя свойства >> net.научная фантастика.jasperreports.экспорт.формате xls.шаблон

значение свойства > > @ для текста, гггг-ММ-ДД для формата даты, #,##0.00;-#,##0.00 для валюты и т. д....