본문 바로가기

안드로이드

[안드로이드] 엑셀 (Excel) 파일의 데이터를 데이터베이스에 넣기

 

 

 

<목표> 

 

[안드로이드] 엑셀 파일의 데이터를 데이터베이스에 넣기

 

 오늘은 엑셀 파일의 데이터를 데이터베이스에 넣는 방법을 소개하고자 합니다. 유머나 명언 등을 서비스하고자 할 때는 기존의 데이터를 안드로이드의 데이터베이스에 넣는 작업이 필요합니다. 소스 자체에 데이터파일을 넣어 처음 시작 시에 데이터를 읽어 넣어주면 안드로이드 데이터베이스에 넣을 수 있습니다. 그 중 가장 쉽고 편리하고, 간단한 파일이 엑셀 (Excel) 파일이 아닐까 합니다. 아무래도 데이터형의 자료를 넣을 때는 편하니까 말이죠.

 

 간략히 방법을 설명해드리자면, 첫 번째로 안드로이드 프로젝트의 assets 폴더에 엑셀 파일을 넣습니다. 두번 째로 엑셀 파일을 읽어올 수 있는 라이브러리를 추가합니다. 그리고 마지막으로 해당 라이브러리를 이용하여 엑셀 파일을 읽어온 뒤에, 안드로이드 데이터베이스에 데이터를 넣어주면 됩니다. 의외로 간단하게 데이터를 넣을 수 있습니다.

 

 처음에는 SQLite Manager를 이용하여 .db 파일을 만들고, 그것을 안드로이드 데이터베이스에 직접 복사하여 넣는 방법을 썼었습니다. 하지만 굳이 중간의 복잡한 절차 없이 엑셀 파일로 간단히 하는 방법도 괜찮다는 생각에 위의 방법으로 시도해보았습니다. 생각보다 너무 간단해서 .db 파일을 만들면서 했던 고생이 아깝게 느껴졌을 정도였습니다.

 

그럼 차근 차근 알아보겠습니다.

   

   

  STEP 1 DBAdpater 생성하기 

 

 데이터 베이스를 편리하게 접근하는 DBAdapter가 필요합니다. 여기서는 예전에 포스팅하였던 [안드로이드] SQLite데이터베이스 이용하기의 NotesDbAdapter를 사용하겠습니다.

 

 

  STEP 2 엑셀 파일 추가하기 

 

 데이터가 저장되어 있는 엑셀 파일을 안드로이드 프로젝트의 assets 폴더에 넣습니다. 초기에 안드로이드 프로젝트 생성시 자동적으로 assets 폴더가 생성되어 있습니다. 혹시 없으신 분들은 폴더를 추가하시면 됩니다. 여기에서는 notes.xls 파일을 추가하였습니다.

 

 

  STEP 3 라이브러리 추가히기 

 

 엑셀에 접근하기 위해서 라이브러리가 필요합니다.  http://www.andykhan.com/jexcelapi/download.html 에서 JExcelApi 의 최신 버전을 받습니다. 압축을 풀어 jxl.jar 파일을 안드로이드 프로젝트에 추가하여 줍니다. 저는 lib라는 폴더를 생성하여 추가하여 넣었습니다. Jxl.jar에서 마우스 오른쪽으로 클릭하시고, Build Path, 그리고 Add to Build Path를 클릭하시면 라이브러리가 추가됩니다. JExcelApi 라이브러리에 대해 더 자세히 알고 싶으시다면, 링크를 따라가세요.

 

 

  STEP 4 데이터 접근 코드 

 

 이제 데이터에 직접 접근해보겠습니다.

 

package com.pulsewings.exceltodatabase;

import java.io.InputStream;
import jxl.Sheet;
import jxl.Workbook;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private NotesDbAdapter dbAdapter;

	private static final String TAG = "NotesDbAdapter";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Log.d(TAG, "DatabaseTest :: onCreate()");
		this.dbAdapter = new NotesDbAdapter(this);

		copyExcelDataToDatabase();

		Button bt = (Button) findViewById(R.id.addButton);
		bt.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				String title = "러키";
				String body = "해피";

				dbAdapter.open();
				dbAdapter.createNote(title, body);
				dbAdapter.close();

				TextView tv = (TextView) findViewById(R.id.message);
				tv.setText(title + ", " + body + "를 추가하였습니다.");
			}
		});

		Button bt1 = (Button) findViewById(R.id.loadButton);
		bt1.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				dbAdapter.open();
				Cursor result = dbAdapter.fetchAllNotes();
				result.moveToFirst();
				String resultStr = "";
				while (!result.isAfterLast()) {
					String title = result.getString(1);
					String body = result.getString(2);
					resultStr += title + ", " + body + "\n";
					result.moveToNext();
				}

				TextView tv = (TextView) findViewById(R.id.message);
				tv.setText(resultStr);
				result.close();
				dbAdapter.close();
			}
		});
	}

	private void copyExcelDataToDatabase() {
		Log.w("ExcelToDatabase", "copyExcelDataToDatabase()");

		Workbook workbook = null;
		Sheet sheet = null;

		try {
			InputStream is = getBaseContext().getResources().getAssets().open("notes.xlsx");
			workbook = Workbook.getWorkbook(is);

			if (workbook != null) {
				sheet = workbook.getSheet(0);

				if (sheet != null) {

					int nMaxColumn = 2;
					int nRowStartIndex = 0;
					int nRowEndIndex = sheet.getColumn(nMaxColumn - 1).length - 1;
					int nColumnStartIndex = 0;
					int nColumnEndIndex = sheet.getRow(2).length - 1;

					dbAdapter.open();
					for (int nRow = nRowStartIndex; nRow <= nRowEndIndex; nRow++) {
						String title = sheet.getCell(nColumnStartIndex, nRow).getContents();
						String body = sheet.getCell(nColumnStartIndex + 1, nRow).getContents();
						dbAdapter.createNote(title, body);
					}
					dbAdapter.close();
				} else {
					System.out.println("Sheet is null!!");
				}
			} else {
				System.out.println("WorkBook is null!!");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (workbook != null) {
				workbook.close();
			}
		}
	}
}

   

 두 개의 버튼은 데이터베이스가 제대로 들어갔는지 확인하는 기능을 수행합니다. 첫번째 버튼은 임의로 데이터를만들어 데이터베이스에 넣고, 나머지 한개는 현재 데이터베이스에 들어있는 데이터를 모두 불러와 출력하는 역할을 합니다. 엑셀 파일을 접근하기 위한 핵심 함수는 copyExcelDataToDatabase() 부분입니다.

 

InputStream is = getBaseContext().getResources().getAssets().open("notes.xls");

 

 위의 한줄이 핵심 코드입니다. Assets 폴더에 있는 엑셀 파일을 가져와 JExcelApi에 적용시키기 위한 방법입니다. InputStream을 이용하여, JExcelApi의 Workbook에 넣어 줍니다. 나머지 소스 부분은 행과 열을 지정해줘서 해당 부분에 있는 데이터를 가져오는 부분입니다. 조금 더 구체적인 JExcelApi를 사용하시려면, 튜토리얼을 참고하세요.

 

 

  STEP 5 Xml Code

 

 Xml코드에는 테스트를 위해 TextView 하나와 Button이 두 개 있습니다.  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="<://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/message"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/loadButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:lines="2"
        android:text="데이터베이스 불러오기" />

    <Button
        android:id="@+id/addButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:lines="2"
        android:text="데이터베이스 추가" />

</LinearLayout>

 

 

  STEP 6 AndroidManifest.xml Code

 

 데이터베이스를 이용하기 위해서 AndroidManifest.xml 코드 수정은 필요하지 않습니다.

 

 

 

<마무리> 엑셀 파일의 데이터를 데이터베이스에 넣기

 

 데이터베이스화된 데이터를 안드로이드에서 이용하고자 할 때, 데이터를 안드로이드 데이터베이스로 넣는 과정이 필요합니다. 가장 간단한 방법 중 하나가 엑셀 파일의 데이터를 넣는 방법이 아닐까합니다. 엑셀은 데이터를 데이터베이스화 하기 쉽게 되어 있어, 스프레드 시트로서의 역할을 충분히 하고 있다고 볼 수 있습니다. 그렇기 때문에 쉽게 데이터베이스화할 수 있으며, 관리하기도 쉬운 장점이 있습니다. 이러한 엑셀 파일의 데이터베이스를 안드로이드에서 이용하고자 하는 방법을 찾다가 JExcelApi 라이브러리를 알게 되었습니다. 이 라이브러리를 이용하면 손쉽게 엑셀 파일을 자바 환경에서 접근할 수가 있습니다. Assets 폴더에 엑셀 파일을 넣고, JExcelApi라이브러리를 이용하여, 데이터에 접근하여, 안드로이드 데이터베이스에 데이터를 넣을 수 있었습니다.

 

 

 

[ 참고자료 ]  

 

 

 


Posted by 
맥박맥박의 개발 일지

 

  • 2013년 7월 24일 본문 업데이트하였습니다.