zoukankan      html  css  js  c++  java
  • 安卓开发数据可视化---导入数据到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.

  • 相关阅读:
    HDU 2089 不要62 数位dp入门
    The Chosen One
    linux100讲——12 创建和删除目录
    linux100讲——80 系统函数库介绍
    linux100讲——03 什么是linux
    linux100讲——71 if-else判断的使用
    查看僵尸进程
    虚拟机出问题 Oh no,something has gone wrong! 解决方法
    禅道开源手册
    多线程启动selenium,报NameError: name '__file__' is not defined
  • 原文地址:https://www.cnblogs.com/rainbow-1/p/14521578.html
Copyright © 2011-2022 走看看