Android Read an excel file

사용 언어: Kotlin 1.6.10
사용 버전: Android Studio 2021.1.1

안드로이드 Read an excel file을 알아보겠습니다.


안드로이드에서 엑셀(Excel) 파일을 읽는 걸 해볼 건데요. 아무래도 일반 텍스트가 아니다 보니 라이브러리를 써줍니다.
Apache에서 만든 POI 라이브러리를 씁니다.

https://poi.apache.org/


이것을 바로 안드로이드에 사용하려면 복잡합니다. 그래서 marven repository를 사용합니다.


여기서 최신 버전을 사용해 볼게요.

5.2.0으로 갑니다.



아래 페이지에서 Gradle (Short)의 내용을 복사해 줍니다.




Module 용 build.gradle로 갑니다.

dependencies에 붙여넣기하고 Sync Now를 합니다.
implementation 'org.apache.poi:poi:5.2.0'




엑셀을 안드로이드 파일 구조에 넣기 위해서는 assets 폴더가 필요합니다.

New - Folder - Assets Folder를 누릅니다.




이렇게 만든 assets에 excel 파일을 넣습니다.






assets에 위치한 파일들을 읽기 위해서는 assetManager를 사용해야 합니다.




assetManager를 정의하고, assetManager.open()을 통해서 해당 파일에 접근합니다.




공식 홈페이지에 문서를 봅시다.



HSSF와 XSSF 형식이 있는데, 문서에 따르면 HSSF는 Excel 97(-2007) (.xls) 파일 형식이라고 합니다. 그리고 XSSF는 Excel 2007 OOXML (.xlsx) 파일 형식이라고 하네요.


제 파일은 xls니까 HSSF가 아닐까 싶습니다.


실행을 하니 아래와 같은 오류가 나옵니다.

최소 api가 26 이상이어야 한답니다.

api 26은 android 8 (Oreo)입니다. 음... 너무 뼈아픈데요. 어쩔 수 없죠. 찾아보니 4.0.1 버전은 아래 버전도 지원하는 것 같더군요. 하지만 4.0.1 버전은 취약한 버전의 log4j 라이브러리를 쓰기 때문에 알아서 잘 판단해서 사용하시길 바랍니다.





아쉽게도 MethodHandle.invoke와 MethodHandle.invokeExact는 desugar(낮은 버전에서도 사용할 수 있게 만드는 기능)도 지원하지 않는다고 하네요. 어쩔 수 없이 26으로 써야겠습니다. 대한민국 사람들은 휴대폰 빨리 바꾸니까 아직도 Android 8을 쓰는 사람은 별로 없을 겁니다.





minSdk를 26으로 변경했습니다. 이제 오류는 없습니다.




이제 코드로 돌아와서 아까 assetManager로 연 excel 파일을 HSSFWorkbook으로 불러온 다음, getSheetAt을 통해 sheet를 가져옵니다. 





sheet는 엑셀 파일 밑에 있는 저 시트를 말합니다.






sheet.getRow()로 원하는 줄을 선택합니다.

그리고 row.getCell()로 선택한 줄에서 원하는 칸을 고릅니다.




선택한 cell을 출력해 보면 엑셀에 있는 값이 나옵니다.






19 번째 줄을 보면, inputStream을 사용합니다. 이렇게 하면 Memory를 많이 사용하게 되고, 적은 Memory를 사용하려면 File로 불러오면 됩니다. 휴대폰은 메모리가 적으니까 File을  쓰면 좋을 것 같네요. File로 저장한 뒤 불러와야 하는데 귀찮으니 넘어가겠습니다.



inputStream을 close() 해주는 것을 잊으시면 안 됩니다.





반복문으로 읽어 보겠습니다.

iterator()를 활용하여 만들면 모든 엑셀 내용을 다 읽을 수 있습니다.





자 이제 활용하시면 됩니다.


끝.


카테고리: Android

댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

tensorflow tf.random.uniform()

Android Notification with Full Screen

KiCad 시작하기 2 (PCB 만들기)

Android Minimum touch target size

Python bs4.SoupStrainer()

KiCad 시작하기 4 (기존 회로도 수정 및 추가)

음악 총보(Score), 파트보(Part)

tensorflow tf.expand_dims()