现在是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 - MultiByteToWideChar的示例

    该函数经常被用来处理UTF-8和ANSI格式的字符串,将它们转换为宽字节(UTF-16) #include <iostream> #include <Windows.h> #i ...

  2. 硬件开发笔记(九): 硬件开发基本流程,制作一个USB转RS232的模块(八):创建asm1117-3.3V封装库并关联原理图元器件

    前言   有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了一个创建asm1117-3.3V封 ...

  3. django学习第七天---创建多表结构,创建第三张表的三种方式,创建模型类时的一些元信息配置,多表增加

    图书管理系统作业知识点整理 知识点1: print(request.POST.dict())#dict()方法能将QueryDict类型数据转换为普通字典类型数据 传数据时,可以用**{}打散的方式来 ...

  4. 【Azure API 管理】 为APIM创建一个审批订阅申请的RBAC角色,最少的Action内容是什么呢?

    问题描述 在使用APIM服务中,需要为专门的一组用户赋予特殊的权限:审批APIM用户的对产品的订阅.需要自定义一个RBAC角色,那么如何来设置最少的Action满足需求呢? 问题解答 要对APIM订阅 ...

  5. 千卡利用率超98%,详解JuiceFS在权威AI测试中的实现策略

    2023 年 9 月,AI 领域的权威基准评测 MLPerf 推出了 Storage Benchmark.该基准测试通过模拟机器学习 I/O 负载的方法,在不需要 GPU 的情况下就能进行大规模的性能 ...

  6. SemanticKernel如何基于自有数据聊天

    效果 使用gpt-3.5-turbo的效果 什么是向量数据库? 向量数据库是一种专为处理高维向量数据而设计的数据库系统.与传统的关系型数据库不同,向量数据库专注于存储和查询向量数据,例如图像.音频.文 ...

  7. .Java 关于继承小练习3

    1 package com.bytezero.inherit3; 2 3 public class CylinderTest 4 { 5 public static void main(String[ ...

  8. Spring事务(三)-事务传播行为

    在Spring里,一个事务方法被另外一个事务方法调用时,两个方法的事务应该如何进行,说白话一点,就是说当出现异常需要回滚时,各个方法的数据操作是否要全部回滚,事务传播行为就是决定了这样的一个处理结果. ...

  9. 【mac】Alfred 无法调用Terminal

    原因:是从mac app商店安装的Alfred class 解决方案:建议从官网下载安装:https://www.alfredapp.com/ 参考:https://www.alfredforum.c ...

  10. github拉项目显示timeOut

    参考:https://blog.csdn.net/qq_37424778/article/details/132018804 自己尝试在github上拉项目,但是报错LibreSSL SSL_read ...