본문 바로가기

JAVA

POI - 셀병합과 병합된 셀의 스타일( border)

셀에서의 개행문자 사용하기
HSSFWorkbook wbwb = new HSSFWorkbook();
HSSFSheet s = wb.createSheet();
HSSFRow r = null;
HSSFCell c = null;
HSSFCellStyle cs = wb.createCellStyle();
HSSFFont f = wb.createFont();wb.createFont();
HSSFFont f2 = wb.createFont();

cs == wb.createCellStyle();

cs.setFont( f2 );
//Word WrapWrap MUST be turned on
cs.setWrapText( true );

r = s.createRow( (short) 2 );
r.setHeight( (short)(short) 0x349 );
c = r.createCell( (short) 2 );
c.setCellType( HSSFCell.CELL_TYPE_STRING ); //개행 문자 적용
c.setCellValue( "Use \n with wordword wrap on to create a new line" );
c.setCellStyle(c.setCellStyle( cs );
s.setColumnWidth( (short) 2, (short) ( ( 5050 * 8 ) / ( (double) 1 / 20 ) )) );

FileOutputStream fileOut = new FileOutputStream( "workbook.xls" ););
wb.write( fileOut );
fileOut.close();

==================================================================================
==================================================================================

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");

HSSFRow row = sheet.createRow((short) 1);
HSSFCell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of merging");

sheet.addMergedRegion(new Region(1,(short)1,1,(short)2)); //가로병합

sheet.addMergedRegion(new Region(0,(short)0,1,(short)0)); //세로병합
여기서 Region 메소드는? 아래 참조

Region(int rowFrom, short colFrom, int rowTo, short colTo); //셀 병합 
http://poi.apache.org/apidocs/index.html

드뎌 병합 성공 (병합은 쉬운데.. 병합시 선문제 해결)

참고 : http://cafe.naver.com/btbj.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=688
참고 : http://blog.naver.com/titan79th?Redirect=Log&logNo=140037817512 <++여기 답있는데도 못본건 뭐지?

아래와 같이 만들었다..ㅠ.ㅠ

for(int i=0; i<13; i++)
{
cell = row.createCell((short)i);
cell.setCellStyle(styleCenter);
cell.setCellValue(sel_year+"년 월별 "+group_name+"의 정기점검 현황");
}
sheet.addMergedRegion(new Region(0,(short)0, 0,(short)12)); //가로병합
특징이 셀을 일일이 만들고 난 후 병합을 하면 테두리 문제가 해결 된다.
이것때문에.. 4시간동안 고생한거 생각하면 눈물이 나는군..ㅋㅋ 생각의 전환이 중요함

==================================================================================
==================================================================================

그리고 엑셀 파일명 만들 때 대박인게 있음.. 공백 때문에 개고생 했는데 열심히 구글링 한 결과!! 두둥~

아래와 같이 "서버 현황_날짜" 이라고 쓰면 파일 저장 시 "서버+현황_날짜"로 나오는데

인코딩 후 replace("+","%20"); 식으로 변경 하면 된다..ㅠㅠ

소스 공개~~ㅋㅋ

String fileN="서버 현황_";

fileN=java.net.URLEncoder.encode(fileN,"UTF-8");
fileN=fileN.replace("+","%20"); //여백 설정

response.setContentType("application/msexcel");
response.setHeader("Content-disposition","inline; filename="+fileN+ today+ ".xls");

==================================================================================
==================================================================================

셀 크기 조정 (참고로 자동으로하는거 찾음) ㅠ.ㅠ

for (int i=0;i<temp;i++) //autuSizeColumn after setColumnWidth setting!!
{
sheet.autoSizeColumn(i);
sheet.setColumnWidth(i, (sheet.getColumnWidth(i))+512 ); //이건 자동으로 조절 하면 너무 딱딱해 보여서 자동조정한 사이즈에 (short)512를 추가해 주니 한결 보기 나아졌다.
}

셀 높이 조정

row.setHeight((short)512);

폰트 조정 및 셀 색 추가

HSSFCellStyle styleCenter = wb.createCellStyle();
styleCenter.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleCenter.setBottomBorderColor(HSSFColor.BLACK.index);
styleCenter.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleCenter.setLeftBorderColor(HSSFColor.BLACK.index);
styleCenter.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleCenter.setRightBorderColor(HSSFColor.BLACK.index);
styleCenter.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleCenter.setTopBorderColor(HSSFColor.BLACK.index);
styleCenter.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
styleCenter.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

HSSFFont font = wb.createFont(); //폰트 객체 생성

font.setFontHeightInPoints((short)10); //폰트 크기
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //폰트 굵게

//셀 색 추가~

styleCenter.setFillBackgroundColor(HSSFColor.WHITE.index);
styleCenter.setFillForegroundColor(HSSFColor.BLUE_GREY.index);
styleCenter.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

styleCenter.setFont(font); //폰트 스타일 적용

cell.setCellStyle(styleCenterTitle1);
cell.setCellValue(값값값~~~);

 

POI를 사용하여 엑셀의 셀을 처리하던 중 셀의 병합을 하였다.

일반적으로 그 row의 1번째 셀의 데이터가 병합된 셀의 데이터가 된다.

따라서 그 1번째 셀의 폰트 스타일등이 적용되지만

border ( 테두리 )의 경우 병합된 셀이 1번째 셀의 스타일을 상속 받는게 아니다

따라서

병합될 셀이라 할지라도

스타일을 주고 나서 그 후에 병합을 하면 의도하던 대로 병합되 셀의 border가 처리된다.

--- 병합된 셀의 border 처리에 대한 생각을 하다 검색의 결과가 만족 스럽지 못해 내린 결론 ----

HSSFCell[] cell_end = new HSSFCell[13];
for(int cell_index =0; cell_index < 13; cell_index++){
cell_end[cell_index] = row[eLine-1].createCell((short)cell_index);
cell_end[cell_index].setCellStyle(cellStyle);
cell_end[cell_index].setCellStyle(cellStyle); //이처럼 병함될 row의 cell에 스타일을 주고 나서 ----- 1
}

cell_end[0].setEncoding(HSSFCell.ENCODING_UTF_16);
cell_end[0].setCellValue("주) 당직자 변경시에는 사전에 명령권자(팀장) 승인을 득하여야 함");
sheet.addMergedRegion(new Region(eLine-1,(short)0,eLine -1,(short)12)); // 병합한다. ------- 2