반응형

Apache POI를 이용하여 Excel에 원하는 정보를 담아 다운로드하는 방법에 대해 알아보려고 합니다.

 


 

1. Apache POI 다운로드

 

Apache POI - the Java API for Microsoft Documents

Apache POI - the Java API for Microsoft Documents Project News 17 February 2020 - POI 4.1.2 available The Apache POI team is pleased to announce the release of 4.1.2. This release features better chart support in XDDF, various rendering fixes in the Common

poi.apache.org

 

 

2. Apache POI란?

- Apache POI는 아파치에서 만든 라이브러리입니다.

- 마이크로소프트 오피스 파일 포맷을 자바 언어를 사용하여 읽고 쓸 수 있는 기능을 제공합니다.

 

 

3. 라이브러리 import

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

- 아래 예제에 필요한 것들을 import 했습니다.

 

 

3. Java 예제 코드

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    request.setCharacterEncoding("UTF-8");
    HttpSession session = request.getSession();

    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment; filename=sample.xls");

    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet("Sheet1");

    Map<Integer, Object[]> data = new HashMap<Integer, Object[]>();
    
    data.put(1, new Object[]{
    
            "No.",
            "이름",
            "제출일"
            
    });

    int count;

    try {
        Base.open("java:comp/env/jdbc/mysql");
        
        String id = "1";
        String name = "나나";
        String date = "2020-08-26";
        
        // 데이터베이스 가져오기
        
        count = 2;

        data.put(count, new Object[]{
        
            id
            , name
            , date
            
        });

    } catch (Exception e) {
    
        System.out.print(e);
        
    } finally {
    
        Base.close();
    }

    Set<Integer> keyset = data.keySet();
    int rownum = 0;
    
    for (Integer key : keyset) {
    
        Row row = sheet.createRow(rownum++);
        Object [] objArr = data.get(key);
        int cellnum = 0;
        
        for (Object obj : objArr) {
        
            Cell cell = row.createCell(cellnum++);
            
            if(obj instanceof Date)
                cell.setCellValue((Date)obj);
                
            else if(obj instanceof Boolean)
                cell.setCellValue((Boolean)obj);
                
            else if(obj instanceof String)
                cell.setCellValue((String)obj);
                
            else if(obj instanceof Double)
                cell.setCellValue((Double)obj);
                
        }
        
    }

    try {
    
        workbook.write(response.getOutputStream()); // Write workbook to response.
        workbook.close();

    } catch (FileNotFoundException e) {
    
        e.printStackTrace();
        
    } catch (IOException e) {
    
        e.printStackTrace();
        
    }
    
}

 

- filename은 sample.xls로 설정해두었기 때문에 다운로드를 하게 되면 sample.xls로 다운로드가 됩니다.

- 시트 이름은 Sheet1로 생성했습니다.

 

- Map을 선언해서 입력할 항목들을 넣었습니다.

- 엑셀 첫 번째 줄에 No., 이름, 제출일 세 가지 항목을 넣어보았습니다.

- 두 번째 줄에는 id, name, date 값을 각각 넣었습니다.

 

- 여러 데이터를 출력해야 하는 경우 "데이터베이스 가져오기" 주석 부분에 리스트로 뽑아서 반복문에 data.put을 돌리면 됩니다.

- 현재 제가 만든 예제를 excel 파일로 출력하면 아래와 같이 됩니다.

 

 

4. 출력 예상 모습

 

No. 이름 제출일
1 나나 2020-08-26

 

 

 

이상으로 아파치 POI 라이브러리를 이용하여 Excel 다운로드 기능을 개발해보았습니다.

 


 

반응형