2010-01-05 4 views
6

Tôi đang làm việc trên Báo cáo JasperReport tạo tệp Excel. Đối với một số lý do định dạng/loại ô của tôi không phải là cách chúng nên. Ví dụ tôi có đối tượng Date trong ô của mình nhưng khi tạo tệp Excel, nó đặt loại ô thành Số hoặc Loại dài là văn bản trong ô nhưng định dạng của ô là số và cũng khi người dùng chỉnh sửa ô ngày (ví dụ: ngày 11/02/2012 thay đổi thành 11/03/2012) nó chuyển đổi ngày thành số (41581.00).Định dạng ô Excel trong Báo cáo JasperReport

Đây là mã của tôi (nó chỉ xuất ra dòng popup để cửa sổ trình duyệt với báo cáo):

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

Và đây là ví dụ về vài dòng đầu tiên trong jasper tập tin báo cáo xml của tôi:

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

(Xin đừng hỏi tôi tại sao tôi là tạo ra jasperreport mẫu tập tin một cách nhanh chóng, đó là cách tôi cần nó.)

Trả lời

3

vấn đề là/được điều đó bởi vì tôi đang sử dụng POI 3.5 và jasperReport s 3.7.0 và Tạo định dạng XLSX Excel. POI 3.5 sẽ được hỗ trợ trong JasperReports 3.7.1 (hoặc chỉ nhận được ảnh chụp từ SVN). Vì vậy, những gì tôi đã làm tôi chỉ cần quay trở lại tập tin Excel cũ (xls) và nó làm việc hoàn hảo.

2

Just FYI

setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 

hoặc IS_DETECT_CELL_TYPE, Boolean.TRUE là một mà làm cho ngày để thay đổi số.

+1

Vì vậy, những gì bạn đang nói là khi cờ này ở trên ô trong excel sẽ không nhận dạng đúng loại ngày tháng. Khi điều này được đặt thành trường số FALSE bị sai. Vì vậy, làm thế nào tôi có thể làm cho cả hai loại hoạt động tốt i xlsx? – tropikalista

7

Trong phiên bản mới của JasperReports tham số net.sf.jasperreports.export.xls.pattern đã được giới thiệu.

Mẫu:

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

Thông tin về tham số này là here. Mẫu sử dụng là here.

2

JasperReports phiên bản 4.1.1 net.sf.jasperreports.export.xls.pattern đã được giới thiệu.

check here

Trong thuộc tính biểu thức

thuộc tính tên >> net.sf.jasperreports.export.xls.pattern

tính giá >> @ cho văn bản, yyyy -mm-dd cho định dạng ngày, #, ## 0.00; - #, ## 0.00 đối với đơn vị tiền tệ, v.v.