2012-10-31 2 views
11

아파치 POI를 사용하여 .xlsx 파일로 데이터를 내보내고 파일에 포함 된 일부 행과 셀의 스타일을 지정하고 싶습니다.아파치 POI, 새로운 셀을 만들면 행 스타일이 무시됩니다.

Excel 2007 이상에서 파일을 읽을 예정이므로 XSSF를 사용하고 있습니다.

기본적으로 내 문제는 인덱스 0의 전체 행에 검은 색 전경색을 설정하는 다음 예제와 같은 행 스타일을 설정하려고한다는 것입니다. 정상적으로 작동하지만 새 셀을 만들 때마다 새로 작성된 셀에는 지정된 행 스타일을 무시하는 것처럼 스타일이 없습니다.

는 여기에 내가 뭘하는지 입증하는 코드이다 : 나는 또한 * row.createCell (0, Cell.CELL_TYPE_STRING) 시도

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

*을하지만, 아무것도 변경하지 않았다.

내가하고 싶은 일을 올바르게 수행하는 방법은 무엇입니까? 이 방법으로하고 싶었 기 때문에 동일한 행의 모든 ​​셀이 같은 스타일을 가지고 있기 때문에 각 셀의 스타일을 설정 한 후에 설정할 필요가 없었습니다.

+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 stylecell 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); 
       } 
      } 
     } 
    } 
} 
관련 문제