땅파기...........No 1.
원래 보여지는 화면과 다르게 엑셀로 받기를 누르면 정보를 DB 에서 가져와서 그 정보를 내려받아야 하기 때문에 처음에는 서블릿 단에서 해야 하겠구나..하고 첫번째 땅파기 시작...
찾아보니 jxl 이라는 Java Excel API 가 있어서 사용해보았다.
소스보기
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
WritableWorkbook saveExcelWork = Workbook.createWorkbook(new File("./"+fromdate+ "_" + todate + ".xls"));
WritableSheet saveSheet = saveExcelWork .createSheet("GoodKeyword", 0);
WritableCellFormat numberFormat = new WritableCellFormat();
WritableCellFormat nameFormat = new WritableCellFormat();
WritableCellFormat dataFormat= new WritableCellFormat();
numberFormat.setAlignment(Alignment.CENTRE); // 셀 가운데 정렬
numberFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 셀 수직
numberFormat.setBorder(Border.ALL, BorderLineStyle.THICK); // 보더와 보더라인스타일 설정
numberFormat.setBackground(Colour.GRAY_25); // 바탕색깔 회색으로 지정
nameFormat.setAlignment(Alignment.CENTRE);
nameFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
nameFormat.setBorder(Border.BOTTOM, BorderLineStyle.HAIR);
nameFormat.setBackground(Colour.GRAY_25);
// 데이터 셀 포멧 구성
dataFormat.setAlignment(Alignment.CENTRE);
dataFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
saveSheet .setColumnView(0, 8); // 쉬트의 번호 컬럼(0번째)의 넓이 설정.setCloumnView(몇번째 컬럼, 넓이)
saveSheet .setColumnView(1, 15); // 쉬트의 이름 컬럼(1번째)의 넓이 설정
saveSheet .setColumnView(2, 20); // 쉬트의 비고 컬럼(2번째)의 넓이 설정
// 라벨을 이용하여 해당 셀에 정보 넣기 시작
Label numberLabel = new Label(0, 0, "키워드", numberFormat); // 라벨(열,행,"문장",포멧)
saveSheet .addCell(numberLabel); // 쉬트의 addCell 메소드를 사용하여 삽입
Label nameLabel = new Label(1, 0, "개수", nameFormat);
saveSheet.addCell(nameLabel); // 쉬트의 addCell 메소드를 사용하여 삽입
Blank blank = new Blank(2, 0, numberFormat); // 빈 셀(열,행,포멧)
sheet.addCell(blank);
int no=1;
for(KeywordInfoSimple keywordinfo:goodKeywordList){
Label keywordLabels=new Label(0,no,keywordinfo.getKeyword(),dataFormat);
saveSheet.addCell(keywordLabels);
Label countLabels=new Label(1,no,""+keywordinfo.getCount()+"",dataFormat);
saveSheet.addCell(countLabels);
no++;
}
// 라벨을 이용하여 해당 셀에 정보 넣기 끝
saveExcelWork .write(); // 준비된 정보를 엑셀 포멧에 맞게 작성
saveExcelWork .close(); // 처리 후 메모리에서 해제 처리
엑셀로 저장이 된다.. 하지만 문제는? 저장하기 창이 나오지 않고 정한 위치에 그대로 그냥 저장이 되어버린다는 거... 저장하는 위치를 어떻게 정하지라는 생각을 하게 만들었고 그럼 받는 창 또한 만들어야 하나?;; 하다보니 또 다른 문제점 발생..
서버에 올리면.......서버에 파일이 존재한다는 거...나 지금 뭐한거지 라는 생각에 빠져버림...
서버에 올려진 파일을 받을라면 클라이언트? 소켓 별별 생각이 꼬리를 물고 늘어졌다...이건 아닌거 같은데 하고 과감하게 접기..
땅파기...........No 2.
자바 스크립트에서 하는 방식이 있을 텐데 하는 생각에 검색해보니 역시나 존재...자..이제 두번째 삽질의 시작...
첫번 째보다는 간단해진 방식이지만 미리 버튼을 눌렀을 때 그 데이터가 html 상에 뿌려져있어야 한다. 따라서 파일을 뿌려주는 부분 을 새창으로 띄어서 거기서 데이터가 보인 후 내려받기 버튼을 통해 받을 수 있도록 생각해보았다.
소스보기
function saveExcel(targetId,SaveFileName){
if(document.all)
{
if(!document.all.excelExportFrame)
{
var excelFrame=document.createElement("iframe");
excelFrame.id="excelExportFrame";
excelFrame.position="absolute";
excelFrame.style.zIndex=-1;
excelFrame.style.top="-10px";
excelFrame.style.left="-10px";
excelFrame.style.height="0px";
excelFrame.style.width="0px";
document.body.appendChild(excelFrame);
}
var frmTarget = document.all.excelExportFrame.contentWindow.document;frmTarget.open("application/vnd.ms-excel","replace");
frmTarget.write('<html>');
frmTarget.write('<meta http-equiv=\"Content-Type\" content=\"application/vnd.ms-excel; charset=euc-kr\">\r\n');
frmTarget.write('<body>');
frmTarget.write(document.getElementById(targetId).outerHTML);
frmTarget.write('</body>');
frmTarget.write('</html>');
frmTarget.close();frmTarget.charset="euc-kr";
frmTarget.focus();if(!SaveFileName)
{
SaveFileName='KeywordInfo.xls';
}
frmTarget.execCommand('SaveAs','false',SaveFileName);
}
else
{
alert('Only IE Possible...');
}
}
실행해보니 잘되었다. 이제 끝났나 했지만..문제는 약간 있었음..IE 에서만 돌아간다는...그렇지만 일단 되니까 라고 생각해지만..
IE 7.0 에서도 안되었다. .execCommand('SaveAs' ~~ ) 이부분이 7.0에서는 다운로드 창을 못 띄우는 것...처음에 테스트 해본 노트북은 비스타였으니....이렇게 브라우져에 영향 받으면 안되는데..하면서 다른 방법 을 모색 함...
땅파기...........No 3.
제일 간단하고 쉬운 방법...
response 에 excel 로 받겠다고 정보를 끼워넣으면 html 에서 열었을 때 자동으로 내려받기로 뜨게 된다.
왜 처음부터 이렇게 생각 안했을까! 이런 방식이 있다고 알고 있긴 했지만 처음 생각은 html 에서 뿌려주지 않고 서블릿 단에서 바로 받기를 원했기 때문이었다.... 정말 길게 돌아와버렸다...
response.setHeader("Content-Disposition", "attachment; filename="+fileName);생각 좀 하고 짜보자..서버로 받으면 어쩌겠다는 건지..그리고 먼저 사용가능한 환경부터 생각해보고 구현해보자..
response.setHeader("Content-Description", "JSP Generated Data");
* IE 5.5 에서는..아래와 같이 써야 한다고 한다.
response.setHeader("Content-Disposition", "inline; filename=myfile.xls");
response.setHeader("Content-Description", "JSP Generated Data");
삽질 좀 그만 해보자..