Android Programming

엑셀 파일의 내용을 안드로이드 DB 파일에 저장하기 (외장메모리)

여우래비 2015. 6. 4. 17:30
반응형

본 포스트는 나중에 프로그래밍 도중 내용을 잊을까봐 참고용으로 작성한 것으로, 기본적인 내용은 "맥박의 개발일지" 블로그에 너무 자세하게 설명이 되어 있어 더 이상의 추가설명은 필요없으나, 생초보인 나의 목적에 맞는 몇 가지 코드와 주석을 더 가미하였다. 


출처: 맥박의 개발일지 (http://pulsebeat.tistory.com/103)

(나같은 초보에게는 단비와 같은 블로그다!)



<추가내용>

1. 디바이스의 "Download" 폴더에 저장된 Excel 파일을 읽어옴 (기존 코드는 "assets"에서 읽어오는 방식임)

2. 외장메모리에 저장하고 읽기위한 코드 추가

3. DB 삭제 코드 추가



<기본 준비사항>

1. notes.xls 파일 작성: 기본 데이터가 저장된 파일로, 파일 명은 "MainActivity.java"에 하드코딩 되어 있으므로 변경하지 말것. 

   (Sheet 이름은 관계 없이 첫번째 Sheet에 저장하면 된다. 추후 Sheet를 변경하려면, MainActivity.java의 "sheet = workbook.getSheet(1);" 부분의 숫자를 변경하면 된다. 첫번째 Sheet는 0, 두번째 Sheet는 1로 할당되어 있다.)

    

이름

직급 

홍길동

차장 

신사임당 

상무 

한해피 

전무 

나일등 

대리 


2. notes.xls 파일을 디바이스의 "Download"에 저장


3. JExcelApi 라이브러리 추가: "jxl.jar" 를 아래와 같이 Android Studio Library에 추가

   JExcelApi 라이브러리 다운로드: 링크

   JExcelAPi Tutorial: 링크


    3-1. 라이브러리 추가방법

          1) Android Studio의 File->Project Structure

          2) app Module에서 Dependencies 클릭

          3) 오른쪽 "+" 클릭 후 "File Dependencies" 선택

          4) 저장된 경로 확인 후 "OK"


<Source>

MainActivity.java



public class MainActivity extends ActionBarActivity {


    private NotesDbAdapter dbAdapter;

    private static final String TAG = "NotesDbAdapter";


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        //중략 (자세한 코드는 맥박의 개발일지 http://pulsebeat.tistory.com/103 참조)


       //테이블 삭제를 위한 추가 코드

       Button bt2 = (Button) findViewById(R.id.deleteButton);

        bt2.setOnClickListener(new View.OnClickListener() {


            public void onClick(View v) {

                dbAdapter.open();

                dbAdapter.deleteAll();

                dbAdapter.close();

                TextView tv = (TextView) findViewById(R.id.message);

                tv.setText("테이블을 삭제하였습니다.");

            }

        });


        //엑셀 파일을 불러오기 위한 추가 코드

        Button bt3 = (Button) findViewById(R.id.excelButton);

        bt3.setOnClickListener(new View.OnClickListener() {


            public void onClick(View v) {

                copyExcelDataToDatabase();

                TextView tv = (TextView) findViewById(R.id.message);

                tv.setText("엑셀 데이터를 추가하였습니다.");

            }

        });

    }


    private void copyExcelDataToDatabase() {

        Log.w("ExcelToDatabase", "copyExcelDataToDatabase()");


        Workbook workbook = null;

        Sheet sheet = null;


        //하략 (자세한 코드는 맥박의 개발일지 http://pulsebeat.tistory.com/103 참조)


NotesDbAdapter.java


     //중략 (자세한 코드는 맥박의 개발일지 http://pulsebeat.tistory.com/103 참조)


    private static final String DATABASE_CREATE = "create table notes (_id integer primary key autoincrement, "

            + "title text not null, body text not null);";


    // DB 저장 경로를 디바이스의 Downloads로 지정하기

    private static final String DATABASE_NAME = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/data.db";



    private static final String DATABASE_TABLE = "notes";

    private static final int DATABASE_VERSION = 2;

    private final Context mCtx;



    //하략 (자세한 코드는 맥박의 개발일지 http://pulsebeat.tistory.com/103 참조)



activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    android:orientation="vertical"

    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


    <Button

        android:id="@+id/addButton"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="데이터베이스 추가"

        android:layout_gravity="center_horizontal" />


    <Button

        android:id="@+id/loadButton"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="데이터베이스 불러오기"

        android:layout_gravity="center_horizontal" />


    <Button

        android:id="@+id/deleteButton"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="데이터베이스 삭제"

        android:layout_gravity="center_horizontal" />


    <Button

        android:id="@+id/excelButton"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="엑셀 데이터베이스 추가"

        android:layout_gravity="center_horizontal" />


    <TextView android:text="message" 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/message" />


</LinearLayout> 


AndroidManifest.xml 파일의 </application> 밑에 아래 두 줄 추가


  //기존코드는 DB 파일이 내장메모리에 저장되어 확인이 어려운 바, 외장메모리에 저장하기 위해 퍼미션을 얻는 과정임

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>  

  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>


<작동>

 

"데이터베이스 불러오기" 클릭시, 기존 Excel 파일에 저장된 내용이 아래 "message" view에 출력됨

"데이터베이스 추가" 클릭시, 코드에 내장되어 있는 "러키", "해피"가 기존 DB 밑에 추가됨. "데이터베이스 불러오기"로 확인 가능

"데이터베이스 삭제" 클릭시, 전체 테이블 삭제

"엑셀 데이터베이스 추가" 클릭시, Excel 내용이 DB로 입력됨 . "데이터베이스 불러오기"로 확인 가능

이상 포스트를 마친다.




반응형