안드로이드스튜디오

[Kotlin] 안드로이드 데이터 엑셀 파일(.xls)에 저장하기

eunda_coding 2023. 2. 8. 15:39

이번 프로젝트는 ESP32에서 블루투스로 측정값을 안드로이드에 보내고 그 값들을 엑셀 파일에 저장해 문서로 쓰는걸 했다.

 

1. 안드로이드에 라이브러리 추가

https://poi.apache.org/download.html#POI-4.1.0

 

Apache POI - Download Release Artifacts

<!--+ |breadtrail +--> <!--+ |start Menu, mainarea +--> <!--+ |start Menu +--> <!--+ |end Menu +--> <!--+ |start content +--> Apache POI - Download Release Artifacts Available Downloads This page provides instructions on how to download and verify the Apac

poi.apache.org

 

Apache POI라는 라이브러리를 사용해서 엑셀파일을 만들 예정인데 최신 버전은 오류가 너무 많이나서(내가 못하는걸수도,,) 3.13버전을 쓰기로....

(참고로 3.13버전은 엑셀 2007이전 버전을 지원하기 때문에 많은 양의 데이터를 저장할 수는 없다. 최대 256개 row를 지원)

https://archive.apache.org/dist/poi/release/bin/

 

Index of /dist/poi/release/bin

 

archive.apache.org

poi-3.13-20150929.jar 파일을 사용해서 만들었다.

 

2. 라이브러리 안드로이드 lib폴더에 추가

project로 변경하면 app/libs안에 poi-3.13.jar파일 추가

 

3. build.gradle에 implementation 추가

    implementation files('libs\\poi-3.13.jar')

4. Mainactivity 코드 작성

val wb: Workbook = HSSFWorkbook()
val sheet: Sheet = wb.createSheet("시트 이름 작성")

workbook을 만들고 sheet는 엑셀 내 시트를 생성하는 것이다.

val row0: Row = sheet.createRow(0)
var cell: Cell = row0.createCell(0)
cell.setCellValue("이름")
cell = row0.createCell(1);
cell.setCellValue(name)

먼저 row를 만들고 cell을 추가하는 방식이다.

이름 name

위에 코드를 엑셀파일로 보면 이런식으로 작성되어 있다.

 

5. 외부 저장소에 엑셀 파일 저장하기

여기를 제일 많이 헤맸다. 처음에 앱내 내부저장소에 하려고 했는데 용량 문제도 그렇고 접근 권한 문제도 발생해서

디바이스 내에서 엑셀파일을 찾아 볼 수 있으면 좋겠다고 생각해서 외부에 만들었다.

또한, 외부에 만들면 앱을 삭제해도 파일은 지워지지 않는다.

val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
val file_name = date + "_" + name + ".xls"
val file = File(dir, file_name)
try {
    val os = FileOutputStream(file)
    wb.write(os) // 내부 저장소에 엑셀 파일 생성

} catch (e: IOException) {
    e.printStackTrace()
}

storage/emulated/0/Documents/ 경로에 저장하였다.