(Kotlin) Poi를 사용하여 엑셀 데이터 가져오기(1)

이 전 포스팅에서 RecyclerView까지 만들었는데 이어서 만들어보겠습니다.

 

2019/08/04 - [안드로이드 개발/Kotlin으로 어플 만들기] - (Kotlin) RecyclerView 사용하기

 

(Kotlin) RecyclerView 사용하기

1. Layout (search.xml)

hamzzibari.tistory.com

혹시 이전 글을 안 보셨다면 위에 링크로 가서 보고 오시면 더 도움이 됩니다.

 

이번에는 1)엑셀 파일을 불러와서 2)배열에 저장한 후 3)RecyclerView에 뿌려줄 계획입니다.

 

우선, Build.gradle의 dependencies에 아래 코드를 추가해주세요.

dependencies {

    //엑셀파일 읽기 쓰기
    implementation 'org.apache.poi:poi:3.9'

}

1. Kotlin (SearchActivity.kt)

1) onCreate

onCreate 안에 아래 코드를 추가합니다.

//엑셀 불러오기
readExcelFileFromAssets()

이렇게만 넣으면 당연히 빨간줄이 뜨겠죠? ㅎㅎ

해당 코드에 커서를 올려놓고 Alt+Enter를 친 뒤 Create function 'readExcelFileFromAssets'를 선택합니다.

 private fun readExcelFileFromAssets() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

아래쪽에 위와 같은 코드가 생기는 것을 볼 수 있습니다. 

 

이제 readExcelFileFromAssets 안에서 엑셀파일의 데이터를 불러온 뒤 배열에 추가해주는 작업을 할 겁니다.

2) try...catch...

엑셀을 불러오는 과정에서 에러가 발생할 수 있기 때문에 예외처리를 해주겠습니다.

try catch 사용법은 Java와 별 차이가 없어보이네요. 

try {
  val myInput: InputStream
  // assetManager 초기 설정
  val assetManager = assets
  //  엑셀 시트 열기
  myInput = assetManager.open("oxquiz.xls")
  // POI File System 객체 만들기
  val myFileSystem = POIFSFileSystem(myInput)
  //워크 북
  val myWorkBook = HSSFWorkbook(myFileSystem)
  // 워크북에서 시트 가져오기
  val s = myWorkBook.getSheetAt(0)
  
  <<<<<여기에 계속 코드 입력>>>>

} catch (e: Exception) {
  Toast.makeText(this, "에러 발생", Toast.LENGTH_LONG).show()
}

여기서 oxquiz.xls는 assets폴더에 제가 넣어둔 엑셀 파일 명입니다. 

assets폴더 만들기는 아래 링크에서 확인하세요.

2019/08/04 - [안드로이드 개발] - [Android Studio] assets 폴더 만들기

 

[Android Studio] assets 폴더 만들기

Assset 폴더 생성 안드로이드 개발을 하다보면, 엑셀(.xls)파일을 파싱해야 하는 경우가 있습니다. 이런 파일들을 사용하기 위해서는 assets 폴더에 넣어야 하는데, 안드로이드 스튜디오는 기본적으로 assets 폴..

hamzzibari.tistory.com

3) 행, 열 반복문 (while)

엑셀파일에는 수많은 '행과 열'이 있겠죠? 

sheet.getRow()를 통해서 특정 행을 가져올 수 있는데, 우리는 모든 행이 필요합니다.

그렇기 때문에 while문을 통해 반복해서 모든 행을 가져오겠습니다.

 

우선 행을 반복할 변수(rowIter)를 만들고,

행을 카운트할 변수(rowno)도 만들고,

while문을 통해 구한 행의 열을 저장할 Mutablelist(items)도 만듭니다.

//행을 반복할 변수 만들어주기
val rowIter = sheet.rowIterator()
//행 넘버 변수 만들기
var rowno = 0
//MutableList 생성
var items: MutableList<SearchData> = mutableListOf()

<<<<여기에 계속 코드 입력>>>>

이제 행과 열 반복문을 만들어줍니다.

//행 반복문
while (rowIter.hasNext()) {
  val myRow = rowIter.next() as HSSFRow
  if (rowno != 0) {
    //열을 반복할 변수 만들어주기
    val cellIter = myRow.cellIterator()
    //열 넘버 변수 만들기
    var colno = 0
    var fullname = ""
    var quiz = ""
    //열 반복문
      while (cellIter.hasNext()) {
      val myCell = cellIter.next() as HSSFCell
      if (colno === 1) {//2번째 열이라면,
      	fullname = myCell.toString()
      } else if (colno === 2) {//3번째 열이라면,
      	quiz = myCell.toString()
      }
      colno++
    }
    //4,8번째 열을 Mutablelist에 추가
    items.add(SearchData(fullname, quiz))
  }
  rowno++
}
Log.e("checking", " items: " + items);

 이제 items라는 배열이 만들어졌습니다. 

Log를 확인해보면 이렇게 items가 잘 만들어져있는 것을 확인할 수 있습니다. 

 

2.readExcelFileFromAssets의 전체 코드

private fun readExcelFileFromAssets() {
  try {
  val myInput: InputStream
  // assetManager 초기 설정
  val assetManager = assets
  //  엑셀 시트 열기
  myInput = assetManager.open("oxquiz.xls")
  // POI File System 객체 만들기
  val myFileSystem = POIFSFileSystem(myInput)
  //워크 북
  val myWorkBook = HSSFWorkbook(myFileSystem)
  // 워크북에서 시트 가져오기
  val sheet = myWorkBook.getSheetAt(0)

  //행을 반복할 변수 만들어주기
  val rowIter = sheet.rowIterator()
  //행 넘버 변수 만들기
  var rowno = 0
  //MutableList 생성
  var items: MutableList<SearchData> = mutableListOf()

  //행 반복문
  while (rowIter.hasNext()) {
    val myRow = rowIter.next() as HSSFRow
    if (rowno != 0) {
    //열을 반복할 변수 만들어주기
    val cellIter = myRow.cellIterator()
    //열 넘버 변수 만들기
    var colno = 0
    var fullname = ""
    var quiz = ""
    //열 반복문
    while (cellIter.hasNext()) {
      val myCell = cellIter.next() as HSSFCell
      if (colno === 1) {//2번째 열이라면,
      	fullname = myCell.toString()
      } else if (colno === 2) {//3번째 열이라면,
      	quiz = myCell.toString()
    }
    colno++
    }
    //4,8번째 열을 Mutablelist에 추가
    items.add(SearchData(fullname, quiz))
  }
  rowno++
  }
  Log.e("checking", " items: " + items)
  } catch (e: Exception) {
  	Toast.makeText(this, "에러 발생", Toast.LENGTH_LONG).show()
  }

}

 

자 다음 과정은 여기서 만든 items 배열을 RecyclerView에 뿌려주면 완성인데요.

아이고.. 내용이 너무 길어져서, 2편으로 나눠서 포스팅하겠습니다. ㅠㅠ 

 

댓글

Designed by JB FACTORY