자바로 엑셀 다루기(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);
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.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();
XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("회원 정보");
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());
}
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("파일명")