android - 尝试从 android 的内部存储中读取 excel 文件 (.xlsx) 时出现 FileNotFound 异常
问题描述
我的 android 手机的内部存储中有一个 excel (.xlsx) 文件。我可以选择 excel 文件,但是当我创建一个 File 对象时,我得到了异常“FileNotFoundException”(目标:- 是选择一个 excel 文件然后读取它)。
在活动类“导入”--->我有一个按钮,点击按钮(即 OnClick 方法)我写了下面提到的代码: -
Intent chooseFile = new Intent();
chooseFile.addCategory(Intent.CATEGORY_OPENABLE);
chooseFile.setType("*/*");
chooseFile.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(chooseFile, "Choose a file"), PICK_FILE_REQUEST_CODE);
在此之后 onActivityResult -->
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode==PICK_FILE_REQUEST_CODE)
{
try {
Uri uri = data.getData();
File file = new File(uri.getPath());
FileInputStream myInputStream=new FileInputStream(file);
OPCPackage myFileSystem=OPCPackage.open(myInputStream);
XSSFWorkbook myWorkBook=new XSSFWorkbook(myFileSystem);
XSSFSheet mySheet=myWorkBook.getSheetAt(0);
Iterator<Row> rowIterator= mySheet.rowIterator();
int rowNumber=0;
while(rowIterator.hasNext())
{
XSSFRow myRow=(XSSFRow) rowIterator.next();
if(rowNumber!=0)
{
Iterator<Cell> cellIterator=myRow.cellIterator();
int columnNumber=0;
while(cellIterator.hasNext())
{
XSSFCell myCell=(XSSFCell) cellIterator.next();
if(columnNumber==0)
{
String Name=myCell.toString());
}
if(columnNumber==1)
{
String RollNumber=myCell.toString());
}
columnNumber++;
}
}
rowNumber++;
}
} catch (IOException | InvalidFormatException e) {
e.printStackTrace();
}
}
AndroidManifest.xml-->
添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<application>
<activity android:name=".ui.home.Import"/> //not a launcher activity
</application>
我尝试了很多在网上找到答案,但直到现在我都无法正确地做到这一点。经过大量的尝试和参考,我把这个问题放在这里,如果我能知道我做错了什么,那将非常有帮助。
解决方案
File file = new File(uri.getPath()); FileInputStream myInputStream=new FileInputStream(file);
改成:
InputStream myInputStream = getContentResolver().openInputStream(data.getData());
你有一个很好的内容方案 uri 所以使用它。
推荐阅读
- c# - 尝试使用 iTextSharp 将 Windows Form C# 中的图表放入 PDF
- c# - 在 Xamarin Android 上拍照后如何将照片发送到可绘制文件夹?
- rxjs - combineLatest 不会发射任何东西,除非所有内部 observables 都发射了至少 1 次发射
- javascript - 如何在使用nodejs的路径中导入带有@符号的模块?
- android - 将数据库文件存储在 Android 设备中用户所需的位置。我该怎么做?
- python - 循环和递归可以互换吗?
- graphql - 如何在 apollo 客户端缓存中使用“模式”?
- node.js - 在 OAuth2.0 后面使用 nopCommerce API
- bash - 对 while-read 循环设置的变量执行算术运算
- ios - 将按钮添加到列表单元格