brunch

You can make anything
by writing

C.S.Lewis

by 홍기린 Jul 18. 2024

Java로 엑셀파일 저장하기

JAVA 기초 다지기

* JAVA를 공부하면서 정리하고 있는 내용입니다. 잘못된 내용에 대한 피드백은 언제나 환영입니다. :) 



JAVA 스터디를 하면서 간단한 콘솔 애플리케이션을 만들었다. 재무 관리 어플리케이션이고, 콘솔에서 메뉴를 선택하거나 입출금내역을 입력할 수 있다. 객체 지향 프로그래밍과 기본 JAVA의 자료형을 실습해볼 수 있었다. 코드 중에 엑셀파일로 저장하는 기능을 추가했던 내용을 적어본다. 


(드래그할 수 있는 전체 코드는 글 제일 하단에 있습니다.)



1. 라이브러리 설치 (Apache POI 라이브러리)

처음 프로젝트를 만들때 Maven 빌더를 선택했다. 아직 Maven과 Gradle의 차이를 정확히 알진 못하지만 그저 npm과 yarn 정도의 차이라고 인지하고 있다. 어쨌든, Maven에서 라이브러리를 추가할 때는 pom.xml에 적어주면 된다. <dependencies> 안에다가 넣어줘야 되어서 아래와같이 넣어주었다. Apache POI 라이브러리를 추가했다. 버전은 공식홈페이지에서 최신 버전을 확인해서 적어주었다.




gradle에서는 아래와 같이 추가하면 된다고 한다.

implementation 'org.apache.poi:poi-ooxml:5.2.3'





2. 데이터 입력하기

데이터를 저장하는 순서가 있다. 엑셀을 생각해보면 쉽다. 엑셀 파일을 분석해보면 아래와 같은 계층이라고 볼 수 있다. 

"파일" -> "Sheet" -> "Row"와 "Column"들

그래서 제일 먼저 "파일"을 만들어야 한다. 파일을 만들려면, 아래와 같은 코드를 사용한다.

Workbook workbook = new XSSFWorkbook();

Workbook이 하나의 엑셀 파일을 표현한다고 볼 수 있다. XSSFWorkbook은 Excel 2007 이상 버전인 XLSX 형식의 파일을 처리한다.


그 다음엔 Sheet을 만든다. 엑셀 파일 하나의 여러개의 시트가 있는 것처럼, sheet는 여러개를 만들 수 있다. 따옴표 안의 이름은 아무거나 해도 상관 없다. 시트의 이름이다. 

Sheet sheet = workbook.createSheet("Transactions");


이렇게 만들어진 sheet에다가 이제 데이터를 입력하기만 하면 된다. 

한줄씩 (Row) 입력한다고 보면 된다. 그래서 Row를 생성한다. 이렇게 생성하면 "빈 Row"가 생기는 것이다.

Row headerRow = sheet.createRow(0);


빈 Row에 이제 값을 담아야 된다. header 역할을 하는 Row이기 때문에 제목을 넣어준다. 제목을 Date, Type, Category, Amont 이렇게 4개 넣어줬다. 

headerRow.createCell(0).setCellValue("Date");
headerRow.createCell(1).setCellValue("Type");
headerRow.createCell(2).setCellValue("Category");
headerRow.createCell(3).setCellValue("Amount");


이제는 Row들을 Transcation 개수만큼 넣어줘야 한다. for 문으로 transcation의 값들을 넣어준다. 

int rowNum = 1;
for(Transaction transaction : transactions) {
  Row row = sheet.createRow(rowNum++);
  row.createCell(0).setCellValue(transaction.getDate().toString());
  row.createCell(1).setCellValue(transaction.getType().toString());
  row.createCell(2).setCellValue(transaction.getCategory().toString());
  row.createCell(3).setCellValue(transaction.getAmount());
}





3. 파일로 저장 후 다운로드하기

이제 파일로 저장하기만 하면 끝!

try (FileOutputStream outputStream = new FileOutputStream(filePath)) {
  workbook.write(outputStream);
}

- try문: try 블록이 종료될 때 자동으로 리소스를 닫아준다. (여기너 FileOutputStream)

- FileOutputStream: Java의 입출력 클래스 중 하나, 파일에 바이트 단위로 데이터를 쓰는데 사용

- new FileOutputStream(filePath): 지정한 파일경로에 새로운 파일을 생성한다. (파일이 있다면 덮어쓴다.)

workbook.write(outputStream): 앞에서 생성한 객체(XSSFWorkbook 인스턴스)를 outputStream을 통해 파일로 쓴다. 이 메소드 호출을 해야 실제 엑셀파일에 생성된다.





전체 파일





                  


4. 파일 쓰기 권한때문에 발생한 에러

빌드하는데 에러를 만났다. 

파일은 만들어졌지만 파일이 열리지 않았다. 


내가 저장하려는 경로가 읽기 전용 폴더여서 그런건데, 임시로 폴더의 읽기 전용을 해제해줬더니 파일을 저장할 수 있었다. 나중에 실제 실무에서는 그런 폴더 및 사용자 권한도 중요하게 설정해줘야겠다 0_0

매거진의 이전글 CRLF와 LF는 무슨 차이일까?
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari