Back End/Java

poi(excel 라이브러리), iText(pdf 라이브러리)

DevHam94 2023. 7. 27. 11:19

엑셀api - poi

pdf api - iText

 

엑셀은 sheet안에 row와 col으로 이루어져있다. 반복문을 사용해야하고 이중for문을 이용해야한다. 1차for문은 row를 핸들링하고 2차 for문은 col을 핸들링 해준다. 

 

poi를 통해 excel파일을 읽는 순서.

Start Point -> Open Excel File -> Read the First Sheet -> For each Row in Sheet -> For each Cell in Row -> Print Cell Value -> End Point

 

excel에서는 다양한 타입의 데이터가 들어가있는데 가져올때 sheet에서 row안에 cell에 cell.getCellType()을 통해 해당하는 셀타입을 골라내서 case문으로 각각 처리할 수 있다. 

for(Row row : sheet) {
	for(Cell cell : row){
    	switch (cell.getCellType()) {
        	case NUMERIC:
            	if(DateUtil.isCellDateFormatted(cell)) {	// 날짜포맷인지 확인한다.
                	Date dateValue = cell.getDateCellValue(); // 날짜타입을 가져오는 메서드
                    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 날짜의 포맷을 지정
                    // 날짜포맷을 집어넣어주면 위에서 지정한 포맷대로 나온다.
                    String formattedDate = dateFormat.format(dateValue); 
                    System.out.println(formattedDate + "\t");
                } else {
                	// 날짜타입이 아니면 실수형 데이터에 넣어준다.
                	double numericValue = cell.getNumericCellValue(); 
                    if (numericValue == Math.floor(numericValue)) { // 소숫자리수가 없는지 비교
                    	int intValue = (int) numericValue;	//없으면 정수형 데이터로 만들어준다.
                        System.out.print(intValue + "\t");
                    } else {
                    	System.out.print(numericValue + "\t");
                    }
                }
                break;
            case STRING:
            	String stringValue = cell.getStringCellValue();
                System.out.print(stringValue + "\t");
                break;
            case BOOLEAN:
            	boolean booleanValue = cell.getBooleanCellValue();
                System.out.print(booleanValue + "\t");
                break;
            case FORMULA:
            	String formulaValue = cell.getCellFormula();
                System.out.print(formulaValue + "\t");
                break;
            case BLANK:
            	System.out.print("\t");
                break;
            default:
            	System.out.print("\t");
                break;
        }
    }
}

NUMERIC 숫자형식

FORMULA 수식같은타입

BLANK 아무것도 아닐때 

다 아닐때는 default로 간다. 

 

엑셀에 업로드하는 방법은 

메모리에 가상의 엑셀을 만들고 데이터를 적는다. 이 엑셀을 outputStream을 통해 엑셀에 적어주는거다. 


try{
	XSSFWorkBook workbook = new XSSFWorkBook();
    Sheet sheet = workbook.createSheet("회원 정보");
    
    // 헤더 생성
    Row headerRow = sheet.createRow(0);
    headerRow.createCell(0).setCellValue("이름");
    headerRow.createCell(0).setCellValue("나이");
    headerRow.createCell(0).setCellValue("생년월일");
    headerRow.createCell(0).setCellValue("전화번호");
    headerRow.createCell(0).setCellValue("주소");
    headerRow.createCell(0).setCellValue("결혼여부");
    
    //데이터 생성
    for (int i = 0; i < members.size(); i++) {
    	MemberVO member = members.get(i);
        Row row = sheet.createRow(i + 1);
        row.createCell(0).setCellValue(member.getName());
        row.createCell(0).setCellValue(member.getAge());
        row.createCell(0).setCellValue(member.getBirthdate());
        row.createCell(0).setCellValue(member.getPhone());
        row.createCell(0).setCellValue(member.getAddress());
        Cell marriedCell = row.createCell(5);
        marriedCell.setCellValue(member.isMarried());
  	}
    // 엑셀 파일 저장
    String filename = "members.xlsx";
    FileOutputStream outputStream = new FileOutputStream(new File(filename));
    workbook.write(outputStream);
    workbook.close();
    System.out.println("엑셀 파일이 저장되었습니다." + filename);
    
    }
} catch (IOException e) {
	System.out.println("엑셀 파일 저장 중 오류가 발생했습니다.");
    e.printStackTrace();
}

XSSFWorkbook이라는 가상의 엑셀파일을 만든다. sheet안에 row을 생성하여 그 로우안의 셀에 데이터를 하나씩 넣어주면 된다. 

 

# iText

pdf를 이용하는 라이브러리이다. 

순서 코드 설명
1 PdfWriter writer = new PdfWriter(new FileOutputStream("book_information.pdf")); PdfWriter 객체를 생성하여 PDF 파일을 출력하기 위한 스트림을 지칭한다.
2 PdfDocument pdf = new PdfDocument(writer); PdfWriter 객체를 사용하여 PdfDocument 객체를 생성한다.
3 Document document = new Document(pdf); PdfDocument 객체를 사용하여 Document 객체를 생성한다.
4 폰트 생성 및 추가 PdfFontFactory 클래스의 createFont() 메서드를 사용하여 폰트를 생성하고, Document 객체의 setFont() 메서드를 사용하여 폰트를 설정한다.
5 책 정보를 문단으로 생성하여 Document에 추가 책 정보를 HashMap 객체에 저장하고. HashMap의 keySet() 메서드를 사용하여 모든 키를 순회하며 키와 값을 이용하여 문단을 생성한다.
6 document.close(); Document 객체를 닫아준다.

Collection framework의 key, value를 사용하는 HashMap을 이용한다. 

Document 객체는 가상의 메모리 공간이다. 

document가 열려있으면 pdf가 안만들어지고 document.close()로 닫히면 데이터가 FileOutputStream에 적은 목적파일에 전달이되어 pdf가 생성이된다. 

 

'Back End > Java' 카테고리의 다른 글

HashMap으로 정보를 이용하기 예제  (0) 2024.02.06
URLConnection 네트워킹 API  (0) 2023.07.27
Jsoup API를 이용한 웹크롤링  (0) 2023.07.27
기타 API들  (0) 2023.07.26
스트림 API(stream)  (0) 2023.07.24