2010-01-05 6 views
6

Je travaille sur le rapport JasperReport qui génère un fichier Excel. Pour une raison quelconque, mes formats/types de cellules ne sont pas ce qu'ils devraient être. Par exemple j'ai l'objet Date dans ma cellule mais quand je génère un fichier Excel il définit le type de cellule à Nombre, ou Type long est du texte dans la cellule mais le format de la cellule est le numéro et aussi quand l'utilisateur édite la cellule/2012 changé en 11/03/2012) il convertit la date en nombre (41581.00).Format de cellule Excel dans le rapport JasperReport

Voici mon code (il produit juste le flux popup dans la fenêtre du navigateur avec le rapport):

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

Et voici l'exemple des premières lignes dans mon rapport jaspe fichier 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> 

(S'il vous plaît ne me demandez pas pourquoi je générer fichier modèle jasperreport à la volée, voilà comment je en ai besoin.)

Répondre

3

le problème est/a été que parce que je utilise 3,5 POI et JasperReport s 3.7.0 et Générer un format Excel XLSX. POI 3.5 sera pris en charge dans JasperReports 3.7.1 (ou juste obtenir un snapshot de SVN). Donc ce que j'ai fait, je suis juste retourné à l'ancien fichier de type Excel (xls) et cela a fonctionné parfaitement.

2

Juste Pour votre information

setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 

ou IS_DETECT_CELL_TYPE, Boolean.TRUE est celui qui fait la date de changement de numéro.

+1

Donc ce que vous dites est que lorsque ce drapeau est sur la cellule dans Excel ne reconnaîtra pas correctement le type de date comme date. Lorsque ce paramètre est défini sur FALSE, les champs numériques ne fonctionnent pas. Alors, comment puis-je faire les deux types fonctionnent bien xlsx? – tropikalista

7

Dans la nouvelle version de JasperReports le paramètre net.sf.jasperreports.export.xls.pattern a été introduit.

L'échantillon:

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

Informations sur ce paramètre est here. L'échantillon d'utilisation est here.

2

JasperReports Version 4.1.1 net.sf.jasperreports.export.xls.pattern a été introduit.

check here

Dans les propriétés des expressions

Propriétés du nom >> net.sf.jasperreports.export.xls.pattern

propriétés >> @ valeur à pour le texte, aaaa -mm-dd pour le format de la date, #, ## 0.00; - #, ## 0.00 pour la devise, etc ....

Questions connexes