Hi~ Summers!!

POI로 Excel파일 만들고 PC에 저장하기 본문

개발/JAVA

POI로 Excel파일 만들고 PC에 저장하기

eNaNII 2006. 12. 14. 17:16

<%@ page contentType="text/html;charset=euc-kr" errorPage="inc/error.jsp" %>
<%@ page import="org.apache.poi.hssf.util.*,org.apache.poi.hssf.usermodel.*,java.io.*,java.util.Date,java.sql.*,outbound.ObBean"%>
<%

String filename = "excelConvert.xls"; //엑셀로출력될 화일이름.. request.getParameter("filename")으로 받아서 사용하면 다른 화일이름으로도 저장이 가능합니다.

ObBean obBean = new ObBean(); //이건 제가사용하던 dbConnection, 한글변환 등의 method들이 있는 빈즈입니다. 이거 빼고 자신이 사용하는 dbConnection을 사용하심됩니다.

String queryStr = "sp_orderList '2002-11-01','2002-11-22','userid' " // queryStr 은 퀴리문으로 단순화하기 위하여 스토어드 프로시져를 사용합니다. (폼값으로 넘겨줘서사용해도 됩니다.이때는 post방식을..)

int rsCnt=1;

HSSFWorkbook wb = new HSSFWorkbook(); //workbook생성
HSSFSheet sheet1 = wb.createSheet("new sheet"); //worksheet에 new sheet생성

HSSFRow row = null;
HSSFCell cell = null;

HSSFCellStyle style = wb.createCellStyle();
style.setFillBackgroundColor(HSSFColor.AQUA.index);
style.setFillForegroundColor(HSSFColor.WHITE.index);
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);

// 스타일 부분으로 alias 제목 부분에 아쿠아색의 빗살무늬를 지정합니다.


Statement stmt= null;
ResultSet rs = null;

stmt = obBean.createStatement();
rs = stmt.executeQuery(queryStr); // 쿼리를 실행합니다.


//컬럼명 찍는 부분
ResultSetMetaData rsmd = rs.getMetaData(); //resultset의 메타데이타를 생성합니다.(컬럼명이나,필드속성등의 정보를 받아올수 있습니다.)
int numberOfColumns = rsmd.getColumnCount(); //컬럼수를 카운드
String[] ColumnsName=new String[numberOfColumns]; //컬럼이름을 담을 변수를 배열로 지정합니다.
int[] ColumnsType = new int[numberOfColumns]; //컬럼의 타잎정보(즉,String , Integer, Decimal등 자료형을 가져옵니다.

row = sheet1.createRow((short)0);

for(int ii=0;ii<numberOfColumns;ii++){
ColumnsName[ii]=rsmd.getColumnName(ii+1);
ColumnsType[ii]=rsmd.getColumnType(ii+1);
cell = row.createCell((short)(ii+1));
cell.setEncoding( HSSFCell.ENCODING_UTF_16 ); // 한글 출력시에는 UTF_16으로 해야함. 한글이 2byte이기때문에..

cell.setCellValue(ColumnsName[ii]); // xls화일의 첫줄에 db의 컬럼명을 출력한다.
cell.setCellStyle(style); //스타일적용(글씨 색,배경색, 정렬, 크기등을 넣을수 있다.)
}

while(rs.next()){ //DB의 내용출력부분
row = sheet1.createRow((short)rsCnt);
for(int i=1;i<=numberOfColumns;i++){
cell = row.createCell((short) i);
cell.setEncoding( HSSFCell.ENCODING_UTF_16 );

switch(ColumnsType[i-1]){
case 93:
cell.setCellValue(rs.getString(i));
break;
case 4:
cell.setCellValue(rs.getInt(i));
break;
case 3:
cell.setCellValue(rs.getFloat(i));
break;

default:
cell.setCellValue(rs.getString(i));
break;
}

// case 93 , case 4... 등은 API의 java.sql.TYPE를 찾아보시면 나와있습니다.
}
rsCnt++;
}


//파일저장("_temp/"에 임시 저장을 합니다. 그리고 아래부분에서 다운받는 즉시 삭제합니다. 중복은 거의 없을 겁니다. 이부분에서 고생을 많이 했는데 더 좋은 방법있는분은 알려주세요.)
FileOutputStream fileOut = null;
try{
fileOut = new FileOutputStream("d:/tomcat4/webapps/root/_temp/"+filename);
}catch(FileNotFoundException e){
System.out.println(e);
}
try{
wb.write(fileOut);
fileOut.close();
}catch(IOException e){
System.out.println(e);
}


%>


<%
//여기부터 화일 다운로드 창이 자동으로 뜨게 하기 위한 코딩(임시화일을 스트림으로 저장)
File file = new File ("d:/tomcat4/webapps/root/_temp/"+filename); //해당 경로의 파일 객체를 만든다.
byte[] bytestream = new byte[(int)file.length()]; //파일 스트림을 저장하기 위한 바이트 배열 생성.
FileInputStream filestream = new FileInputStream(file); //파일 객체를 스트림으로 불러온다.
int i = 0, j = 0; //파일 스트림을 바이트 배열에 넣는다.
while((i = filestream.read()) != -1) {
bytestream[j] = (byte)i;
j++;
}
filestream.close(); //FileInputStream을 닫아줘야 file이 삭제된다.

try{
boolean success = file.delete(); //화일을 생성과 동시에 byte[]배열에 입력후 화일은 삭제
if(!success) System.out.println("<script>alert('not success')</script>");
} catch(IllegalArgumentException e){
System.err.println(e.getMessage());
}

// response.setContentType("application/x-msdownload;charset=EUC-KR"); //응답 헤더의 Content-Type을 세팅한다.
response.setHeader("Content-Disposition","attachment; filename="+filename); //Content-Disposition 헤더에 파일 이름 세팅.

OutputStream outStream = response.getOutputStream(); // 응답 스트림 객체를 생성한다.
outStream.write(bytestream); // 응답 스트림에 파일 바이트 배열을 쓴다.
outStream.close();

%>

Comments