gpt4 book ai didi

android - 在 Android 中读取 Excel

转载 作者:太空宇宙 更新时间:2023-11-03 12:15:18 25 4
gpt4 key购买 nike

目前我从事安卓开发。如要求所述,应用程序应能够读取 Excel 文件以进行数据输入。

当其他人从这个话题开始时,我已经经历了 Java Excel ApiApache POI ,但两者都需要进行一些修改以满足我的要求:

JExcel API:
- 不支持 XLSX

Apache 兴趣点:
- 支持 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 引擎,例如 RhinoV8 来解决这些问题。

这是代码

回调接口(interface):

public interface ExcelReaderListener {
void onReadExcelCompleted(List<String> stringList);
}

主要 Activity :

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<String> 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<String>() {
@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<String> 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 库放入 asset 文件夹)

<html>
<script src="file:///android_asset/xlsx.core.min.js"></script>
<head></head>
<body>
</body>
<script type ="text/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);
}
</script>
</html>

关于android - 在 Android 中读取 Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39969478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com