달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
728x90
반응형

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

원본출처:http://pulsebeat.tistory.com/103

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

오늘은 엑셀 파일의 데이터를 데이터베이스에 넣는 방법을 소개하고자 합니다. 유머나 명언 등을 서비스하고자 할 때는 기존의 데이터를 안드로이드의 데이터베이스에 넣는 작업이 필요합니다. 소스 자체에 데이터파일을 넣어 처음 시작 시에 데이터를 읽어 넣어주면 안드로이드 데이터베이스에 넣을 수 있습니다. 그 중 가장 쉽고 편리하고, 간단한 파일이 엑셀 (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 pulsebeat.example.excelToDatabase;

import java.io.InputStream;

import jxl.Cell;

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.View;

import android.widget.Button;

import android.widget.TextView;

publicclass MainActivity extends Activity {

private NotesDbAdapter dbAdapter;

privatestaticfinal String TAG = "NotesDbAdapter";

@Override

publicvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.d(TAG, "DatabaseTest :: onCreate()");

this.dbAdapter = new NotesDbAdapter(this);

copyExcelDataToDatabase();

Button bt = (Button) findViewById(R.id.addButton);

bt.setOnClickListener(new View.OnClickListener() {

publicvoid 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() {

publicvoid 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();

}

});

}

privatevoid copyExcelDataToDatabase() {

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

Workbook workbook = null;

Sheet sheet = null;

try {

InputStream is =

getBaseContext().getResources().getAssets().open("notes.xls");

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이 두 개 있습니다.

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayout xmlns:android="http://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"

/>

<Button

android:id="@+id/loadButton"

android:layout_height="wrap_content"

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

android:lines="2"

android:layout_gravity="center_vertical"

android:layout_width="fill_parent"

/>

<Button

android:id="@+id/addButton"

android:layout_height="wrap_content"

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

android:lines="2"

android:layout_gravity="center_vertical"

android:layout_width="fill_parent"

/>

</LinearLayout>

STEP 6 AndroidManifest.xml Code

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

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

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

[참고자료]

 

728x90
반응형
:
Posted by mapagilove