2012-10-31 16 views
11

Używam Apache POI do eksportowania danych do pliku .xlsx i chcę nadać styl niektórym wierszom i komórkom zawartym w pliku.Apache POI, tworzenie nowych komórek zastępuje styl wiersza

Używam XSSF, ponieważ plik będzie czytany w programie Excel 2007+.

Zasadniczo mój problem polega na tym, że próbuję ustawić styl wiersza, jak w poniższym przykładzie, który ustawia czarny kolor pierwszego planu dla całego wiersza na indeksie 0. Działa dobrze, ale gdy tylko utworzę nową komórkę , nowo utworzona komórka nie ma stylu, tak jak nadpisuje określony styl wiersza.

Oto fragment kodu, aby wykazać, co robię:

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"); 

Próbowałem też * row.createCell (0, Cell.CELL_TYPE_STRING) *, ale to niczego nie zmienia.

Jaki jest prawidłowy sposób realizacji tego, co chcę zrobić? Chciałem to zrobić w ten sposób, więc nie musiałem ustawiać stylu każdej komórki po jej utworzeniu, ponieważ wszystkie komórki w tym samym wierszu mają ten sam styl.

+0

spróbować nazywając _row.createCell() _ przed _row.setRowStyle (myStyle); _ –

+1

Tak Próbowałem już tego i kolejność nie ma znaczenia, wydaje się –

+0

_row.setCellValue ("Test"); _ daje mi kontrolę błędów w czasie kompilacji! –

Odpowiedz

10

Ustaw styl również na nowo utworzoną komórkę. poniżej:

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

Wiem, że mogę to zrobić, jak wspomniałem w moim pytaniu, ale tak naprawdę nie widzę, jaki jest sens ustawienia stylu wiersza gdybym i tak musiał ręcznie ustawić styl każdej komórki. –

+1

@AdamSmith: Wątpię, czy nowo utworzona komórka dziedziczy właściwości od rodzica. –

+0

Chyba będę musiał to zrobić w ten sposób. Myślałem, że to działa tak, jak robię to ręcznie w Excelu (ustaw kolor dla całego wiersza, a kiedy umieszczasz dane w komórce, styl pozostaje). Dzięki za odpowiedź! Chyba to, o co pytam, po prostu nie jest możliwe. –

9

Nawet jeśli utworzysz wiersz ze stylem, nie wpłynie to na utworzoną komórkę. Komórka tworzenia ma własny styl komórki. Urządzenie row style nie zastąpi automatycznie cell style. Jeśli chcesz użyć stylu wiersza w komórce, musisz ustawić ponownie.

Nawet jeśli ustawisz na końcu row style, nie wpłynie to na komórkę.

Przykład

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

Po co zatem 'setRowStyle'? –

+0

@ mateus-viccari Zakładając, że 'setRowStyle' działa tak samo, jak' setDefaultColumnStyle': To faktycznie ustawia styl (domyślny) dla komórek, które są dodawane ręcznie * po wyeksportowaniu skoroszytu już * (to jest przez człowieka). – Auke

0

jestem zgodzić się, że "setRowStyle" nie działa tak, jak powinno być.

tworzę własną funkcję zastosować styl do zakresu (może być wiersz lub wielokrotność wiersz)

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); 
       } 
      } 
     } 
    } 
} 
Powiązane problemy