티스토리 뷰

엑셀파일내용을 분석해야할일이 생겼다.

노가다를 하기에는 도무지엄두가 안나서 프로그램을 짜서 해결하기로 결정.

엑셀파일을 읽을수 있게 지원해주는 라이브러리가 뭐가 있나 구글링을 해봤다.

발견된 녀석은 바로 이녀석 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가 필요하신분이라면 내용을 수정해서 사용하시면 되겠다.

이 코드는 내 입맛대로 만든것이기 때문에 참고용코드이다. 

만약 수정이 필요하다면 본인의 입맛대로 바꿔서 수정하시면 되겠다.

누군가에게는 작은도움이 되었기를 바라면서 오늘의 포스팅 끝~

댓글