excel函数中if android,在Android中阅读Excel

目前我正在开发android开发.根据要求,应用程序应该能够读取Excel文件以进行数据输入.

正如其他人从这个主题开始,我已经完成了Java Excel Api和Apache POI,但两者都需要进行一些修改以满足我的要求:

JExcel API:

– 不能支持XLSX

Apache POI:

– 支持XLS文件

– 要在Dalvik中支持XLSX,您需要克服64K和javax库,或使用端口版本(即从Andrew Kondratev开始)

– 文件大小将增加2.4MB

但是我们还有其他选择在Android 4或更低版本中使用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文件的界面:

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);

}

标签:jexcelapi,android,excel,apache-poi

来源: https://codeday.me/bug/20190727/1553770.html

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

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

相关文章

javaIo流实际应用

/*查看目录下所有的文件*/ package cn.file; import java.io.File;public class Text2 {public static void main(String[] args) {File anew File("F:\\图片");File a1new File("F:\\你的");chek(a1);}public static void chek(File f3) {//查看目录…

Android之网络编程之网络通信几种方式实例分享

这篇文章主要介绍了android 网络编程之网络通信几种方式&#xff0c;有需要的朋友可以参考一下 现在总结了六种方式&#xff1a; &#xff08;1&#xff09;针对TCP/IP的Socket、ServerSocket &#xff08;2&#xff09;针对UDP的DatagramSocket、DatagramPackage。这里需要注意…

常用MIME类型(Flv,Mp4的mime类型设置)

也许你会在纳闷&#xff0c;为什么我上传了flv或MP4文件到服务器&#xff0c;可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢&#xff1f;这就表明mp4格式文件是服务器无法识别的&#xff0c;其实&#xff0c;这是没有在iis中将相应的MIME类型进行设置的…

史上四大“杀人”建筑,烧掉几百亿,却犯低级错误,网友:有钱人的智商,我不懂

全世界只有3.14 % 的人关注了爆炸吧知识本文转自普象工业设计小站这个世界上有多少荒谬的建筑&#xff1f;国内土味审美的大楼只是冰山一角在更多的国家里耗费巨资&#xff0c;却无比失败的工程比土味大楼更多更荒唐你也许听说过美国这座会跳舞的大桥耗资千万&#xff0c;由优秀…

迎.NET6,今日先送200P全新视频教程 / 源码

昨晚已经正式发布了.NET6,具体参见&#xff1a;https://devblogs.microsoft.com/dotnet/announcing-net-6/。这是.NET团队和社区努力一年的成果&#xff0c;C# 10 和 F# 6 有很大的语言改进&#xff0c;使代码更简单、更好。性能有了巨大的提升&#xff0c;我们看到微软的云服务…

文章观后感

文章地址http://knowledge100.blog.51cto.com/3448830/793559 这篇文章讲的是三层交换机-vlan间路由配置&#xff0c;主要讲述的是通过实例的方式说明如何在一个典型的快速以太局域网中实现VLAN间路由的问题。通过设置VTP域、配置交换机间中继链路、在核心交换机上创建VLAN、将…

JSP之三大指令

page指令&#xff1a; * import&#xff1a;等同与import语句 <% page import"java.util.*" %> <% page import"java.util.*, java.net.*" %>在一个JSP页面中可以给出多个page指令&#xff0c;而且import是可以重复出现的 <% page import&q…

android 横向stepview,Android 流程指示器 StepView

软件介绍StepView 是Android平台下自定义的流程指示器。效果图&#xff1a;使用:android:id"id/step_view0"android:layout_width"match_parent"android:layout_height"wrap_content"android:layout_centerInParent"true"android:text…

Android之项目中如何用好构建神器Gradle?

Gradle虽为构建神器&#xff0c;但感觉学习曲线比较陡峭。Gradle User Guide内容很多&#xff0c;但有点太多了&#xff0c;多的你看不完&#xff0c;Gradle Plugin User Guide一篇文章主要讲了Android相关的配置&#xff0c;看完可能感觉马马虎虎会用&#xff0c;但到了修改一…

JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

闭包真的是一个谈烂掉的内容。说到闭包&#xff0c;自然就涉及到执行环境、变量对象以及作用域链。汤姆大叔翻译的《深入理解JavaScript系列》很好&#xff0c;帮我解决了一直以来似懂非懂的很多问题&#xff0c;包括闭包。下面就给自己总结一下。包括参考大叔的译文以及《Java…

58年前,这3个人在“撕逼”中拿下诺贝尔奖!一起研究DNA的女科学家却痛苦去世.........

全世界只有3.14 % 的人关注了爆炸吧知识人类的本质是双螺旋结构1953年4月25日&#xff0c;《自然》杂志发表了一篇不到千字的论文&#xff1a;消息一出&#xff0c;便掀起了科学界的轩然大波。因为这篇短小精悍的论文史无前例地揭示了正确的DNA立体结构。图片仅供参考&#xff…

Azure App Service 上的根证书

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Amol Mehrotra翻译&#xff1a;Edi Wang导语App Service 有一个受信任的根证书列表&#xff0c;您不能在 App Service 的多租户版本中修改这些证书&#xff0c;但您可以在应用服务环境 (ASE) 的受信任根存储中加载自己的 CA 证书…

String.Format和StringBuilder的效率

到底String.Format还是StringBuilder效率更高一点&#xff1f;至于这个问题&#xff0c;直接叫他用强大的武器Reflector了解一下String.Format的方法.结果他很快就找出相关的代码: public static string Format(IFormatProvider provider, string format, params object[] arg…

jettytomcat对待表单过长问题

为什么80%的码农都做不了架构师&#xff1f;>>> 结论两句话&#xff1a; tomcat知道自己处理不了了&#xff0c;什么也不干过去了 jett知道自己处理不了了&#xff0c;抛个IllegalStateException出来通知一下 jetty默认允许的content-length2001000 org.eclips…

Android之Adapter用法总结

Android之Adapter用法总结 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系: Android中所有的Adapter一览: …

那些年,画家发明的黑科技

全世界只有3.14 % 的人关注了爆炸吧知识在现代摄影技术发明之前&#xff0c;获取图像的最佳方式只有绘画。在绘画的时代&#xff0c;如何把事物画的逼真&#xff0c;几乎成为了困扰画家一生的问题。为了准确展现客观世界&#xff0c;让画面看起来更加逼真&#xff0c;古代的艺术…

shared_ptrT make_shared( Args ... args );

shared_ptr很好地消除了显式的delete调用&#xff0c;如果读者掌握了它的用法&#xff0c;可以肯定delete将会在你的编程字典中彻底消失。但这还不够&#xff0c;因为shared_ptr的构造还需要new调用&#xff0c;这导致了代码中的某种不对称性。虽然shared_ptr很好地包装了new表…

Android jdwp 自动断开,开启debug调试模式,进入不了,等一会就闪退了!!!!

原因&#xff1a;debug标记加多了art/runtime/jdwp/jdwp_event.cc:661] Check failed: Thread::Current() ! GetDebugThread() (Thread::Current()0xe1908400, GetDebugThread()0xe1908400) Expected event thread11-16 15:29:18.457 10331-10339/包名 A/art: art/runtime/runt…

Visual Studio 2022发布了,我最爱的5大特性

VS2022今天Visual Studio 2022 终于发布了&#xff0c;你只需要按下⾯地址就可以快速安装你所需要的Visual Studio 2022版本&#xff0c;包括了企业版本&#xff0c;专业版本&#xff0c;以及社区版本。请输入以下⽹址安装最新的Visual Studio 2022 https://aka.ms/InstallVS或…

ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发

为什么80%的码农都做不了架构师&#xff1f;>>> ASP.NET3.5 企业级项目开发 &#xff0d;&#xff0d; 第二章 数据访问层(DAL)的开发 前言&#xff1a;本篇主要讲述数据访问层的开发&#xff0c;而且为了大家交流&#xff0c;已经创建企业项目开发团队&…