现在是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. spring boot整合spring security自定义登录跳转地址

    说明 在博客用户登录后我想跳转到各自用户的博客首页,我们知道这个地址是动态的. 例如: http://localhost:8080/blog/zhangsan, 每个用户地址不一样.这时候我就用到了自 ...

  2. golang微服务实践:分布式链路追踪系统-jaeger安装与简单使用

    简介 jaeger是一个比较有名的分布式链路追踪系统,底层用golang实现,兼容opentracing标准. 文档地址:docs github地址:github 官网:website blog:bl ...

  3. 【Azure 应用服务】App Servie网站报403 ModSecurity Action错误

    问题描述 App Service 部署应用程序,然后通过App Gateway(WAF) 提供公网访问,但是一直遇见403报错,刷新页面,回退,重新Web页面能缓解403问题. 问题分析 通过浏览器F ...

  4. 【Azure Redis 缓存】Azure Cache for Redis有默认备份可以用于恢复么?

    问题描述 Azure Cache for Redis有默认备份可以用于恢复么? 答: 只有高级版Redis有. 问题原因 Azure Cache for Redis有不同的版本定价层(基本 Basic ...

  5. 【Azure 事件中心】Flink消费Event Hub中事件, 使用Azure默认示例代码,始终获取新产生的事件,如何消费旧事件呢?

    问题描述 根据Azure Event Hub示例文档,[将 Apache Flink 与适用于 Apache Kafka 的 Azure 事件中心配合使用],配置好 consumer.config 文 ...

  6. C++//常用排序算法 sort //打乱 random_shuffle //merge 两个容器元素合并,并储存到另一容器中(相同的有序序列) //reverse 将容器内的元素进行反转

    1 //常用排序算法 sort //打乱 random_shuffle 2 //merge 两个容器元素合并,并储存到另一容器中(相同的有序序列) 3 //reverse 将容器内的元素进行反转 4 ...

  7. C++ //类模板中成员函数创建时机 //类模板中成员函数和普通类中成员函数创建时机是有区别的: //1.普通类中的成员函数一开始就可以创建 //2.类模板中的成员函数在调用时才创建

    1 //类模板中成员函数创建时机 2 //类模板中成员函数和普通类中成员函数创建时机是有区别的: 3 //1.普通类中的成员函数一开始就可以创建 4 //2.类模板中的成员函数在调用时才创建 5 6 ...

  8. 玩转Vue3之Composables

    前言 Composables 称之为可组合项,熟悉 react 的同学喜欢称之为 hooks ,由于可组合项的存在,Vue3 中的组件之间共享状态比以往任何时候都更容易.这种新范例引入了一种更有组织性 ...

  9. 十步带你用IDEA创建一个WEB项目及部署(Tomcat)

    部署一个web项目首先需要安装Tomcat,还没安装的朋友们可以看一下我这个博客: https://www.cnblogs.com/deyo/p/17241878.html 第一步:打开Idea-新建 ...

  10. Zabbix“专家坐诊”第190期问答汇总

    问题一 Q:请问为啥用拓扑图监控交换机接口流量,获取不到数据,显示未知,键值也没错 ,最新数据也能看到,是什么原因呢? A:把第一个值改成主机名. 问题二 Q:请问下zabbix server 有什么 ...