excel函数怎么用android,在Android中阅读Excel

对于那些需要使用全功能excel文件(即绘图,VBA等等)的应用程序,你应该使用Apache POI,它很简单,但现在仍然是最好的解决方案.

但是,如果您只需要阅读Excel,那么使用JavaScript解决方案可能会更好.使用js-xlsx库,您可以将Excel文件传输到JSON.库大小很小,只有395KB(仅包括xlsx.core.min.js)

我相信这不是最好的解决方案:

– WebView需要使用UI Thread,它可能会在读取大型Excel文件时阻止UI.

– 性能问题

但您可以将其更改为其他JavaScript引擎(如Rhino或V8)以解决这些问题.

这是代码

回调接口:

public interface ExcelReaderListener {

void onReadExcelCompleted(List stringList);

}

主要活动:

private ProgressDialog progressDialog;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

new AlertDialog.Builder(MainActivity.this)

.setMessage("message")

.setTitle("title")

.setPositiveButton(R.string.ok,new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,int which) {

dialog.dismiss();

new FileChooser(MainActivity.this,new String[]{"xls","xlsx"})

.setFileListener(new FileChooser.FileSelectedListener() {

@Override

public void fileSelected(File file) {

progressDialog = new ProgressDialog(MainActivity.this);

progressDialog.setTitle("title");

progressDialog.setMessage("message");

progressDialog.setIndeterminate(true);

progressDialog.setCanceledOnTouchOutside(false);

Toast.makeText(MainActivity.this,file.getName(),Toast.LENGTH_SHORT).show();

String filePath = file.getAbsolutePath();

ExcelReaderListener excelReaderListener = MainActivity.this;

progressDialog.show();

try {

final WebView webView = new WebView(MainActivity.this);

new JSExcelReader(filePath,webView,excelReaderListener);

} catch (Exception ex) {

Log.e("Import excel error",ex.getMessage());

}

}

})

.showDialog();

}

})

.show();

}

@Override

public void onReadExcelCompleted(List stringList) {

Toast.makeText(MainActivity.this,"Parse Completed",Toast.LENGTH_SHORT).show();

if (progressDialog != null && progressDialog.isShowing()) {

progressDialog.dismiss();

}

// Write into DB

...

}

用户选择excel文件的界面:

https://rogerkeays.com/simple-android-file-chooser

JSExcelReader :(读取excel并将其转换为ArrayList的核心部分)

public class JSExcelReader {

private ExcelReaderListener callback;

public JSExcelReader(String filePath,final WebView webView,ExcelReaderListener callback) {

this.callback = callback;

File file = new File(filePath);

try (InputStream is = new FileInputStream(file)) {

// convert file to Base64

if (file.length() > Integer.MAX_VALUE)

Log.e("File too big","file too big");

byte[] bytes = new byte[(int) file.length()];

int offset = 0;

int numRead;

while (offset < bytes.length &&

(numRead = is.read(bytes,offset,bytes.length - offset)) >= 0) {

offset += numRead;

}

if (offset < bytes.length)

throw new Exception("Could not completely read file");

final String b64 = Base64.encodeToString(bytes,Base64.NO_WRAP);

// feed the string into webview and get the result

WebSettings webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);

webView.loadUrl("file:///android_asset/AndroidParseExcel.html");

webView.setWebViewClient(new WebViewClient() {

public void onPageFinished(WebView view,String url) {

webView.evaluateJavascript("convertFile('" + b64 + "');",new ValueCallback() {

@Override

public void onReceiveValue(String value) {

parseJSON(value);

}

});

}

});

} catch (Exception ex) {

Log.e("Convert Excel failure",ex.getMessage());

}

}

private void parseJSON(String jsonString) {

try {

// return value is something like "{\n\"Sheet1\":\n[\"title\"...

// you need to remove those escape character first

JSONObject jsonRoot = new JSONObject(jsonString.substring(1,jsonString.length() - 1)

.replaceAll("\\\\n","")

.replaceAll("\\\\\"","\"")

.replaceAll("\\\\\\\\\"","'"));

JSONArray sheet1 = jsonRoot.optJSONArray("Sheet1");

List stringList = new ArrayList<>();

JSONObject jsonObject;

for (int i = 0; i < sheet1.length(); i++) {

jsonObject = sheet1.getJSONObject(i);

stringList.add(jsonObject.optString("title"));

}

callback.onReadExcelCompleted(stringList);

} catch (Exception ex) {

Log.e("Error in parse JSON",ex.getMessage());

}

}

}

AndroidParseExcel.html :(你应该把这个和JavaScript库放到资产文件夹中)

"use strict";

var X = XLSX;

function convertFile(b64data) {

var wb = X.read(b64data,{type: 'base64',WTF: false});

var result = {};

wb.SheetNames.forEach(function(sheetName) {

var roa = X.utils.sheet_to_row_object_array(wb.Sheets[sheetName]);

if(roa.length > 0){

result[sheetName] = roa;

}

});

return JSON.stringify(result,2,2);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core2.0 Memcached.ClientLibrary

Memcached的.net core2.0驱动dll 引用了nuget包log4net和SharpZipLib.NETStandard nuget包名为Memcached.ClientLibrary.NetStandard 可以直接通过nuget搜索安装 地址https://www.nuget.org/packages/Memcached.ClientLibrary.NetStandard/ 源码详见 https://github.com/wa…

python设置格式模板

# -*- coding: utf-8 -*- """ __mktime__ ${DATE} __author__ ${USER} __filename__ ${NAME} """ if __name__ "__main__": pass 转载于:https://www.cnblogs.com/BigFishFly/p/6580692.html

给android应用程序默认的菜单添加一个菜单项关于,android菜单详解

1.菜单的生成对一个Android应用中的每一个屏幕&#xff0c;也就是说&#xff0c;对每一个Activity类&#xff0c;都会拥有一个默认菜单。在Activity类中&#xff0c;定义了几个与菜单有关的方法&#xff0c;供继承于Activity类的子类去重载&#xff0c;从而定制我们自己的菜单。…

Eclipse Memory Analysis分析Java运行内存情况

获取java进程的dump文件jmap -dump:formatb,file<dumpfile.hprof> <pid>安装Eclipse Memory AnalysisHelp 》 Install New Software输入地址&#xff1a;http://archive.eclipse.org/mat/1.0/update-site/安装点击右侧Open Perspective选Memory Analysis插件&#…

C#对用户密码使用MD5加密与解密

C#中常涉及到对用户密码的加密于解密的算法&#xff0c;其中使用MD5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验&#xff0c;分享给大家。 一.使用16位、32位、64位MD5方法对用户名加密 1&#xff09;16位的MD5加密 ?123456789101112/// <sum…

android默认代码混淆,Android SDK默认混淆配置文件

一.介绍通常情况下编译后的字节码包含了大量调试信息(如源类名/行号等)混淆代码就能删除这些调试信息&#xff0c;并用无意义字符替换所有名字&#xff0c;增加反编译难度&#xff01;ProGuard是一个混淆代码的开源项目&#xff0c;主要作用如下&#xff1a;混淆Obfuscate 用无…

前端学习(2334):angular之内置属性指令ngclass

child.html <p>child4 works!</p><div class"us">我是歌谣</div> <div [ngClass]"currentClass" class"col">我是歌谣</div>child.ts import { Component, OnInit } from angular/core;Component({select…

spring cloud consul整合

本文基于spring cloud Finchley.SR1 consul如何搭建可以看文章consul docker方式搭建 本文章源码位置&#xff1a;https://github.com/wanghongqi/springcloudconsul_test/ 目录 服务端 客户端 测试 服务端 pom.xml <properties><project.build.sourceEncodin…

event android,androidEvent 对 android 事件分发机制的一点个人理解,将事件机制进行了简单化处理,刚方便理解! @codeKK Android开源站...

android 中的事件处理一直以来困扰不少刚刚从事 android 开发的同学&#xff0c;网上也有不少讲解 android 事件分发的文章&#xff0c;然而讲解的都不够简洁&#xff01;现在我将用另一种简洁的方式来讲解 android 事件的分发机制&#xff01;android 的事件分发可以简单的归位…

consul docker方式搭建

目录 获取镜像 运行 集群搭建 官网&#xff1a;https://www.consul.io/ 文档&#xff1a;https://www.consul.io/docs/index.html 获取镜像 docker pull consul:1.3.0 运行 如果已存在dev-consul先移除 docker rm -f dev-consul 创建容器&#xff0c;守护进程方式启动&…

锁屏壁纸开发 Android,Android开发自己的锁屏壁纸

SurfaceView SurfaceHolder MediaPlayer Service BroadcastReceiver KeyguardManager PowerManager思路&#xff1a;启动一个服务&#xff0c;监听灭屏广播&#xff0c;当收到广播的时候&#xff0c;点亮屏幕&#xff0c;禁用锁屏&#xff0c;调用使用SurfaceV…

[转载来之雨松:NGUI研究院之为什么打开界面太慢(十三)]

本文固定链接: http://www.xuanyusong.com/archives/2799转载于:https://www.cnblogs.com/yexiaopeng/p/6591482.html

前端学习(2335):angular之内置结构指令ngif

child.html <p>child4 works!</p><div class"us">我是歌谣</div> <div [ngClass]"currentClass" class"col">我是歌谣</div><div *ngIf"true">aaaa</div> <div *ngIf"false…

centos7 postgresql安装

安装 Install the repository RPM: yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm Install the client packages: yum install postgresql11 Optionally install the server packages: yum install …

android密码可见不可见的光标控制,Android EditText 在设置为输入密码的时候 密码是否可见 光标在最后显示...

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;今天在开发登录注册模块的时候&#xff0c;用EditText实现密码的输入&#xff0c;项目需要密码是可以选择可见或者默认的隐藏模式&#xff0c;很简单&#xff0c;但是第一次遇到就记录下来分享给大家。布局文件and…

centos6 postgresql安装

安装 Install the repository RPM: yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-6-x86_64/pgdg-centos11-11-2.noarch.rpm Install the client packages: yum install postgresql11 Optionally install the server packages: yum install…

l2-006 树的遍历

L2-006. 树的遍历 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越给定一棵二叉树的后序遍历和中序遍历&#xff0c;请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;&l…

Ant Design Pro 2.0/umijs站点配置到非站点根目录下处理

1.config/config.js中 export default {中加上如下&#xff1a; history: hash, //采用hash路由&#xff1a;#/xxx的形式 base:./, publicPath:./, &#xff08;会自动将/static/xxx.jpg之类的和umi.js中的a.p"/"及index.html中window.routerBase中该值进行替换…

android添加商品到购物车,Android使用动画动态添加商品进购物车

本文实例为大家分享了Android添加商品进购物车的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1、首先展示下效果图2、讲一下思路&#xff0c;小球由加号位置运动到购物车位置&#xff0c;首先得获得这两个点在整个屏幕中的坐标&#xff0c;然后分别计算这两个点的横…