2012-10-31 77 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); 
       } 
      } 
     } 
    } 
} 
相關問題