자바로 엑셀 파일을 핸들링하는 방법은 자바 > 엑셀 파일 핸들링 부분을 참조하시기 바랍니다.
1. 엑셀 파일을 업로드하는 폼 태그(브라우저)
<form action="데이터를 보낼 페이지/서블릿" method="post" enctype="multipart/form-data">
<input size="50" type="file" name="spreadsheet"/><br/>
<input type="submit" value="upload file"/>
</form>
2. 서블릿 작성
import jxl.*;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
try {
ServletInputStream is = request.getInputStream();
byte[] buf = new Byte[1024];
int bytesRead = 0;
bytesRead = is.readLine(buf, 0, buf.length);
Workbook workbook = Workbook.getWorkbook(is);
... 엑셀 파일을 처리할 내용 ...
} catch(JXLException e) {
...
}
}
위는 jxl tutorial를 기준으로 작성했습니다. 하지만 오류가 발생했습니다. request.getIputStream()으로는 Workbook 객체가 요청 데이터가 엑셀 파일 형태인지 인식할 수 없었습니다. 오류를 해결하고자 폼 형식을 정리하는 등 여러가지 방법을 취했지만 해결이 되지 않았습니다.
자카르타 프로젝트 사이트 : http://jakarta.apache.org/ 에서 Ex-Jakarta 에서 Commons 항목에서 선택한 후 Components의 FileUpload와 IO 컨포넌트를 다운로드 받습니다.
그래서 apache의 commons-FileUpload-1.2 API와 commons-io-1.4 API 를 사용하여 작성했습니다.
import="org.apache.commons.fileupload.*"
try {
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax( 1024 * 1024 ); // 최대 1메가까지 업로드 가능
// 한번에 1메가까지는 메모리에 저장 (메모리가 부족하면 에러 발생)
fu.setSizeThreshold( 1024 * 1024);
fu.setRepositoryPath("f:/"); // 최대 사이즈를 벗어나면 지정한 위치에 저장
List fileList = fu.parseRequest(request);
InputStream uploadedFileStream = null;
String uploadedFileName = null;
for ( Iterator i = fileList.iterator(); i.hasNext(); ) {
FileItem fi = (FileItem)i.next();
if(fi.isFormField()) {
String key = fi.getFieldName();
String val = fi.getString();
System.out.println("form parameter " + key + " = " + val);
}else {
if ( fi.getSize() < 1 ) {
throw new Exception("No file was uploard");
}
uploadedFileName = fi.getName();
uploadedFileStream = fi.getInputStream();
//Workbook workbook = Workbook.getWorkbook( new File("f:/Book.xla") );
Workbook workbook = Workbook.getWorkbook( uploadedFileStream );
if ( workbook != null ){
Sheet sheet = workbook.getSheet(0);
out.println("sheet 0번의 Row 수 : " + sheet.getRows() + "<br/>");
out.println("sheet 0번의 column 수 : " + sheet.getColumns() + "<br/><br/>" );
for ( int ii = 0; ii < sheet.getRows(); ii++ ){
for ( int j = 0; j < sheet.getColumns(); j++ ) {
Cell cell = sheet.getCell(j, ii);
out.println( cell.getContents() );
}
out.println("<br/><br/>");
}
}
workbook.close();
}
}
} catch(JXLException e) {
e.printStackTrace();
}
commons-fileupload-1.2 API를 사용할 때 주의 할 점은 commons-io-1.4 API가 반드시 있어야 합니다. io API가 없을 경우 다음과 같은 예외 코드가 출력됩니다.
org.apache.jasper.JasperException : org/apache/commons/io/output/ DeferredFileOutputStream
javax.servlet.servletException
java.lang.NoClassDefFoundError
'자바(Java) > JAVA 2EE' 카테고리의 다른 글
사용자 정보를 유지하기 위한 쿠키와 세션 (0) | 2009.10.09 |
---|---|
웹 어플리케이션의 시스템 경로및 루트 경로 지정하는 방법 (0) | 2009.09.24 |
코어(core) 태그 - URL, 페이지 제어 (0) | 2009.09.09 |
코어(core) 태그 - 흐름제어 (0) | 2009.09.09 |
코어(core) 태그 - 변수 지정과 삭제 (0) | 2009.09.09 |