자바로 엑셀자바

개발세발·2024년 1월 5일

자바로 엑셀 다루기(1)

  • 이렇게 저장되어 있는 엑셀 데이터를 자바에서 불러오는 예제("example.xlsx")
package javaExcelExample;

import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class excelJava {
    public static void main(String[] args) {
        try {
            FileInputStream file = new FileInputStream(new File("example.xlsx"));
            Workbook workbook = WorkbookFactory.create(file);//자바에서 아까 가져온 엑셀 파일을 다루기 위함.
            Sheet sheet = workbook.getSheetAt(0);//첫번째 시트를 불러온다.(getSheetAt)
            //sheet의 각 Row마다
            for (Row row : sheet) {
                //각 row의 각 값들 (column들) 1열 1행, 1열 2행...
                for (Cell cell : row) {
                    //cell의 각 타입을 체크하여 엑셀에 표기된 값과 동일하게 출력하기 위해 getCellType()
                    switch (cell.getCellType()) {
                        //numeric 타입인 경우(숫자 데이터인 경우)
                        case NUMERIC:
                            //날짜 서식의 셀 데이터라면 자바의 date 클래스 객체로 받아서, yyyy-mm-dd 패턴으로 지정해준다.
                            if (DateUtil.isCellDateFormatted(cell)) {
                                Date dateValue = cell.getDateCellValue();
                                DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                                // Date 타입을 String타입으로 변환
                                String formattedDate = dateFormat.format(dateValue);
                                System.out.print(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;
                    }
                }
                System.out.println();
            file.close();
        }
            System.out.println("엑셀에서 데이터 불러오기 성공");

    } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    }
  • 자바에서 엑셀을 다룰 때 외부 라이브러리를 가지고 와야 하는데, 이건 바로 Apache POI
  • 해당 라이브러리의 Workbook을 사용해서 엑셀 파일을 불러온다.
  • Workbook은 가상의 엑셀 테이블, sheet-row(행)-cell(열의 값)으로 판단.
  • SheetAt으로 첫번째(0번)시트 불러오고 각 row에서 cell 값을 하나씩 출력.

remind

  • 파일 불러올 때는 객체를 생성해줘야 한다.
  • 불러오기만 할 때는 InputStream으로 불러온다. 이후 workbook의 WorkbookFactory를 이용하여 Workbook에 올려놓는다.

자바로 엑셀 다루기(2)

  • 자바에서 입력받아서 엑셀 파일로 만드는 예제
package javaExcelExample.excelMember;

public class memberDTO {
    private String name;
    private int age;
    private String birth;
    private String phonenumber;
    private String address;
    private boolean isMarried;

    public memberDTO(String name, int age, String birth, String phonenumber, String address, boolean isMarried) {
        this.name = name;
        this.age = age;
        this.birth = birth;
        this.phonenumber = phonenumber;
        this.address = address;
        this.isMarried = isMarried;
    }

    public memberDTO(){

    }
    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getBirth() {
        return birth;
    }

    public void setBirth(String birth) {
        this.birth = birth;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public boolean isMarried() {
        return isMarried;
    }

    public void setMarried(boolean married) {
        isMarried = married;
    }
    @Override
    public String toString() {
        return "memberDTO{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birth='" + birth + '\'' +
                ", phonenumber='" + phonenumber + '\'' +
                ", address='" + address + '\'' +
                ", isMarried=" + isMarried +
                '}';
    }

}
package javaExcelExample.excelMember;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTRotY;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class excelMemberJava {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        List<memberDTO> members = new ArrayList<>();
        while(true){
            System.out.println("회원 정보를 입력합니다. 종료하려면 quit을 입력하세요");

            System.out.print("이름을 입력하세요: ");
            String name = scanner.nextLine();
            if(name.equals("quit")){
                break;
            }

            System.out.print("나이를 입력하세요: ");
            int age = scanner.nextInt();
            scanner.nextLine();

            System.out.print("생년월일을 입력하세요: ");
            String birth = scanner.nextLine();
            if(birth.equals("quit")){
                break;
            }
            System.out.print("전화번호를 입력하세요: ");
            String phonenumber = scanner.nextLine();
            if(phonenumber.equals("quit")){
                break;
            }
            System.out.print("주소를 입력하세요: ");
            String address = scanner.nextLine();
            if(address.equals("quit")){
                break;
            }
            System.out.print("결혼 여부를 입력하세요(true/false): ");
            boolean isMarried = scanner.nextBoolean();
            scanner.nextLine();

            memberDTO member = new memberDTO(name, age, birth, phonenumber, address, isMarried);
            members.add(member);
        }
        scanner.close();
        // write 가능한 워크북(가상의 엑셀파일)
        XSSFWorkbook workbook = new XSSFWorkbook();
        //sheet 생성
        Sheet sheet = workbook.createSheet("회원 정보");
        //row 생성
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("이름");
        headerRow.createCell(1).setCellValue("나이");
        headerRow.createCell(2).setCellValue("생년월일");
        headerRow.createCell(3).setCellValue("전화번호");
        headerRow.createCell(4).setCellValue("주소");
        headerRow.createCell(5).setCellValue("결혼 여부");
        for(int i=0; i< members.size(); i++){
            memberDTO member = members.get(i);
            Row row = sheet.createRow(i+1);
            row.createCell(0).setCellValue(member.getName());
            row.createCell(1).setCellValue(member.getAge());
            row.createCell(2).setCellValue(member.getBirth());
            row.createCell(3).setCellValue(member.getPhonenumber());
            row.createCell(4).setCellValue(member.getAddress());
            row.createCell(5).setCellValue(member.isMarried());
        }
        //output스트림은 파일이 없으면 만들어준다.
        FileOutputStream outputStream = new FileOutputStream(new File("memberInfo.xlsx"));
        workbook.write(outputStream);
        workbook.close();
        System.out.println("엑셀파일이 저장되었습니다.");
    }
}
  • 첫번째 행을 headerRow로 지정하여서 각 셀이 어떤 데이터를 갖는 지 명시.
  • 이후 row의 각 인덱스에 creatCell을 해서 저장해준다.
  • 먼저 Workbook으로 가상 엑셀 테이블을 만들어서 저장해주고, FileOutpputStream으로 엑셀 파일을 만들어 workbook의 write메소드로 저장해주면 된다.

remind

  • 원하는 형태로 데이터를 저장하기 위해 가변 길이 배열과 클래스 타입을 만들어서 사용한다. List<T> = ArrayList<>();
  • 파일을 수정하거나 새로 만들 때는 FileOutpputStream을 사용한다.
  • 파일을 열려면 언제나 new File("파일명")

0개의 댓글