안드로이드 개발 엑셀 파일 생성 및 데이터 불러오는 방법 |
환경: Android Studio |
안드로이드 앱에서 만든 데이터는 가공해서 엑셀 파일로 출력이 가능합니다. 안드로이드 SDK에서 제공하는 것이 아니라 아파치(Apache) 에서 제공하는 라이브러리를 사용해야 합니다. 스마트폰에 설치한 엑셀 프로그램만 있으면 데이터를 보거나 편집할 수 있습니다. 또한 좀더 편한 작업을 위해 PC 로 파일을 옮겨서 작업하는 것도 가능합니다.
▼ 먼저 안드로이드 앱에서 원하는 데이터를 엑셀 파일로 저장하기 위해서는 라이브러리가 있어야 합니다. 아래 링크 주소를 따라 아파치 홈페이지에 접속하면 라이브러리 파일을 받을 수 있습니다. 화면에서 Binary Distribution 에 링크를 클릭하면 상세 페이지로 이동합니다.
http://poi.apache.org/download.html#POI-3.17
▼ 그림처럼 링크 주소를 클릭해서 mirror 사이트에 올라가 있는 파일을 다운받습니다.
▼ 압축을 해제하면 poi jar 파일을 볼 수 있습니다. 해당 파일을 안드로이드 프로젝트로 옮기겠습니다.
▼ 안드로이드 스튜디오의 프로젝트 폴더에 보시면 app 바로 아래 libs 가 있을 겁니다. 원하는 외부 라이브러리를 이곳에 추가해야 합니다. 복사한 poi jar 파일을 붙여넣기 합니다. Copy 팝업창이 뜨면 OK 버튼을 눌러 복사를 시작합니다. 특별히 이름은 변경할 필요가 없습니다.
▼ 외부 라이브러리를 붙여넣었다고 해서 바로 사용할 수 없습니다. 프로젝트가 라이브러리를 인식할 수 있도록 별도의 작업이 필요합니다. 오른쪽 마우스를 눌러 [Add As Library] 메뉴를 선택하면 끝납니다.
▼ 화면 시나리오는 다음과 같습니다.
1. 아이디와 이름을 입력하고 LISTADD 를 누르면 바로 아래 ListView 로 추가
2. EXCELSAVE 버튼을 누르면 ListView 에 추가한 데이터를 Excel 파일로 출력
시나리오 대로 아이디와 이름을 입력하고 LISTADD 에 추가합니다.
▼ 추가한 데이터를 엑셀로 출력하기 위해 EXCELSAVE 버튼을 클릭합니다. 화면에 나타난 저장 메시지에는 파일의 위치가 나옵니다. 파일은 앱 패키지 아래 files 폴더에 있습니다.
▼ 엑셀 파일을 클릭해 보세요. 사용할 애플리케이션 목록에는 자신의 스마트폰에 설치된 엑셀 뷰어가 모두 나타납니다. 그 중 하나를 선택합니다. 그러면 ListView 에 추가한 데이터를 모두 볼 수 있을 겁니다.
▼ 이제 화면 구성과 입력한 데이터를 엑셀 파일로 출력하는 함수를 만들어 보겠습니다. 엑셀 파일을 생성하고 데이터를 추가하는 함수는 다음과 같습니다. HSSFWorkbook 클래스를 이용해서 Wrokbook 을 생성합니다. 그리고 Wrokbook 으로 시트, 행, 열을 만들어 데이터를 추가합니다.
private void saveExcel(){ Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet(); // 새로운 시트 생성 Row row = sheet.createRow(0); // 새로운 행 생성 Cell cell; // 1번 셀 생성과 입력 cell = row.createCell(0); cell.setCellValue("아이디"); // 2번 셀에 값 생성과 입력 cell = row.createCell(1); cell.setCellValue("이름"); for(int i = 0; i < mItems.size() ; i++){ // 데이터 엑셀에 입력 row = sheet.createRow(i+1); cell = row.createCell(0); cell.setCellValue(mItems.get(i).getId()); cell = row.createCell(1); cell.setCellValue(mItems.get(i).getName()); } File excelFile = new File(getExternalFilesDir(null),"user.xls"); try{ FileOutputStream os = new FileOutputStream(excelFile); workbook.write(os); }catch (IOException e){ e.printStackTrace(); } Toast.makeText(getApplicationContext(),excelFile.getAbsolutePath()+"에 저장되었습니다",Toast.LENGTH_SHORT).show(); }
▼ 화면에서 이름과 아이디를 입력하고 ListView 에 추가하기 위한 Adapter 전체 소스입니다. ArrayAdapter 의 Item 클래스는 사용자 정보를 담을 Model 클래스 입니다.
import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import java.util.ArrayList; import display.samsung.workplace.R; import display.samsung.workplace.model.Item; import static android.content.Context.LAYOUT_INFLATER_SERVICE; public class ItemAdapter extends ArrayAdapter<Item> { private ArrayList<Item> mItems; private Context mContext; public ItemAdapter(@NonNull Context context, int resource, ArrayList<Item> items) { super(context, resource, items); mItems = items; mContext = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(LAYOUT_INFLATER_SERVICE); View rowView= inflater.inflate(R.layout.item, null, true); TextView id = (TextView) rowView.findViewById(R.id.tv_item_id); TextView name = (TextView) rowView.findViewById(R.id.tv_item_name); id.setText(mItems.get(position).getId() ); name.setText(mItems.get(position).getName()); return rowView; } class ItemViewHolder extends RecyclerView.ViewHolder{ private TextView id; private TextView name; ItemViewHolder(View itemView) { super(itemView); id = itemView.findViewById(R.id.tv_item_id); name = itemView.findViewById(R.id.tv_item_name); } } }
▼ 사용자 정보를 저장할 Model 클래스입니다.
public class Item { private String id; private String name; public Item(String id, String name){ this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
▼ 다음은 전체 Activity 소스 입니다.
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import display.samsung.workplace.Adapter.ItemAdapter; import display.samsung.workplace.model.Item; public class ExcelActivity extends AppCompatActivity { EditText mEdtId; EditText mEdtName; ListView mLvData; ArrayList<Item> mItems; ItemAdapter mItemAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_excel); mEdtId = (EditText) findViewById(R.id.edt_id); mEdtName = (EditText) findViewById(R.id.edt_name); mLvData = (ListView) findViewById(R.id.lv_data); mItems = new ArrayList<Item>(); mItemAdapter = new ItemAdapter(this, R.layout.item, mItems); mLvData.setAdapter(mItemAdapter); } // 리스트 Excel 저장 public void onExcelSave(View v){ // 엑셀에 저장한다. saveExcel(); } // 입력한 값 리스트에 추가 public void onListAdd(View v){ // 리스트에 추가한다. String tvId = mEdtId.getText().toString(); String tvName = mEdtName.getText().toString(); mItems.add(new Item(tvId, tvName)); // ListView 갱신 mItemAdapter.notifyDataSetChanged(); // 초기화 mEdtId.setText(""); mEdtName.setText(""); } private void saveExcel(){ Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet(); // 새로운 시트 생성 Row row = sheet.createRow(0); // 새로운 행 생성 Cell cell; // 1번 셀 생성과 입력 cell = row.createCell(0); cell.setCellValue("아이디"); // 2번 셀에 값 생성과 입력 cell = row.createCell(1); cell.setCellValue("이름"); for(int i = 0; i < mItems.size() ; i++){ // 데이터 엑셀에 입력 row = sheet.createRow(i+1); cell = row.createCell(0); cell.setCellValue(mItems.get(i).getId()); cell = row.createCell(1); cell.setCellValue(mItems.get(i).getName()); } File excelFile = new File(getExternalFilesDir(null),"user.xls"); try{ FileOutputStream os = new FileOutputStream(excelFile); workbook.write(os); }catch (IOException e){ e.printStackTrace(); } Toast.makeText(getApplicationContext(),excelFile.getAbsolutePath()+"에 저장되었습니다",Toast.LENGTH_SHORT).show(); } }
▼ Activity 를 구현한 화면입니다.
activity_excel.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="display.samsung.workplace.ExcelActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/tv_id" android:layout_width="30dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="아이디"/> <EditText android:id="@+id/edt_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="4"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/tv_name" android:layout_width="30dp" android:layout_height="wrap_content" android:gravity="center" android:layout_weight="1" android:text="이름"/> <EditText android:id="@+id/edt_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="4"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ListAdd" android:onClick="onListAdd" android:gravity="center" android:layout_weight="1"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ExcelSave" android:onClick="onExcelSave" android:gravity="center" android:layout_weight="1"/> </LinearLayout> <ListView android:id="@+id/lv_data" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
'안드로이드 개발' 카테고리의 다른 글
안드로이드 개발 Fragment 화면 구성하는 방법 - FragmentActivity 로 화면 구성 (0) | 2018.09.18 |
---|---|
안드로이드 개발 Fragment 와 Activity 의 통신하는 방법 (1) | 2018.08.31 |
안드로이드 개발 ArrayList 배열 개체를 JSON 으로 변경하는 방법 (1) | 2018.08.28 |
안드로이드 개발 간단하게 위젯 만드는 방법 (0) | 2018.08.15 |
안드로이드(Android) 개발 Timer 구현하는 방법 (0) | 2018.07.05 |
안드로이드 개발 인터넷 연결(WI-FI, 3G, 4G) 구분해서 연결 확인하는 방법 (0) | 2018.07.02 |
안드로이드 개발 SharedPreferences 객체와 배열 저장을 위한 gson 사용하는 방법 (3) | 2018.04.13 |
안드로이드 개발 에뮬레이터 앱 db 조회 하는 방법 (0) | 2018.04.11 |