iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 18
0
Mobile Development

Andriod Studio 菜鳥的學習分享系列 第 18

[Android Studio菜鳥的學習分享]檔案選擇器應用(下)-匯出CSV檔案

CSV全名是Comma Separated Value
它是一種用逗號作為分隔的檔案類型,
常用於資料庫資料的匯入與匯出,
非常簡單、方便的讓程式讀取,
且因為簡潔,
所以不需要多龐大的系統便能開啟CSV檔進行檔案編輯。

今天要接續昨天的匯入分享,
分享如何將APP內的資料匯出成CSV檔。
建議先看完
[Android Studio菜鳥的學習分享]使用他人製作元件模板

[Android Studio菜鳥的學習分享]檔案選擇器應用(上)-匯入CSV檔案
再服用這篇分享~


目標:

1. 按下 匯入檔案:

匯入CSV檔的資料至 csvArrayList

2. ArrayList - csvArrayList

為今天我檔案匯入與匯出的變數。

3. 按下 匯出檔案:

csvArrayList 內的資料匯出至指定的資料夾,
檔案名稱為 csvDataList.csv


結果預覽:

1. 匯入檔案-testCsv.csv

https://ithelp.ithome.com.tw/upload/images/20200917/20129524CVy19DpKBz.jpg

2. ArrayList - csvArrayList (陣列內容)

csvArrayList.get(0);
csvArrayList.get(1);
csvArrayList.get(2);
csvArrayList.get(3);
csvArrayList.get(4);
csvArrayList.get(5);

csvArrayList.get(0) -> 1
csvArrayList.get(1) -> apple
csvArrayList.get(2) -> 2
csvArrayList.get(3) -> banana
csvArrayList.get(4) -> 3
csvArrayList.get(5) -> cherry

3. 匯出檔案-csvDataList.csv

https://ithelp.ithome.com.tw/upload/images/20200917/20129524NArSFmah5G.jpg


activity_main.xml

https://ithelp.ithome.com.tw/upload/images/20200917/20129524mAZQtwu2mu.jpg


WriteCSVThread.java

https://ithelp.ithome.com.tw/upload/images/20200917/20129524nENVxIx1oc.jpg

Step01-繼承Thread:

public class WriteCSVThread extends Thread{

}

Step02-新增變數:

  1. data:
    要匯出的資料
  2. fileName:
    自訂想要匯出的檔案名稱
  3. folder:
    要匯出至的資料夾
  4. stringBuilder:
    字串創建器
ArrayList<String> data;
String fileName = "csvDataList.csv";
String folder;
StringBuilder stringBuilder;

Step03-新增檢查資料夾是否存在方法:

    private void createFolder(){
        File folderPath = new File(folder);
        boolean folderExists = folderPath.exists();
        if(!folderExists){
            folderPath.mkdir();
        }
    }

Step04-新增全域方法:

將取得的資料與要匯出至的資料夾放入變數data & folder

public WriteCSVThread(ArrayList<String> data, String folder){
    this.data = data;
    this.folder = folder;
}

Step05-新增執行方法:

@Override
   public void run(){
       super.run();
       createFolder();

   }

Step06-新增檔案路徑:

File.separator => /

File newFile = new File(folder + File.separator + fileName);

Step07-保險起見加一道try...catch:

try{

}
catch (Exception error){
    error.printStackTrace();
}

Step08-使用內建檔案輸出器FileOutputStream:

FileOutputStream fileOutputStream = new FileOutputStream(newFile,false);
stringBuilder = new StringBuilder();

Step09-將資料之間加入逗點分隔:

for (String arrayData:data){
    stringBuilder.append(arrayData).append(",");
}    

Step10-資料完結加個換行符號:

stringBuilder.append("\n");

Step11-寫入檔案:

fileOutputStream.write(stringBuilder.toString().getBytes());
fileOutputStream.flush(); //齊平

Step12-關閉檔案輸出器:

fileOutputStream.close();

MainActivity.java

https://ithelp.ithome.com.tw/upload/images/20200917/20129524duLWLg6YB2.jpg

https://ithelp.ithome.com.tw/upload/images/20200917/20129524pnAoBmVTeQ.jpg

(1)製作方法saveCsv

Step01-創建方法openCsv:

folderName方便放入資料夾位置

private void saveCsv(String folderName){

}

Step02-檢查是否有選擇匯入檔案:

if(folderName != ""){

}
else {
    textOutput.setText("請選擇匯出路徑!!");
}

Step03-檢查csvDataList有無資料可以匯出:

if(csvDataList.isEmpty()){
    textOutput.setText("無資料!!");
}
else {

}

Step04-執行WriteCSVThread:方法開始匯出:

private WriteCSVThread writeCSVThread;
writeCSVThread = new WriteCSVThread(csvDataList,folderName);
writeCSVThread.run();
textOutput.setText("匯出成功!!");

(2)按鈕監聽器內容

以下介紹請看
[Android Studio菜鳥的學習分享]使用他人製作元件模板

btnFileOutput.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(permissionGranted()) {
            DirectoryPickerDialog directoryPickerDialog = new DirectoryPickerDialog(MainActivity.this,
                    () -> textOutput.setText("Canceled!!"),
                    files -> saveCsv(files[0].getPath()));
            directoryPickerDialog.show();
        }
        else{
            requestPermission();
        }
    }
});

(3)檢查權限方法 & 權限詢問給予視窗

以下介紹請看
[Android Studio菜鳥的學習分享]使用他人製作元件模板

 private boolean permissionGranted(){
     return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
             && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
 }
 private void requestPermission(){
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
 }

上一篇
[Android Studio菜鳥的學習分享]檔案選擇器應用(上)-匯入CSV檔案
下一篇
[Android Studio菜鳥的學習分享]通知訊息-Notification
系列文
Andriod Studio 菜鳥的學習分享30

尚未有邦友留言

立即登入留言