본문 바로가기
앱인벤터/Tips

앱인벤터에서 엑셀 사용하기

by 이지이지(EGEasy) 2021. 6. 3.

안녕하세요. 이지이지입니다.

이번 포스팅에서는 앱인벤터에서 엑셀을 사용하는 방법에 대해 알아보겠습니다.

 

앱인벤터에서 엑셀을 사용하는 이유로는

강력한 엑셀의 함수 기능, 다른 데이터베이스보다 엑셀이 다루기가 쉬워서 등이 있을 것 같은데요.

 

이 포스팅을 읽어가시다 보면 느끼시겠지만, 앱인벤터에서 엑셀을 사용하는 것은 그리 추천하지 않습니다.

엑셀 보다는 구글 스프레드시트나 파이어베이스 등과 같은 데이터베이스를 활용하는 것을 추천합니다.

 

그래도 어쩔 수 없이 엑셀을 활용해야 하는 분들을 위해 엑셀 사용방법에 대해 알려드리겠습니다.

 

먼저 다음 aia 파일을 내려받아 참고하시기 바랍니다.

 

 

ExcelImport.aia
0.01MB

 

    화면 구성 및 엑셀파일

다음과 같은 데이터가 입력된 엑셀파일을 활용하도록 하겠습니다.

위에서 앱인벤터 파일을 다운받으신 분께서는 파일 내 asset(Media)에 이미 포함되어 있으므로

따로 엑셀파일을 작성하실 필요는 없습니다.

 

엑셀 화면

 

!!! 앱인벤터에서 엑셀 파일을 사용하기 위해서는

엑셀 파일을 반드시 CSV UTF-8(쉼표로 분리) 형식으로 저장해야 합니다. !!!

CSV UTF-8 형식으로 저장하기

 

화면 구성은 다음과 같습니다.

 화면 구성

화면 구성에 대한 설명입니다.

1. 엑셀파일에서 데이터를 가져와 스피너에서 이름을 선택할 수 있게 합니다.

2. 스피너에서 이름을 선택하면 이름에 맞는 나이와 이메일주소가 레이블에 표시됩니다.

3. 이름과 나이, 이메일주소를 입력하고 [추가] 버튼을 클릭하면 엑셀 파일이 변경되며 스피너에도 즉각 반영됩니다.

4. [선택 이름 삭제] 버튼을 클릭하면 스피너에 선택되어 있는 이름의 데이터가 엑셀 파일에서 삭제되고 스피너에도 즉각 반영됩니다.

 

    블록 코딩

다음 이미지는 전체 블록 코딩 화면입니다.

전체 블록 코딩

 

각 블록에 대한 설명입니다.

블록 코딩 #1

① Screen1이 초기화되었을 때,

 

② 만약 TinyDB1의 Tag "Change"에 저장된 값이 "true"라면,

 

③ TestData.csv 파일을 읽어오라.

 

④ TinyDB1의 Tag "Change"에 저장된 값이 "true"가 아니라면, 

//TestData.csv 파일을 읽어오라.

 

바로 여기에서 앱인벤터에서 엑셀 파일을 사용하는 것이 불편한 점이 드러납니다.

먼저 파일 경로에 대한 이해가 필요합니다.

 

슬래시(/) 개수 파일 실제 경로 읽기 / 쓰기
한 개: /abc.csv /sdcard/abc.csv

→ 슬래시가 하나일 경우에는 sdcard로부터의 상대경로를 나타냅니다. 하지만 sdcard에 저장될 경우 다른 프로그램도 이 파일에 접근할 수 있어 굉장히 취약해지게 됩니다. 그래서 읽기와 쓰기 권한을 부여해야 합니다.
읽기 가능
쓰기 가능
두 개: //abc.csv → 앱인벤터 파일의 asset에 저장됩니다. 읽기 가능
쓰기 불가능
X → 앱별 저장소(app-specific private data, ASD)에 파일이 저장됩니다. 다른 프로그램에서는 이 파일에 접근을 하지 못하기 때문에 권장됩니다. 읽기 가능
쓰기 가능

우리는 보통 앱인벤터에서 파일을 미리 개발당시에 asset(Media)에 등록해두고 사용자가 파일을 사용할 수 있게 합니다.

그런데 위의 표에서 보듯이 사용자가 파일을 읽기만 한다면, 슬래시 두 개를 이용하여 asset에 엑셀 파일을 저장해두면 끝입니다.

 

하지만 사용자가 엑셀 파일을 추가, 수정, 삭제하고자 한다면 파일을 복사하여 다른 경로에 두어야만 합니다.

위의 표에서 보듯이 앱별 저장소에 저장하는 것이 권장됩니다.

 

그런데 앱별 저장소에 처음부터 사용자가 엑셀 파일을 가지고 있게 할 수 없으므로

처음에는 asset에 포함시켜 앱을 개발하고

나중에 사용자가 실행할 때 이를 복사하여 앱별 저장소에 저장하게 하는 번거로움을 거쳐야 합니다.

 

이것을 바탕으로 위의 블록코딩을 좀 더 정확히 설명드리겠습니다.

 

② 만약 TinyDB1의 Tag "Change"에 저장된 값이 "true"라면,

→ 데이터가 추가되거나 삭제될 경우 "Change"에 "true"로 저장해 둘 것입니다.

 

③ 데이터가 변경되었다는 것은 엑셀 파일이 asset에 있는 것이 아니라, 앱별 저장소로 이동해 갔다는 것을 의미하기 때문에 경로를 슬래시 없이 TestData.csv로 한 것입니다.

 

④ 데이터가 변경되지 않았다면 asset에 있는 엑셀 파일을 그대로 사용하면 되므로 경로를 //TestData.csv로 한 것입니다.

 

※ 파일 경로에 대한 자세한 설명은 다음을 참고하시기 바랍니다. (영어로 되어 있습니다. ㅡㅡ;;)

 

File Path Updates Starting with Android 10

TL;DR You may need to change how your app uses the File component. See What this means for App Inventor Applications for details. Read on to learn more about the specifics of why these changes are needed. Overview Early Android devices (and some still toda

appinventor.mit.edu

 


 

블록 코딩 #2

① 변수 excel_List를 빈 리스트로 만들어라.

→ 엑셀 파일로부터 받을 데이터를 저장할 변수입니다.

 

② 변수 ElementList를 빈 리스트로 만들어라.

→ 스피너에 선택 사항으로 들어갈 요소를 저장할 변수입니다.

 

③ File1 컴포넌트가 텍스트 값을 받았을 때,

→ Call File1.ReadFrom fileName을 통해 데이터를 읽어오라는 호출을 받은 후 데이터를 받았을 때 일어나는 이벤트입니다.

 

④ 만약 TinyDB1의 Tag "Change"의 값이 false라면,

→ 아직 파일에 수정이 일어나지 않았으므로, 파일이 asset에 남아 있을 것입니다.

 

⑤ 앱별 저장소에 TestData.csv로 파일을 저장하라.

→ 추후에 수정을 위해 asset에 있던 파일에서 받은 text를 그대로 앱별 저장소로 복사하는 것입니다.

 

⑥ 변수 excel_List에 엑셀 파일로부터 받은 데이터를 리스트 형식으로 저장하라.

→ 엑셀 파일은 csv(콤마로 분리된 텍스트)형식으로 저장되어 있었고, 그냥 가져올 경우 텍스트 형식으로 가져오게 됩니다. 이를 앱인벤터에서 리스트로 사용하기 위해 리스트 형식으로 변환하여 저장하는 것입니다.

※ 리스트에 대해서는 곧 다룰 예정입니다.

 

⑦ setSpinner 프로시저(사용자 정의 함수)를 호출하라(실행시키라).

→ 스피너에 선택 요소를 추가하기 위한 프로시저입니다.

 


 

블록 코딩 #3

① 변수 ElementList에 빈 리스트를 저장하라.

 

② 2에서부터 변수 변수 excel_List의 길이까지 1씩 증가하며 do의 영역을 반복실행하라.

→ excel_List의 길이는 엑셀 파일에서 행의 개수와 같습니다. (아래에 구체적 설명)

2부터 시작하는 이유는 엑셀 파일의 첫 행이 "이름", "나이", "이메일"이라 필요없기 때문입니다.

 

※ 블록 코딩 #2-⑥을 통해 변수 excel_List에는 다음과 같이 중첩 리스트(리스트 안에 리스트)로 데이터가 저장됩니다.

엑셀의 테이블(표) 전체를 하나의 큰 리스트로 만들고, 그 안에 있는 각 행의 데이터를 작은 리스트로 만드는 것입니다.

 

 

[["이름","나이","이메일"], ["홍길동","24","gildong@gmail.com"], ["장보고","32","bogo@gmail.com"], ["이순신","45","sunshin@gmail.com"]]

엑셀 파일

변수 excel_List 안의 항목들을 번호(Index)로 보면 다음과 같습니다.

 

이름: 1-1 나이: 1-2 이메일: 1-3
첫 번째 리스트의 첫 째 항목 첫 번째 리스트의 두 번째 항목 첫 번째 리스트의 세 번째 항목
홍길동: 2-1 24: 2-2 gildong@gmail.com: 2-3
두 번째 리스트의 첫 째 항목 두 번째 리스트의 두 번째 항목 두 번째 리스트의 세 번째 항목

③ 변수 ElementList에 number번째 리스트의 첫 번째 항목(이름이 되겠죠)을 추가하라.

 

④ Spinner1 컴포넌트의 선택사항을 변수 ElementList에 있는 항목으로 하라.

 

⑤ lbl_ageValue의 텍스트를 변수 excel_List 두 번째 리스트의 두 번째 항목으로 하라.

 

⑥ lbl_emailValue의 텍스트를 변수 excel_List의 두 번째 리스트의 세 번째 항목으로 하라.

 


 

블록 코딩 #4

① Spinner1에서 어떤 항목이 선택된 후

 

②~③ lbl_ageValue / lbl_emailValue의 텍스트를

변수 excel_List에서,

Spinner1에서 선택된 항목의 인덱스 값에 1을 더한 리스트 항목의

두 번째 / 세 번째 항목 값으로 하라.

 

항목  excel_List Index 스피너 Index
이름 1 X
홍길동 2
장보고 3 2
이순신 4 3

 


 

블록 코딩 #5

① [추가] 버튼을 클릭했을 때,

 

② TinyDB1의 태그 "Change"에 값을 "True"로 저장합니다.

→ 블록 코딩 #1-②~③ 참조

 

③ TestData.csv파일에 추가된 요소를 더하라.

이름과, 나이, 이메일주소를 먼저 리스트로 만든 다음, 엑셀 파일은 csv 형식으로 저장되어야 하므로, 다시 csv로 바꾸어 추가하는 것입니다.

 

④ 앱별 저장소에 있는 TestData.csv 파일을 읽어오라.

→ 엑셀 파일에 변경이 있었기 때문에 다시 읽어드리는 것입니다.

 


 

블록 코딩 #6

① [선택 이름 삭제]를 클릭했을 때,

 

② TinyDB1의 태그 "Change"에 값을 "True"로 저장합니다.

→ 블록 코딩 #1-②~③ 참조

 

③ 변수 excel_List에서 Spinner1에서 선택된 항목의 인덱스 값에 1을 더한 인덱스 값을 가진 리스트 항목을 삭제하라.

→ 블록 코딩 #4-②~③ 참조

 

④ 앱별 저장소에 변수 excel_List에 있는 텍스트를 TestData.csv로 저장하라.

→ 블록 코딩 #1-⑥과 반대되는 것으로, 변수 excel_List에 리스트 형식으로 저장되어 있던 데이터를 csv 형식으로 바꾸어 엑셀 파일로 만드는 것입니다.

 

⑤ Spinner 프로시저를 호출하라.

→ 데이터가 삭제되었으므로 스피너의 선택사항을 다시 설정해 주기 위한 것입니다.

 

앱인벤터에서 엑셀 사용법이 이해가 되셨나요?

다음 앱인벤터 강좌에서는 엑셀말고, 구글 스프레드시트를 사용하는 방법에 대해 알아보도록 하겠습니다.~

 

 

댓글