엑셀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 |