2010-01-05 22 views
6

Sto lavorando su Jasper Report Report che genera file Excel. Per qualche ragione i miei formati/tipi di celle non sono come dovrebbero essere. Ad esempio, ho l'oggetto Date nella mia cella, ma quando genero il file Excel imposta il tipo di cella su Number, oppure Long è testo nella cella ma il formato della cella è numero e anche quando l'utente modifica la data (ad esempio con la data 11/02/2012 modificato a 11/03/2012) converte data in numero (41581,00).Formato celle Excel nel report Jasper Report

Ecco il mio codice (solo in uscita il flusso comparsa alla finestra del browser con la relazione):

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

Ed ecco l'esempio di prime righe del mio diaspro file di report 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> 

(per favore, non mi chiedere perché sto generando file di modello JasperReport al volo, è così che ho bisogno.)

risposta

3

il problema è/era che perché sto utilizzando POI 3.5 e JasperReport s 3.7.0 e generazione del formato XLSX Excel. POI 3.5 sarà supportato in JasperReports 3.7.1 (o semplicemente ottenere snapshot da SVN). Quindi, cosa ho fatto, sono tornato al vecchio file Excel (xls) e ha funzionato perfettamente.

2

Cordiali saluti

setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 

o IS_DETECT_CELL_TYPE, Boolean.TRUE è quello che rende il Data per cambiare il numero.

+1

Quindi quello che stai dicendo è che quando questo flag sulla cella in Excel non riconoscerà correttamente il tipo di data come data. Quando è impostato su FALSE, i campi del numero non funzionano. Quindi, come posso far funzionare entrambi i tipi xlsx? – tropikalista

7

Nella nuova versione del JasperReports il parametro net.sf.jasperreports.export.xls.pattern è stato introdotto.

Il campione:

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

Informazioni su questo parametro è here. Il campione di utilizzo è here.

2

JasperReports versione 4.1.1 net.sf.jasperreports.export.xls.pattern è stato introdotto.

check here

Nelle proprietà espressioni

Proprietà Nome >> net.sf.jasperreports.export.xls.pattern

VALORE >> @ per il testo, aaaa -mm-dd per formato data, #, ## 0.00; - #, ## 0.00 per valuta, ecc ....

Problemi correlati