2013-12-23 24 views
0

我正在开发带扩展符的JSF发生我是moficando excel我生成的默认报告,我只需要在生成的单元格中详细应用样式,我只能对样式头进行样式设置。将方法getPhysicalNumberOfCells应用于使用POI生成的单元格?

private void columnsCustomers() { 
    this.setColumnCustomer(new ArrayList<ValidColumnKey>());   
    this.getColumnCustomer().add(new ValidColumnKey(1, "Codigo", "code")); 
    this.getColumnCustomer().add(new ValidColumnKey(2, "Nombre", "name")); 
    this.getColumnCustomer().add(new ValidColumnKey(3, "Nombre Comercial", "comercialName")); 
    this.getColumnCustomer().add(new ValidColumnKey(4, "Estado", "isActive")); 
} 

public void postProcessXLS(Object document) { 
    HSSFWorkbook wb = (HSSFWorkbook) document; 
    HSSFSheet sheet = wb.getSheetAt(0); 
    //HSSFSheet sheet = wb.createSheet(getCustomer().getName()); 
    HSSFRow header = sheet.getRow(0); 

    HSSFRow rowUser0 = sheet.createRow((short) 0); 

    HSSFCellStyle styleHeader = (HSSFCellStyle) wb.createCellStyle(); 
    styleHeader.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
    HSSFFont fontHeader = (HSSFFont) wb.createFont(); 
    fontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
    fontHeader.setColor(HSSFColor.WHITE.index); 
    styleHeader.setFillForegroundColor(HSSFColor.DARK_BLUE.index);   
    styleHeader.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);   
    styleHeader.setFont(fontHeader); 
    styleHeader.setBorderBottom((short) 1); 
    styleHeader.setBorderLeft((short) 1);   
    styleHeader.setBorderRight((short) 1); 
    styleHeader.setBorderTop((short) 1); 

    HSSFCell indice = rowUser0.createCell((short) 0); 
    indice.setCellValue("N°"); 
    indice.setCellStyle(styleHeader); 

    int nro = 1; 
    for(ValidColumnKey column : this.getColumnCustomer()){ 
     HSSFCell hnro = rowUser0.createCell((short) nro); 
     hnro.setCellValue(column.getDescripcion()); 
     hnro.setCellStyle(styleHeader); 
     nro++;   
    } 

    HSSFCellStyle styleCellWhite = (HSSFCellStyle) wb.createCellStyle(); 
    HSSFFont fontCellWhite = (HSSFFont) wb.createFont(); 
    fontCellWhite.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); 
    styleCellWhite.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
    styleCellWhite.setBorderBottom((short) 1); 
    styleCellWhite.setBorderLeft((short) 1);    
    styleCellWhite.setBorderRight((short) 1); 
    styleCellWhite.setBorderTop((short) 1); 

    for(int i=0; i < header.getPhysicalNumberOfCells();i++) { 
     HSSFCell cell = header.getCell(i);  
     cell.setCellStyle(styleHeader); 
    } 
} 

图片:http://s2.subirimagenes.com/otros/previo/thump_8748813excelpoi.jpg

正如你在图像中看到的只是缺少在具体应用练成边缘的风格,我申请的风格,但显然不起作用,该方法将header.getPhysicalNumberOfCells

有人能指导我,他们非常感激。

+0

我也想念你表示,也想把名称放到Excel电子表格中,想用这个代码做,但我是个例外:HSSFSheet sheet = wb.createSheet(“Customer”); – user3123910

+0

你想做什么? header.getPhysicalNumberOfCells循环遍历头部的每个单元格(在Excel中第一行),并强制样式'styleHeader'到每个单元格。这不是必需的,因为您在创建标题单元格时已经这样做了。你也不用styleCellWhite。请澄清。 –

回答

1

对于您的图纸问题:在此步骤中,PF已经创建了工作簿和图纸。你可能想简单地(重新)命名表:

wb.setSheetName(0, getCustomer().getName()); 

您的其他问题(不清楚所有在这一刻),我想你想格式化的数据值,使用你的风格styleCellWhite。这里是一个办法做到这一点:

//iterates lines, then iterate each column giving style to each cell 
for (int r=1; r<sheet.getLastRowNum(); r++) { 
    HSSFRow row = sheet.getRow(r); 
    for (int i=0; i<row.getPhysicalNumberOfCells(); i++) { 
     row.getCell(i).setCellStyle(styleCellWhite); 
    } 
} 

另一句话

你是一个在后处理方法。这意味着文档,工作表和单元格已经被创建和填充。你不应该创建行或单元格,而只是在这里修改它们(获取它们并给出样式,修正值或标题)。

0

感谢您的帮助,当然不是你评我生成行和列的动态表格形式:

<p:dataTable id="listCust" var="cust" value="#{mantClienteMB.customers}" rows="5" 
    rowIndexVar="rowIndex" paginatorPosition="top" resizableColumns="true" emptyMessage=""> 

    <p:column headerText="N°" width="auto"> 
     <h:outputText value="#{rowIndex+1}" /> 
    </p:column> 
    <c:forEach items="#{mantClienteMB.columnCustomer}" var="colum"> 
     <p:column headerText="#{colum.descripcion}" width="auto">   
      <h:outputText value="#{cust[colum.entidadBean]}" />         
     </p:column> 
    </c:forEach>    
</p:dataTable> 

这意味着你真的有两个列表,我决定无论如何这样的:

public void postProcessXLS(Object document) { 
    HSSFWorkbook wb = (HSSFWorkbook) document; 
    wb.setSheetName(0, this.getCustomer().getClass().getSimpleName()); 
    HSSFSheet sheet = wb.getSheetAt(0); 

    sheet.setColumnWidth(0, 1500); 
    sheet.setColumnWidth(1, 4500); 
    sheet.setColumnWidth(2, 6500); 
    sheet.setColumnWidth(3, 6500); 
    sheet.setColumnWidth(4, 6500);  

    HSSFRow rowUser0 = sheet.createRow((short) 0); 

    HSSFCellStyle styleHeader = (HSSFCellStyle) wb.createCellStyle(); 
    styleHeader.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
    HSSFFont fontHeader = (HSSFFont) wb.createFont(); 
    fontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
    fontHeader.setColor(HSSFColor.WHITE.index); 
    styleHeader.setFillForegroundColor(HSSFColor.DARK_BLUE.index);   
    styleHeader.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);   
    styleHeader.setFont(fontHeader); 
    styleHeader.setBorderBottom((short) 1); 
    styleHeader.setBorderLeft((short) 1);   
    styleHeader.setBorderRight((short) 1); 
    styleHeader.setBorderTop((short) 1); 

    HSSFCell indice = rowUser0.createCell((short) 0); 
    indice.setCellValue("N°"); 
    indice.setCellStyle(styleHeader); 

    int nro = 1; 
    for(ValidColumnKey column : this.getColumnCustomer()){ 
     HSSFCell hnro = rowUser0.createCell((short) nro); 
     hnro.setCellValue(column.getDescripcion()); 
     hnro.setCellStyle(styleHeader); 
     nro++;   
    } 

    HSSFCellStyle styleCellWhite = (HSSFCellStyle) wb.createCellStyle(); 
    HSSFFont fontCellWhite = (HSSFFont) wb.createFont(); 
    fontCellWhite.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); 
    styleCellWhite.setBorderBottom((short) 1); 
    styleCellWhite.setBorderLeft((short) 1);    
    styleCellWhite.setBorderRight((short) 1); 
    styleCellWhite.setBorderTop((short) 1); 

    for (int r=1; r<=this.getCustomers().size(); r++) { 
     HSSFRow row = sheet.getRow(r); 
     for (int i=0; i<row.getPhysicalNumberOfCells(); i++) { 
      row.getCell(i).setCellStyle(styleCellWhite); 
     } 
    } 

} 
相关问题