安卓開發數據可視化---導入數據到excel表格


現在是2021-03-12 00::39

剛剛完成了一個小軟件部分功能,現在把出現的問題總結如下:


一、首先要下載jar包

網址:https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl/2.6.12

把jar包添加到項目庫

然后需要在清單文件配置申請訪問SD卡的權限信息

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="replace"/>
android:requestLegacyExternalStorage="true"

這里我出現了一個問題
這個版本的jxl只可以支持解析后綴名為:.xls的文件,而且有一點要特別注意,文件格式的修改最好通過文件另存為的方式修改,
而不要直接在文件名上修改后綴名

這樣看起來是對的,其實文件內部結構已經被打亂。那么在調用方法
in=new File(fileName);
Workbook workbook = Workbook.getWorkbook(in);  的時候就會出現文件解析異常,這個錯誤不會在控制台輸出,是很隱蔽的錯誤。

二、軟件錯誤調試

當出現那種運行不報錯,數據沒有NULL異常的情況時,
可以使用一條語句進行分析,
使用Log.v()方法在控制台輸出一句話。
這樣就可以知道程序究竟在運行到哪一步出現了問題,導致結果

不是自己想要的。

三、清單文件
清單文件盡量少亂改動,注釋也盡量少加,因為一旦出現哪個地方多了個什么符號是很難發現的,而且軟件不會飄紅報錯。

四、獲取權限可以有代碼來體現
  前提是已經導入jar包並且在清單文件完成引用注冊
 1     //讀寫權限
 2     private static String[] PERMISSIONS_STORAGE     = {  3  Manifest.permission.READ_EXTERNAL_STORAGE,  4  Manifest.permission.WRITE_EXTERNAL_STORAGE};  5     //請求狀態碼
 6     private static int      REQUEST_PERMISSION_CODE = 1;  7 
 8   //寫在onCreate()
 9 if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { 10             if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 11                 ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE); 12  } 13  } 14   //這是一個回調方法,在第一次運行安裝軟件的時候會在控制台輸出一句話 15 
16   //回調訪問權限
17  @Override 18         public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 19             super.onRequestPermissionsResult(requestCode, permissions, grantResults); 20             if (requestCode == REQUEST_PERMISSION_CODE) { 21                 for (int i = 0; i < permissions.length; i++) { 22                     Log.i("MainActivity", "申請的權限為:" + permissions[i] + ",申請結果:" + grantResults[i]); 23  } 24  } 25     }

 

五、說一下實現過程中的路徑存儲問題

因為要獲取的是手機存儲位置,所以可能不如電腦那么清晰,我的手機是榮耀。

首先我們要清楚一點,就是

File file =
new File(Environment.getExternalStoragePublicDirectory(Environment.
DIRECTORY_DOWNLOADS), "success_0.xls");//參數2是文件名稱

 下面給出幾種方法獲取路徑

tips:一般手機sd卡路徑是 /storage/emulated/0

 獲取 /storage/emulated/0

1 public static boolean sdCardIsAvailable() { 2  //首先判斷外部存儲是否可用
3  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 4   File sd = new File(Environment.getExternalStorageDirectory().getPath()); 5   Log.e("qq", "sd = " + sd);//sd = /storage/emulated/0
6   return sd.canWrite(); 7  } else { 8   return false; 9  }

 獲取 /storage/emulated/0(類似上面)

 1 public String getSDPath() {  2  File sdDir = null;  3   //判斷sd卡是否存在
 4 boolean sdCardExist = Environment.getExternalStorageState()  5 .equals(android.os.Environment.MEDIA_MOUNTED);  6 if (sdCardExist) {  7 sdDir = Environment.getExternalStorageDirectory();//獲取根目錄
 8 Log.e("qq", "外部存儲可用..." + sdDir.toString());  9 } 10 return sdDir.toString(); 11 } 12 //使用
13 private void saveInRoot() { 14  if (getSDPath()!=null) { 15   //String fileName = getSDPath() + "/"; 16   //File file = new File(fileName,"123111");//參數 17   //if (!file.mkdir()) { 18    //Toast.makeText(ExternalStoreActivity.this, "目錄已存在...", Toast.LENGTH_SHORT).show(); 19   //} else { 20    //Toast.makeText(ExternalStoreActivity.this, "創建新目錄...", Toast.LENGTH_SHORT).show(); 21   //}
22  } 23 }

獲取手機指定目錄(也是我用的這一種)

 1 public File getAlbumStorageDir(String fileName) {  2  // Get the directory for the user's public pictures directory.  3  //在 Environment.DIRECTORY_DOWNLOADS 目錄下創建名為fileName的文件夾 刷新查看
 4  File file =
 5   new File(Environment.getExternalStoragePublicDirectory(Environment.  6    DIRECTORY_DOWNLOADS), fileName);//參數2是文件名稱  7  //mkdirs()可以創建多級目錄  8  //mkdir()只能創建一級目錄
 9  if (!file.mkdir()) { 10   Log.e(LOG_TAG, "Directory not created"); 11   Toast.makeText(ExternalStoreActivity.this, "目錄已存在...", Toast.LENGTH_SHORT).show(); 12  } else { 13   Toast.makeText(ExternalStoreActivity.this, "創建新目錄...", Toast.LENGTH_SHORT).show(); 14  } 15  return file; 16 }

上述代碼來自腳本之家  https://www.jb51.net/article/144850.htm

 

Tomorrow the birds will sing.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM