본문 바로가기

카테고리 없음

JAVA PIO EXCEL read and write

반응형

#필요한 jar#

poi-[version].jar

poi-ooxml-[version].jar

poi-excelant-[version].jar

poi-ooxml-schemas-[version].jar

poi-scratchpad-[version].jar

xbean-[version].jar

commons-collections[version].jar 

#필요한 jar 중 하나라도 없으면 문제가 발생하더군요.




#code#


/*

설명 : 엑셀을 읽어와 읽어내고, 쓰기

참고 : http://hellogk.tistory.com/14

참고문서 제목 : 자바 POI를 이용한 엑셀(xls,xlsx)에 들어있는 데이터들 읽어오기


 */

package excel;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.logging.Level;

import java.util.logging.Logger;

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

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

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

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

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

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

public class Excel {

    private Workbook exc; //엑셀파일

    private ArrayList<tmp> value;

    public Excel(String path) {

        value = new ArrayList<>();

        try {

            if (path.contains(".xlsx"))//엑셀파일이 2007버전 이상일 경우 .xlsx 확장자를 갖습니다

            {

                exc = new XSSFWorkbook(new FileInputStream(new File(path))); //2007년 이상일 경우 XSSF워크북 사용

            } else {

                exc = new HSSFWorkbook(new FileInputStream(new File(path)));//미만 버전일경우 HSSF워크북 사용

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }//Excel

    public void read() {//엑셀파일을 읽어  StringBuilder로 반환

        //Sheet, Row, Cell도 버전별로 다르지만 부모객체를 이용해서 상관없이 사용할 수 있도록 함

        Sheet sheet = exc.getSheetAt(0); //첫번째 시트불러옵니다. 시트가 여러개일 경우 반복문으로 돌립니다.

        Row row; //엑셀에서는 row가 행을 담당합니다.

        /*

        //이 부분은 셀도 반복문을 쓸 경우 어떻게 셀의 값을 연속적으로 받아오나의 부분입니다.

        Cell cell;//행,열에 대한 좌표의 셀을 불러옵니다.(열의 역할) 

        StringBuilder value=new StringBuilder();//받아온 데이터들을 여기에 저장합니다.

        for(int r=0;r<sheet.getPhysicalNumberOfRows();r++){//행을 순차적으로 접근합니다.

            row=sheet.getRow(r);//행의 정보를 받아옵니다.

            

            

            if(null == row) continue;//행이 비어있다면 넘어갑니다.

            

            for(int c = 0 ; c < row.getPhysicalNumberOfCells(); c++){ //열을 순차적으로 접근합니다.

                cell=row.getCell(c);//행,열에 대해 셀을 받아옵니다.

                if(cell == null) continue;

                

              value.append(cell.toString()).append("\t");//데이터를 문자열로 저장합니다.

            

            }//for - c

            value.append("\n");

        }//for - r

         */

        //이 부분은 아래의 클래스를 통해 어떻게 저장할 것이냐는 부분입니다.

        //전제는 "테이블의 이름과 데이터타입을 다 알고있다"는 가정 하 입니다.

        tmp TMP;

        for (int r = 1; r < sheet.getPhysicalNumberOfRows(); r++) {//0번 행이 테이블의 이름인 것으로 가정하고 1번 행 부터 탐색합니다.

            row = sheet.getRow(r);//행의 정보를 받아옵니다.

            if (null == row) {

                continue;//행이 비어있다면 넘어갑니다.

            }

            TMP = new tmp();

            //반복문을 통해 불러오지 않으므로 굳이 Cell 변수를 이용할 필요가 없다 판단했습니다.

            TMP.name = row.getCell(0).toString();//어떤 타입의 값이든 해당 방법을    사용하면 문자열로 반환됩니다.

            TMP.age = new Double(row.getCell(1).getNumericCellValue()).intValue(); //기본이 double형 반환이라 int형으로 바꿉니다.

            TMP.weight = row.getCell(2).getNumericCellValue();

            TMP.sex = row.getCell(3).toString().charAt(0);

            value.add(TMP);

            TMP = null;

        }//for - r

    }//read()

    public void write() {

        Workbook wrt = new XSSFWorkbook(); //읽은 데이터를 복사하여 엑셀을 생성할 것 입니다.

        Sheet sheet = wrt.createSheet();//읽을 때와 달리 생성합니다. 

        Row row;

        row = sheet.createRow(0); //열이 없으므로 생성합니다.

        row.createCell(0).setCellValue("이름");

        row.createCell(1).setCellValue("나이");

        row.createCell(2).setCellValue("무게");

        row.createCell(3).setCellValue("성별");

        for (int i = 1; i <= value.size(); i++) {

            row = sheet.createRow(i);

            row.createCell(0).setCellValue(value.get(i - 1).name);

            row.createCell(1).setCellValue(value.get(i - 1).age);

            row.createCell(2).setCellValue(value.get(i - 1).weight);

            row.createCell(3).setCellValue(value.get(i - 1).sex);

        }

        try {

            wrt.write(new FileOutputStream("D:\\테스트2.xlsx"));

            wrt.close();

        } catch (IOException e) {

        }

    }

    public void out() {

        System.out.println("이름\t나이\t무게\t성별");

        for (int i = 0; i < value.size(); i++) {

            System.out.println(value.get(i).name + "\t" + value.get(i).age + "\t" + value.get(i).weight + "\t" + value.get(i).sex);

        }

    }

}

class tmp {//임시로 만든 엑셀 값을 저장하기 위한 클래스입니다. 열의 제목은 변수명으로 했습니다.

    //이해를 돕기 위해 변수를 엑셀의 순서와 맞춰서 선언했습니다.

    protected String name;

    protected int age;

    protected double weight;

    protected char sex;

}

반응형