#필요한 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;
}