现在是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.

安卓开发数据可视化---导入数据到excel表格的更多相关文章

  1. 两个不同的账户登录两个浏览器,导入同样的excel表格。数据出现重复

    1.场景: 两个不同的账户登录两个浏览器,导入同样的excel表格.业务逻辑已经有验重校验,但数据仍然出现重复,锁定是并发问题导致. 2.参考博客: https://cloud.tencent.com ...

  2. python 数据可视化 -- 读取数据

    从 CSV 文件中读取数据(CSV) import sys import csv # python 内置该模块 支持各种CSV文件 file_name = r"..\ch02_data\ch ...

  3. sqlloader导出数据和导入数据

    分类: Oracle 忙了一天终于把sqlloader导出数据和导入数据弄清楚了,累死俺了... 这个总结主要分为三个大部分,第一部分(实例,主要分两步),第二部分(参数小总结),第三部分(完全参数总 ...

  4. oracle中使用impdp数据泵导入数据提示“ORA-31684:对象类型已经存在”错误的解决

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/47448751 本文出自[我是干勾鱼的博客] oracle中使用impdp数据泵导 ...

  5. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  6. R—读取数据(导入csv,txt,excel文件)

    导入CSV.TXT文件 read.table函数:read.table函数以数据框的格式读入数据,所以适合读取混合模式的数据,但是要求每列的数据数据类型相同. read.table读取数据非常方便,通 ...

  7. 吴裕雄--天生自然 R语言开发学习:导入数据

    2.3.6 导入 SPSS 数据 IBM SPSS数据集可以通过foreign包中的函数read.spss()导入到R中,也可以使用Hmisc 包中的spss.get()函数.函数spss.get() ...

  8. 可视化漂亮大屏Excel表格模板 Excel漂亮美观看板 excel电视看板 excel精美数据展示看板

    企业管理者喜欢大屏看板主要是因为它可以提供以下几个方面的优势: 增强企业形象:大屏看板可以将企业的信息和广告以更加生动.直观的方式呈现出来,提高企业形象和知名度. 提高工作效率:大屏看板可以在企业内部 ...

  9. SQL Server 2008 导出数据与导入数据任务介绍

    一. 实例数据库介绍 源数据库Test_Other_DB:存在tb_Class,tb_Student,tb_TestTable三张表. 目标数据库TestDB_Output:空库,不含任何表. 二. ...

  10. MySQL导出数据,并转存到Excel表格中

    从数据库中导出数据的方法,这里就不提了,网上有很多方法,如果闲麻烦,可以看一下这个:mysql导出数据 其实使用最简单的下面这个语句: mysql > select * from demo in ...

随机推荐

  1. win32 - 按文件的创建日期排序

    因项目中使用文件的创建日期来命名文件,所以不用额外查找文件的创建日期再进行排序,记录一下 bool AscendingSortByCreationTime(const std::wstring& ...

  2. 搭建Windows环境下的多功能免费SSH客户端

    关于Windows下的SSH客户端工具,可以有许多选择,从开源免费到商业收费的,零零总总. 免费版: Putty就是最简单的SSH客户端,非常轻量级. Electerm是一个开源可免费使用的跨平台SS ...

  3. React native随笔——解决navigation导航栏 android和ios样式不统一

    navigation导航栏存在android和ios样式不统一的问题.Android手机上标题不居中,导航栏与状态栏重合. 解决方法为在navigationOptions中进行如下配置. 一.Andr ...

  4. mac更新系统后,提示xcrun的错误问题

    pycharm运行代码终端报错: xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), ...

  5. Redis加Lua脚本实现分布式锁

    先讲一下为什么使用分布式锁: 在传统的单体应用中,我们可以使用Java并发处理相关的API(如ReentrantLock或synchronized)来实现对共享资源的互斥控制,确保在高并发情况下同一时 ...

  6. 第131篇:如何上传一个npm包

    好家伙, NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准.  NPM是世界上最大的软件注册表. 1.首先我们 ...

  7. CentOS系统下,配制nginx代理

    1.安装: yum install nginx 2.证书文件位置: a. 创建https证书文件夹:/etc/nginx/ssl b. 上传两个证书文件到/etc/nginx/ssl 3.在/etc/ ...

  8. c语言四则运算小程序

    本文源程序代码来源于csdn一位博主: 文章链接:http://t.csdnimg.cn/L29fs 原程序简洁凝练,以简短的代码写出了一个加法运算器. 以下是运行结果(本文全程用visual stu ...

  9. Java开发中String.format的妙用

    format方法是String类中的一个方法,主要作用是用来格式化字符串.当前做 的一个功能当中,刚好用到了这个方法,代码处理起来非常简便.因此就写篇博客 记录下来. 分析使用场景:前端App需要根据 ...

  10. 摆脱鼠标系列 - 百度搜索 - 火柴 - 快捷键 Ctrl两次

    摆脱鼠标系列 - 百度搜索 - 火柴 - 快捷键 Ctrl两次 有两款软件 utools 和 火柴,试用后觉得火柴符合试用功能 这里只用网络搜索 其他功能均不用 搜索用双核浏览器 因为用的老的chro ...