자바(Java)/JAVA 2EE

엑셀 파일 업로드 받아 서블릿으로 엑셀 파일 처리

본클라쓰 2009. 9. 10. 17:13

자바로 엑셀 파일을 핸들링하는 방법은 자바 > 엑셀 파일 핸들링 부분을 참조하시기 바랍니다.



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