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
excel函数中if android,在Android中阅读Excel相关推荐
- excel函数:汉字转全拼_星期五的Excel函数:带过滤器的小计和总和
excel函数:汉字转全拼 Last week, we used the Excel SUBTOTAL function to sum items in a filtered list, while ...
- 15个常用excel函数公式_项目上最常用的Excel函数公式大全,现在看还不晚
做工程的免不了要做资料算量,Excel是工作中最常用的工具之一.只要搞清楚它的一些使用小技巧,工作效率那是嗖嗖的往上蹭啊.下面这些,你就绝对不能错过! 一.数字处理 1.取绝对值 =ABS(数字) 2 ...
- 15个常用excel函数公式_excel表格时间和日期应用 – Excel常用函数公式及技巧
excel表格时间和日期应用 – Excel常用函数公式及技巧 自动显示当前日期公式 =YEAR(NOW()) 当前年 =MONTH(NOW()) 当前月 =DAY((NOW())) 当前日 如何在单 ...
- 计算机二级考试中Excel函数如何应用,计算机二级考试excle常用函数【计算机二级ms office中excel中必考函数有哪些?】...
计算机二级excel主要函数的用法 AVERAGE 求出所有参数的术平均值. 数据计算 COLUMN 显示所引用单元格的列标号值. 显示位置 CONCATENATE 将多个字符文本或单元格中的数据连接 ...
- Excel函数应用之查询与引用函数
编者语:Excel是办公室自动化中非常重要的一款软件,很多巨型国际企业都是依靠Excel进行数据管理.它不仅仅能够方便的处理表格和进行图形分析,其更强大的功能体现在对数据的自动处理和计算,然而很多缺少 ...
- 用函数统计各分数段人数c语言,excel统计各分数段人数的函数
Q2:如何使用Excel函数统计各分数段的人数 "使用Excel函数统计各分数段的人数"的操作步骤是: 1.打开Excel工作表: 2.由已知条件可知,需要将B2:B34单元格的分 ...
- Excel函数应用之统计函数
编者语:Excel是办公室自动化中非常重要的一款软件,很多巨型国际企业都是依靠Excel进行数据管理.它不仅仅能够方便的处理表格和进行图形分析,其更强大的功能体现在对数据的自动处理和计算,然而很多缺少 ...
- Excel函数公式:IF函数和AND、OR函数的组合多条件判断技巧
经常使用Excel函数的小伙伴们都知道,在Excel中使用频率最高的还是那些比较简单的函数,其中IF函数就是高频率函数之一,那么,能不能用IF函数来进行多条件运算呢? 一.IF+AND:同时满足多个条 ...
- Excel函数应用之工程函数
编者语:Excel是办公室自动化中非常重要的一款软件,很多巨型国际企业都是依靠Excel进行数据管理.它不仅仅能够方便的处理表格和进行图形分析,其更强大的功能体现在对数据的自动处理和计算,然而很多缺少 ...
- oracle 计算平方,次方,一个实用的Excel函数,Power函数公式完成平方、立方及N次方运算...
一个实用的Excel函数,Power函数公式完成平方.立方及N次方运算 今天我们来学习如何利用Excel函数,进行数据的平方.立方等数据运算.相信对于许多同学来讲,这样的数据运算一般都是用电脑计算器来 ...
最新文章
- 提高建模效率,改变手工作坊式生产,AutoML的技术研究与应用进展如何了?
- 802.11 MESH WLANs
- 使用静态库.framework注意事项
- httpClient3.1 笔记
- CodeForces 518A - Chewbaсca and Number(思路)
- 关于Metasploit开发环境的搭建
- VueJS ReactJS 如何?听听别人怎么说。
- java写的一个zip压缩源码错误分析
- 1.three.js世界的4大要素
- C++中时间相关函数的使用
- 能从入门到精通的 Docker 学习指南
- RuiJi Scraper基础 – RuiJi表达式模型
- 多说评论如何显示最近访客
- Android开发学习之路-带文字的图片分享
- 自媒体采集平台免费,免费的自媒体采集平台
- win10写java工具_推荐三款录屏工具:也许是电脑录屏最实用的软件
- 8086汇编语言:8086CPU寄存器的相关介绍
- Arduino UNO+OLED可视化音乐频谱:32段分频0.96寸OLED显示细条频谱线
- 如何在网上挣钱,这几个项目让你月入过万元
- 时间触发以太网TTE
热门文章
- TOTP 介绍及基于 C# 的简单实现
- dotnet core 微服务教程
- SignalR第一节-在5分钟内完成通信连接和消息发送
- 开源库Magicodes.Storage正式发布
- Docker打包 Asp.Net Core应用,在CentOS上运行
- .NET的一点历史故事:作者的一些感想
- C#将WebBowser控件替换为Chrome内核
- 用.net core 写后端—— c++外的另一种选择?
- asp.net MVC 应用程序的生命周期
- 元宇宙行业深度研究报告:为什么元宇宙是下一代互联网?