[Java] poi라이브러리를 사용해서 Excel 파일 읽기쓰기
엑셀파일내용을 분석해야할일이 생겼다.
노가다를 하기에는 도무지엄두가 안나서 프로그램을 짜서 해결하기로 결정.
엑셀파일을 읽을수 있게 지원해주는 라이브러리가 뭐가 있나 구글링을 해봤다.
발견된 녀석은 바로 이녀석 poi
홈페이지는 여기다. http://poi.apache.org/
라이브러리 셋팅은 따로 설명하지 않겠다. ^^;
다음 코드는 엑셀파일을 읽어서 HashMap<Integer, HashMap<Integer,String>> 으로 값을 반환해주는 녀석이다.
겉에 HashMap의 첫번째 값은 Row이고 속에 HashMap은<Column,Value> 이다.
설명은 여기까지 다음은 코드이다.
POIExcelManager.java
import java.util.HashMap;
public interface POIExcelManager {
public HashMap<Integer, HashMap<Integer,String>> GetRowHashMap(String aFileName,int aSheetNumber);
public boolean WriteExcelFile(String aXLSXExcelFilePath, String aSheetName, HashMap<Integer, HashMap<Integer,String>> aHashMap);
}
POIExcelManagerImpl.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class POIExcelManagerImpl implements POIExcelManager{
protected XSSFWorkbook GetXSSFWorkbook(String aFileName){
XSSFWorkbook workbook = null;
try {
FileInputStream file = new FileInputStream(new File(aFileName));
workbook = new XSSFWorkbook(file);
file.close();
} catch (Exception e) {
return null;
}
return workbook;
}
protected XSSFSheet GetXSSFSheet(String aFileName, int aSheetNumber){
XSSFWorkbook workbook = this.GetXSSFWorkbook(aFileName);
XSSFSheet sheet = null;
if (workbook == null) {
return null;
}
try{
sheet = workbook.getSheetAt(aSheetNumber);
}catch(Exception e){
return null;
}
return sheet;
}
public HashMap<Integer, HashMap<Integer,String>> GetRowHashMap(String aFileName,int aSheetNumber){
Iterator<Row> rowIterator = null;
XSSFSheet sheet = this.GetXSSFSheet(aFileName, aSheetNumber);
if(sheet == null){
return null;
}
HashMap<Integer, HashMap<Integer,String>> excelHashMap = new HashMap<>();
HashMap<Integer, String> cellHashMap = new HashMap<>();
rowIterator = sheet.iterator();
while(rowIterator.hasNext()){
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()){
Cell cell = cellIterator.next();
int columnIndex = cell.getColumnIndex();
String strCellValue = "";
switch(cell.getCellType())
{
case Cell.CELL_TYPE_NUMERIC:
strCellValue = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
strCellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_BLANK:
strCellValue = "";
break;
case Cell.CELL_TYPE_BOOLEAN:
strCellValue = String.valueOf( cell.getBooleanCellValue() );
break;
default:
strCellValue = "";
break;
}
cellHashMap.put(columnIndex, strCellValue);
}
excelHashMap.put(excelHashMap.size(), cellHashMap);
cellHashMap = new HashMap<>();
}
if(excelHashMap.size()==0){
return null;
}
return excelHashMap;
}
@Override
public boolean WriteExcelFile(String aXLSXExcelFilePath, String aSheetName, HashMap<Integer, HashMap<Integer,String>> aHashMap) {
if(aHashMap == null || aHashMap.size()==0){
return false;
}
if(aSheetName==null || aSheetName.length()==0){
return false;
}
int dataFormatToken = aXLSXExcelFilePath.indexOf(".");
String strDataFormat = aXLSXExcelFilePath.substring(dataFormatToken + 1, aXLSXExcelFilePath.length());
if(!strDataFormat.equals("xlsx")){
return false;
}
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(aSheetName);
for(int rowIdx=0; rowIdx<aHashMap.size(); rowIdx++){
Row row = sheet.createRow(rowIdx);
HashMap<Integer,String> cellHashMap = aHashMap.get(rowIdx);
Set<Integer> keySet = cellHashMap.keySet();
Iterator<Integer> keyIterator = keySet.iterator();
while(keyIterator.hasNext()){
Integer key = keyIterator.next();
Cell cell = row.createCell(key);
String strCellValue = cellHashMap.get(key);
cell.setCellValue(strCellValue);
}
}
try
{
FileOutputStream out = new FileOutputStream(new File(aXLSXExcelFilePath));
workbook.write(out);
out.close();
System.out.print("Success\n");
}
catch (Exception e)
{
System.out.print("Fail \n");
e.printStackTrace();
return false;
}
return true;
}
}
호출 코드이다.
HashMap<Integer, HashMap<Integer,String>> multilingualDatasheetHashMap = mPoiExcelFileManager.GetRowHashMap(mExcelFilePath /* Excel File Path */,
0 /* Sheet Number */ );
결과화면이다.
결과화면을 보면1798 Row를 다 읽은것을 볼수있다.
poi라이브러리는 xls 와 xlsx 둘다 지원하지만 나는 xlsx만 필요해서 xlsx만 읽게 제작하였다.
만약 xls가 필요하신분이라면 내용을 수정해서 사용하시면 되겠다.
이 코드는 내 입맛대로 만든것이기 때문에 참고용코드이다.
만약 수정이 필요하다면 본인의 입맛대로 바꿔서 수정하시면 되겠다.
누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~