달력

5

« 2024/5 »

  • 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
  • 29
  • 30
  • 31
반응형
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
728x90
반응형

안드로이드 - 카메라 촬영 후 저장

원본 출처:http://www.yeory.com/category/Android

카메라 및 앨범은 MediaScannerConnectionClient 인터페이스를 구현해야만 사용가능하다.

 
 
 
 
 
 
 
 
 
 
 
 
 
public class ProfileEditActivity extends Activity implements MediaScannerConnectionClient{
private final String targetPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/DCIM/Camera/";
@Override
public void onMediaScannerConnected() {
msc.scanFile(targetPath, null);
}
@Override
public void onScanCompleted(String path, Uri uri) {
msc.disconnect();
}
}
요렇게 - 그리고 메서드를 Override 해주면 사용 준비 끝.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
private SimpleDateFormat sdf;
private File targetFile;
private void doTakePhotoAction(){
sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("return-data", true);
File targetFolder = new File(targetPath);
if(!targetFolder.exists()){
targetFolder.mkdirs();
try {
targetFolder.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
// 사진 촬영 후 저장될 경로
targetFile = new File(targetFolder, sdf.format(Calendar.getInstance().getTime())+".jpg");
photoUri = Uri.fromFile(targetFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, CommonResource.TAKE_PICTURE);
}


 

doTakePhotoAction()을 호출하게 되면 카메라가 호출되어 캡처가 가능하다.
CommonResource.TAKE_PICTURE는 코드값으로 카메라 캡처가 종료되면 해당 코드값으로 촬영인지 앨범인지 구분하기 위해 넣어준 것.


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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
private BitmapFactory.Options options = new BitmapFactory.Options();
private Uri photoUri;
private String uploadProfileImagePath = null;
private ImageView profileImage = null;
private MediaScannerConnection msc = null;
@Overide
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bitmap profileBitmap = null;
Bitmap resized = null;
if(resultCode != RESULT_OK)
return;
// 이미지 품질 옵션
options.inJustDecodeBounds = true;
switch(requestCode){
// 갤러리에서 사진 가지고 올때
case CommonResource.SHOW_ALBUM:
photoUri = data.getData();
// 갤러리에서 선택했을때 실제 경로 가져오기 위해 커서
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( photoUri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
photoUri = Uri.parse(cursor.getString(column_index));
profileBitmap = BitmapFactory.decodeFile(photoUri.getPath(), options);
// 비트맵 사이즈 조절
options = commonUtil.getBitmapSize(options, ImageDownloader.NORMAL_IMAGE);
profileBitmap = BitmapFactory.decodeFile(photoUri.getPath(), options);
uploadProfileImagePath = photoUri.getPath();
break;
case CommonResource.TAKE_PICTURE:
try {
uploadProfileImagePath = photoUri.getPath();
profileBitmap = BitmapFactory.decodeFile(photoUri.getPath(), options);
ContentValues values = new ContentValues();
values.put(Images.Media.MIME_TYPE, "bbom/jpeg");
values.put(MediaStore.Images.ImageColumns.DATA, photoUri.getPath());
photoUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values);
// 비트맵 사이즈 조절
options = commonUtil.getBitmapSize(options, ImageDownloader.NORMAL_IMAGE);
profileBitmap = BitmapFactory.decodeFile(uploadProfileImagePath, options);
try {
File targetFolder = new File(targetPath);
if(!targetFolder.exists()){
targetFolder.mkdirs();
targetFolder.createNewFile();
}
// 갤러리에 저장할때는 이미지 손실 없이 저장.
if(targetFile == null)
targetFile = new File(targetFolder, "BBOM_"+sdf.format(Calendar.getInstance().getTime())+".jpg");
FileOutputStream out = new FileOutputStream(targetFile);
// 찍은 비트맵을 실제 파일로 저장
profileBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
} finally{
targetFile = null;
// 스캐너 연결해 주어야 갤러리에 실시간으로 나타남.
if(msc == null)
msc = new MediaScannerConnection(ProfileEditActivity.this, this);
msc.connect();
}
} catch (Exception e) {
e.printStackTrace();
}
break;
}
profileImage.setImageBitmap(profileBitmap);
profileImage.setScaleType(ImageView.ScaleType.FIT_XY);
System.gc();
}
찍고 끝나는게 아니라 찍고 파일로 저장하고 미디어스캐너에 연결해주어야 함.
728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 -항상 최상위에 나오는 뷰 만들기

원본출처 : http://blog.daum.net/mailss/18

안드로이드 앱을 이것 저것 써보다 보면 어느 화면에서든지 항상 위에 떠있는 뷰를 사용하는 앱을 발견하게 될 것이다. 그 예로 battery info always라는 앱을 꼽을 수 있다.

*battery info always 설명 : http://blog.naver.com/gin073k?Redirect=Log&logNo=90127230480


그렇다면 저 앱은 어떻게 자신의 앱도 아닌데 바탕화면이던, 게임앱이던 항상 자기 뷰를 표시할 수 있을까?

그것은 안드로이드 최상위 window에 뷰를 넣었기 때문이다. 이 예제는 그 방법에 대한 예제이다.


1. 서비스 생성

자신의 앱이 종료된 후에도 항상 해당 뷰가 떠 있어야 한다. 그래서 Activity에서 뷰를 추가하는 것이 아니라 Service에서 뷰를 추가 해야 한다.


AlwaysOnTopService.java

public class AlwaysOnTopService extends Service {
@Override
public IBinder onBind(Intent arg0) { return null; }

@Override
public void onCreate() {
super.onCreate();
}

@Override
public void onDestroy() {
super.onDestroy();
}
}


2. 뷰 생성 및 최상위 윈도우에 추가

간단하게 텍스트뷰 하나 추가하는 코드이다.

private TextView tv; //항상 보이게 할 뷰. 멤버필드로 선언

@Override
public void onCreate() {
super.onCreate();

tv = new TextView(this); //뷰 생성
tv.setText("이 뷰는 항상 위에 있다.");
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tv.setTextColor(Color.BLUE);

//최상위 윈도우에 넣기 위한 설정
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, //항상 최 상위에 있게
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, //터치 인식
PixelFormat.TRANSLUCENT); //투명

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //윈도 매니저
wm.addView(tv, params); //최상위 윈도우에 뷰 넣기. permission필요.
}


3. 매니페스트에 퍼미션 설정

WinodwManager에 addView 메소드를 사용하려면 android.permission.SYSTEM_ALERT_WINDOW 퍼미션이 필요하다.


<manifest ................ >
<application ................ >
<activity
................
</activity>
<service
................
</service>
</application>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-sdk android:minSdkVersion="7" />
</manifest>


위와 같이 퍼미션을 설정해 주면 서비스 동작하는데 권한 설정이 안된다. service 태그 안에 퍼미션을 설정해 주어야 한다.

<service
................
android:permission="android.permission.SYSTEM_ALERT_WINDOW" >
</service>


4. 뷰 제거

서비스 종료시 뷰를 제거 해야 한다.

@Override
public void onDestroy() {
super.onDestroy();
if(tv != null) //서비스 종료시 뷰 제거. *중요 : 뷰를 꼭 제거 해야함.
{
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(tv);
tv = null;
}
}


5. 서비스 실행/중지 할 activity 만들기

AlwaysOnTopActivity.java


public class AlwaysOnTopActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

findViewById(R.id.start).setOnClickListener(this); //시작버튼
findViewById(R.id.end).setOnClickListener(this); //중시버튼
}

@Override
public void onClick(View v) {
int view = v.getId();
if(view == R.id.start)
startService(new Intent(this, AlwaysOnTopService.class)); //서비스 시작
else
stopService(new Intent(this, AlwaysOnTopService.class)); //서비스 종료
}
}


실행 결과


앱 시작
뷰 추가
바탕화면



유투브 동영상


다음 지도


Plants VS Zombies 게임




AlwaysOnTop.zip


전체 샘플 코드 첨부하였습니다.

*글과 자료는 출처만 밝히시면 얼마든지 가져다 쓰셔도 됩니다.

728x90
반응형
:
Posted by mapagilove
728x90
반응형

안드로이드 -  StartActivityForResult 으로 실행되는 Androday Camera App 소스

TITLE : Androday Image App

Date : 2010/11/10

Description :

This is Source that Androday Image App by excuting StartActivityForResult

Download Link :

Reference Site : Android API, http://chiyo85.tistory.com/entry/Android-Bitmap-Object-Resizing-Tip , http://www.androidpub.com/837593

StartActivity 의 중요성을 다시 생각해보게 하는 예제 이다.

안드로이드는 내외부적으로 Intent를 통해서 서로 연결이 되는 협력체 이다.

예를들어, 안드로이드 동네에서는 동사무소에서 삽하나 빌리기 위해서는 Intent에 자기성함과 IntentFilter를 입력해야만 빌려준다는 뜻이다. (유치한 표현 ㅎㅎ;)

특히나, 안드로이드에서 기본제공되는 겔러리/카메라/연락처/스케쥴 등 기본App을 본인에 App에 사용하기 위해서는

일종의 Callback 구조의 StartActivityForResult를 사용해서 기본 App을 실행해 주어야 각종 Image/연락처/데이터 등을 Intent를 통해서 받아올 수 있다.

오늘은 사진겔러리와 카메라를 이용해서 이미지를 가져오는 App을 만들어본다.

1. 처음 이미지뷰를 누르면 아래와 같은 다이얼로그가 뜨게하는데 버튼 구조가 안드로이드에서 제공하는 형태가 아님으로 , AlertDialog.Builder를 사용해서 Custom Dialog창 을 만들어준다.

Builder bld = new AlertDialog.Builder(this);

bld.setTitle(“이미지 선택”);

bld.setPositiveButton(“취소”, new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

//취소 버튼은 눌렀을 때 종료

}
});

LinearLayout linear = (LinearLayout) View.inflate(MainActivty.this,
R.layout.custom_dialog, null);

//Custom Dialog를 만들기 위한 미리 배치한 Layout을 생성

bld.setView(linear);

//리니어(뷰) 적용

2. 앨범선택을 눌렀을 때 동작을 구현한다.

StartActivityForResult로 실행해서 나중에 돌아오는 값을 onActivityResult()에서 사용할 수 있다.

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType(“image/*”);
startActivityForResult(intent, requestCode1);

//requestCode = 1004 로 겔러리를 실행시킨다. 나중에 값이 돌아올때 1004 로 돌아온다.

dismissDialog(CUSTOM_DIALOG_BOX);

//Custom 다이얼로그 종료


3. 사진선택을 눌렀을 때 동작을 구현한다.

StartActivityForResult로 실행해서 나중에 돌아오는 값을 onActivityResult()에서 사용할 수 있다.

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, requestCode2);

//requestCode = 1005 로 겔러리를 실행시킨다. 나중에 값이 돌아올때 1005 로 돌아온다.

dismissDialog(CUSTOM_DIALOG_BOX);

//Custom 다이얼로그 종료

4. 겔러리나 카메라를 실행하고 돌아왔을 때의 작동을 구현하는데 이때 ResultCode의 값은 1(RESULT_OK)이다.

또한, 백버튼을 눌러서 App을 취소했을 때도 구현하는데 이때 ResultCode의 값은 0(RESULT_CANCEL)이다.

onActivityResult()를 오버라이드해서 구현할 수 있다.

if (requestCode == requestCode1 && resultCode == RESULT_OK) {

// 겔러리에서 사진을 가져온 후 내용 구현. 사진은 Data 객체에 전달되서 온다.
}

else if (requestCode == requestCode2 && resultCode == RESULT_OK) {

// 카메라에서 사진을 가져온 후 내용 구현. 사진은 Data 객체에 전달되서 온다.

}
else // resultCode = 0
{

Toast.makeText(getApplicationContext(), “이미지 선택 취소”,Toast.LENGTH_SHORT).show();

//백버튼으로 눌러서 취소했을 경우도 구현해 준다.
}
}

5. Bitmap 객체를 가져온 후 한가지 기능을 더해주는데 하얀 영역에 이미지를 추가할때 Round 처리를 해주는 부분이다.

Util클래스에 Static 함수로 정의되어 있다. (어디서 가져온 자바 소스인지 불확실;)

Bitmap rectImage = Utils.getRoundedCornerBitmap(this, profileBitmap, 10);


< P.S> 본 예제는 간단한 구현을 위해서 Bitmap데이터를 직접가져와서 처리하였다.

좀더 정밀한 이미지 작업이나 처리를 위해서는 http://www.androidpub.com/837593 에 나와있는 방법으로 Cusor를 통해서 가져온다.

728x90
반응형
:
Posted by mapagilove
728x90
반응형

 안드로이드 - Java Excel 과, POI - 엑셀읽기, 엑셀쓰기 예제 Jakarta/Apache


2010/10/29 23:48





자바 개발자라면 한번쯤은 Anti-MS를 외치면서, 무조건적으로 빌모씨 욕한번쯤은 해보았을 것이다.

허나 실상, 개발은 MS의 운영체제위에서 하고 있고, 이 창문이란게 없으면 넘 불편할 것도 같다.


특히, 고객은 모든 데이터를 Excel상에서 보고싶어 한다.

이런이유로 자바 개발자라고 해도, 이 엑셀을 잘 활용하여, 고객만족의 기쁨을 누려야 할 것이다.


자바로 엑셀을 핸들링 할 수 있는 방법은 크게 두가지로 나누어 진다.

1. Java Excel API

2. POI


흔히 POI를 엑셀을 핸들링 하기 위한 것으로만 오해하기 쉬운데,
POI 프로젝트는 마이크로소프트 OLE 2 복합도큐먼트포맷형식의 파일을 순수 자바를 이용하여 핸들링하는 APIs로 구성되어있다.
OLE 2 복합도큐먼트포맷형식의 파일은 마이크로소프트 엑셀 혹은 워드파일 등의 대부분의 오피스파일들을 나타낸다.


일반적으로 엑셀에 대한 핸들링만을 수행할 때에는 Jxl을 권장한다.
엑셀을 핸들링 할 때 엑셀에서 가장 작은 단위는 알고 있듯이 "셀"이다.
모든 작업은 이 셀을 중심으로 이루어진다.



주의할 점)

1) 엑셀 쉬트상에 "C15"라는 셀에 데이터가 있다고 가정하자.( 15행 C열을 나타낸다.)
이 때 Jxl에서는 A1( 1행 A열)부터 C15까지는 실제 데이터가 없을 경우에라도 null이 아닌 빈데이터가 있다고 인식한다.
즉 D열 이상이나, 16행 이상을 접근 할 때에 null로 인식한다.

하지만 POI에서는 C15 이내에 있다 하더라도 실제 데이터가 없을 때에는 null로 인식한다.


2) Jxl에서는 각 셀의 데이터 타입을 실제 엑셀 파일에서 지정된 셀의 타입을 따르고,
POI에서는 셀의 실제 데이터 형을 따른다.
예를 들어 특정 셀의 타입을 text 로 잡아놓고, 데이터를 1234로 입력하면
Jxl에서는 "12345"로 인식하고, POI에서는 12345.00 이런식으로 인식한다.



EX ) Java Excel API를 이용한 Excel 읽기


import jxl.*;


// .. 중간생략


Workbook workbook = null;

Sheet sheet = null;

Cell cell = null;


try

{

//엑셀파일을 인식

workbook = Workbook.getWorkbook( new File( szFileName));


//엑셀파일에 포함된 sheet의 배열을 리턴한다.

//workbook.getSheets();


if( workbook != null)

{

//엑셀파일에서 첫번째 Sheet를 인식

sheet = workbook.getSheet(0);


if( sheet != null)

{

//셀인식 Cell a1 = sheet.getCell( 컬럼 Index, 열 Index);

//셀 내용 String stringa1 = a1.getContents();


//기록물철의 경우 실제 데이터가 시작되는 Row지정

int nRowStartIndex = 5;

//기록물철의 경우 실제 데이터가 끝 Row지정

int nRowEndIndex = sheet.getColumn( 2).length - 1;


//기록물철의 경우 실제 데이터가 시작되는 Column지정

int nColumnStartIndex = 2;

//기록물철의 경우 실제 데이터가 끝나는 Column지정

int nColumnEndIndex = sheet.getRow( 2).length - 1;


String szValue = "";


for( int nRow = nRowStartIndex; nRow <= nRowEndIndex; nRow++ )

{

for( int nColumn = nColumnStartIndex; nColumn <= nColumnEndIndex ; nColumn++)

{

szValue = sheet.getCell( nColumn, nRow).getContents();


System.out.print( szValue);

System.out.print( "\t" );

}

System.out.println();

}

}

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

}

}



EX ) POI를 이용한 Excel 파일 읽기


import org.apache.poi.hssf.usermodel.*;


// .. 중간 생략


HSSFWorkbook workbook = null;

HSSFSheet sheet = null;

HSSFRow row = null;

HSSFCell cell = null;


try

{

workbook = new HSSFWorkbook( new FileInputStream( new File( szFileName)));


if( workbook != null)

{

sheet = workbook.getSheetAt( 0);


if( sheet != null)

{


//기록물철의 경우 실제 데이터가 시작되는 Row지정

int nRowStartIndex = 5;

//기록물철의 경우 실제 데이터가 끝 Row지정

int nRowEndIndex = sheet.getLastRowNum();


//기록물철의 경우 실제 데이터가 시작되는 Column지정

int nColumnStartIndex = 2;

//기록물철의 경우 실제 데이터가 끝나는 Column지정

int nColumnEndIndex = sheet.getRow( 2).getLastCellNum();


String szValue = "";


for( int i = nRowStartIndex; i <= nRowEndIndex ; i++)

{

row = sheet.getRow( i);


for( int nColumn = nColumnStartIndex; nColumn <= nColumnEndIndex ; nColumn++)

{

cell = row.getCell(( short ) nColumn);


if( cell == null)

{

continue;

}

if( cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC)

{

szValue = String.valueOf( cell.getNumericCellValue());

}

else

{

szValue = cell.getStringCellValue();

}


System.out.print( szValue);

System.out.print( "\t" );

}

System.out.println();

}

}

else

{

System.out.println( "Sheet is null!!" );

}

}

else

{

System.out.println( "WorkBook is null!!" );

}

}

catch(Exception e)

{

e.printStackTrace();

}



EX ) Jxl을 이용하여 Excel에 데이터 저장하기


import jxl.*;


// .. 중간생략


WritableWorkbook workbook = null;

WritableSheet sheet = null;


File excelFile = new File( szFileName);

Label label = null;


long start = 0;

long end = 0;


try

{

for(int i = 0 ; i < 10; i++)

{

workbook = Workbook.createWorkbook( excelFile);

workbook.createSheet("sheet1", 0);

sheet = workbook.getSheet(0);

for( int j = 0; j < 10000; j++){

label = new Label( j, 0, "test cell");

sheet.addCell( label);

}


kidsbook.write();

kidsbook.close();

}

}

catch( Exception e)

{

}


// .. 중간생략





EX ) POI를 이용한 브라우저에서 Excel에 데이터 저장하여 보여주기




import org.apache.poi.hssf.usermodel.*;


// ... 생략


public void writeStream( PTSEvaluation[] arrPTSEvaluation) throws Exception

{

try

{


HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet = wb.createSheet( "new sheet");

HSSFRow row = null;

HSSFCell cell = null;

HSSFCellStyle style = null;


ServletOutputStream excelOut = ServiceContext.getResponse().getOutputStream();

ServiceContext.getResponse().setHeader( "Content-Disposition", "attachment;filename=EvaluationCompensationList.xls");

ServiceContext.getResponse().setContentType( MimeType.getMimeType( "xls"));


//로우 생성

row = sheet.createRow( ( short)0);

row.setHeightInPoints( 30);


//셀에 적용한 스타일을 생성한다.

style = PTSUtil.setExcelHeaderStyle( wb);


// 셀 생성

cell = row.createCell( (short)0);


//한글 처리

cell.setEncoding( HSSFCell.ENCODING_UTF_16);


//셀에 데이터 입력하기

cell.setCellValue( "값");


//셀에 스타일 적용하기

cell.setCellStyle(style);


//.. 중간생략 ( 이런 방식으로 로우와 셀을 증가 시키면서 작업을 수행하면 된다.


wb.write( excelOut);

excelOut.flush();

}

catch( Exception e)

{

e.printStackTrace();

throw e;

}

finally

{

ServiceContext.getResponse().getOutputStream().close();

}

}


// ... 생략






▣ ONE WAY, JESUS! [agapeuni™] - 2010년 10월 29일 ▣
다른 블로그 및 홈페이지에 게재할 경우에는 출처를 밝혀 주세요. *^^*
728x90
반응형
:
Posted by mapagilove
2012. 10. 15. 22:58

안드로이드 - WebsiteMonitoring 안드로이드 이야기2012. 10. 15. 22:58

728x90
반응형

원본출처: http://blog.daum.net/iryanza/7811238

WebsiteMonitoring_v1.1.1.zip

1. 버전 : v1.1.1

2. 다운로드 : 구글마켓 "Website Monitoring" 으로 검색

3. 기능

- 웹사이트 상태 확인(HttpClient)
- 알람 설정(AlarmManager)
- 재부팅 시 자동 알람 설정(android.permission.RECEIVE_BOOT_COMPLETED)
- URL 및 알람 주기 설정(SharedPreferences)

4. 참고
- NumberPicker : http://www.quietlycoding.com/?p=5

- 안드로이드펍 : http://www.androidpub.com/

5. 추후 기능 추가

- 웹사이트 다중 등록 및 모니터링

- 이메일 및 SMS 전송

v1.1.1

- 브라우저로 접속 확인

- 프로그래스

- 코드 개선 및 주석 추가

728x90
반응형
:
Posted by mapagilove
반응형