자바 프로그램으로 엑셀이나 워드 문서를 만들기 위해서 보통 POI 라이브러리를 사용한다. 그런데 특정 메소드를 쓰는데 버그가 있길래 이렇게 남겨 둔다. 


환경

poi 3.7 버전


버그 증상

Sheet.shiftRows() 메소드 사용시 Row에 Hyperlink가 포함되어 있어도 해당 정보가 복사되지 않는 문제


임시 해결책

shiftRows 메소드를 사용하기 전에 Hyperlink를 긁어와서 저장한 후 Shift된 위치로 넣어주기


여담

현재 홈페이지에 가보니 3.9버전까지 나오긴 했는데, 라이브러리 버전을 올려주면 다른 곳도 수정할 필요가 생길 수도 있기때문에 그냥 복사 코드만 추가 했다. 

다른 쪽 코드를 보면 라이브러리를 수정하라는데.. 사실 그게 깔끔하긴 한데, 내가 그것까지 손 볼 필요는 없네.


코드

// Copy hyperlink, because it do not support link copy.
Map<Integer, Hyperlink> linkmap = new HashMap<Integer, Hyperlink>();
for (int rr=START_ROW; rr<=sheet.getLastRowNum(); rr++) {
	Row row = sheet.getRow(rr);
	Cell cell = row.getCell(HYPERLINK_COLUMN_INDEX);
	Hyperlink link = cell.getHyperlink();
	if (null != link) {
		linkmap.put(rr, link);
	}
}

// shift row code
sheet.shiftRows(START_ROW, sheet.getLastRowNum(), defectSize);

// Set hyperlink, because it do not support link copy.
for (Integer key : linkmap.keySet()) {
	int rowindex = key + defectSize;
	Row row = sheet.getRow(rowindex);
	Cell cell = row.getCell(HYPERLINK_COLUMN_INDEX);
	Hyperlink link = linkmap.get(key);
	if (null != link) {
		cell.setHyperlink(link);
	}
}

'개발자' 카테고리의 다른 글

SK Planet CodeSprint 2013 대회  (0) 2013.06.30
SQL Query의 기본  (0) 2013.06.21
모델-뷰-컨트롤러(Model-View-Controller MVC)  (2) 2013.05.22
Posted by 빌리 :