安卓开发数据可视化---导入数据到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.

posted @   靠谱杨  阅读(1075)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示