2012-10-31 75 views
11

我使用Apache POI将数据导出到.xlsx文件,并且想要对文件中包含的某些行和单元格进行样式设置。Apache POI,创建新单元格覆盖了行样式

我正在使用XSSF,因为文件将在Excel 2007+中读取。

基本上,我的问题是,我试图设置一个行样式,如下例所示,它为索引0处的整个行设置黑色前景色。它工作正常,但每当我创建一个新单元,新创建的单元格没有样式,就好像它重写了我指定的行样式。

这里的代码片段展示我在做什么:

XSSFWorkbook wb = new XSSFWorkbook(); 
XSSFSheet sheet = wb.createSheet("mySheet"); 
XSSFRow row = sheet.createRow(0); 

XSSFCellStyle myStyle = wb.createCellStyle();   

myStyle.setFillForegroundColor(new XSSFColor(new Color(255, 255, 255))); 
myStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 

row.setRowStyle(myStyle); //This works, the whole row is now black 

row.createCell(0); // This cell doesn't have a style, the rest of the line stays stylized 
row.getCell(0).setCellValue("Test"); 

我也试过* row.createCell(0,Cell.CELL_TYPE_STRING); *,但它并没有改变任何东西。

完成我想要做的事情的正确方法是什么?我想这样做,所以在创建它之后,我不必设置每个单元格的样式,因为同一行上的所有单元格都具有相同的样式。

+0

尝试调用_row.createCell()_之前_row.setRowStyle(myStyle的); _ –

+1

呀我已经试过了,顺序似乎没有关系 –

+0

_row.setCellValue(“Test”); _给我一个编译时错误检查! –

回答

10

将样式设置为新创建的单元格以及例如如下:

XSSFCell newCell = row.createCell(0); 
    newCell.setCellStyle(myStyle); 
+8

我知道我可以这样做,正如我在我的问题中提到的,但我真的不知道设置行样式的重点是无论如何我必须手动设置每个单元格的样式。 –

+1

@AdamSmith:我怀疑新创建的单元格是否继承了父类的属性。 –

+0

我想我必须这样做。我认为它的工作方式就像我在Excel中手动执行操作一样(为整行设置颜色,然后将样式放置在单元格中的数据)。感谢您的回答!我想我要问的是不可能的。 –

9

即使你创建一个样式的行,它不会影响其创建的单元格。创建单元格有自己的单元格样式。 row style不会自动覆盖到cell style。如果您想在单元格中使用行样式,则必须重新设置。

即使您在末尾设置了row style,它也不会影响到单元格。

CreationHelper createHelper = wb.getCreationHelper(); 
Sheet sheet = wb.createSheet("new sheet"); 
Row r = sheet.createRow(0); 
r.setRowStyle(rowStyle); 

Cell c1 = r.createCell(0); 
c1.setCellValue("Test 1"); 
c1.setCellStyle(rowStyle); 
+2

那么'setRowStyle'有什么意义呢? –

+0

@ mateus-viccari假设'setRowStyle'与'setDefaultColumnStyle'的工作方式相同:这实际上设置了在工作簿已经被导出之后手动添加的单元格的(默认)样式*(即由人类)。 – Auke

0

我同意 “setRowStyle” 不工作,因为它应该是。

我创建了自己的功能的样式应用到一个范围(可能是排或多排)

public void applyStyleToRange(Sheet sheet, CellStyle style, int rowStart, int colStart, int rowEnd, int colEnd) { 
    for (int r = rowStart; r <= rowEnd; r++) { 
     for (int c = colStart; c <= colEnd; c++) { 
      Row row = sheet.getRow(r); 

      if (row != null) { 
       Cell cell = row.getCell(c); 

       if (cell != null) { 
        cell.setCellStyle(style); 
       } 
      } 
     } 
    } 
} 
相关问题