2010-01-05 100 views
6

我正在開發用於生成Excel文件的JasperReport報表。出於某種原因,我的單元格格式/類型不是他們應該的樣子。例如我在我的單元格中有Date對象,但是當我生成Excel文件時,它將單元格類型設置爲Number,或者Long類型是單元格中的文本,但單元格的格式是數字,當用戶編輯日期單元格時(例如使用日期11/02/2012年更改爲11/03/2012)將日期轉換爲編號(41581.00)。JasperReport報告中的Excel單元格格式

這裏是我的代碼(它只是彈出流瀏覽器窗口與報表輸出):

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文件的例子:

<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模板文件,這就是我需要它。)

回答

3

問題是/是因爲我使用POI 3.5和JasperReport的s 3.7.0和生成XLSX Excel格式。在JasperReports 3.7.1中將支持POI 3.5(或僅從SVN獲取快照)。所以我做了什麼,我只是回到舊的Excel類型(xls)文件,它的工作完美。

2

僅供參考

setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE); 

IS_DETECT_CELL_TYPE, Boolean.TRUE就是一個,這使得改變到數日。

+1

所以你在說什麼是當這個標誌位於Excel中的單元格時,將不能正確地將日期類型識別爲日期。當這設置爲FALSE號碼字段出錯時。那麼,我如何使這兩種類型工作正常我xlsx? – tropikalista 2013-02-25 08:59:04

7

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

JasperReports的版本4.1.1 net.sf.jasperreports.export.xls.pattern進行了介紹。

check here

在性能表達式

屬性name >> net.sf.jasperreports.export.xls.pattern

屬性值 >> @文本,YYYY對於日期格式,#,## 0.00; - #,## 0.00爲貨幣,等等......