Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试从android内部存储读取excel文件(.xlsx)时,FileNotFound异常_Android_Excel_Apache Poi - Fatal编程技术网

尝试从android内部存储读取excel文件(.xlsx)时,FileNotFound异常

尝试从android内部存储读取excel文件(.xlsx)时,FileNotFound异常,android,excel,apache-poi,Android,Excel,Apache Poi,我的android手机的内部存储器中有一个excel(.xlsx)文件。我可以选择excel文件,但当我创建一个文件对象时,我会得到异常“FileNotFoundException”(目标:-是选择一个excel文件,然后读取它) 在活动类“导入”-->中,我有一个按钮,单击一个按钮(即OnClick方法),我编写了下面提到的代码:- Intent chooseFile = new Intent(); chooseFile.addCategory(Int

我的android手机的内部存储器中有一个excel(.xlsx)文件。我可以选择excel文件,但当我创建一个文件对象时,我会得到异常“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中-->

@覆盖
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(resultCode==RESULT\u OK&&requestCode==PICK\u FILE\u REQUEST\u CODE)
{
试一试{
Uri=data.getData();
File File=新文件(uri.getPath());
FileInputStream myInputStream=新FileInputStream(文件);
OPCPackage myFileSystem=OPCPackage.open(myInputStream);
XSSFWorkbook myWorkBook=新XSSFWorkbook(myFileSystem);
XSSFSheet mySheet=myWorkBook.getSheetAt(0);
迭代器rowIterator=mySheet.rowIterator();
int rowNumber=0;
while(roweiterator.hasNext())
{
XSSFRow myRow=(XSSFRow)行迭代器.next();
如果(行数!=0)
{
迭代器cellIterator=myRow.cellIterator();
int columnNumber=0;
while(cellIterator.hasNext())
{
XSSFCell myCell=(XSSFCell)cellIterator.next();
如果(columnNumber==0)
{
字符串名称=myCell.toString());
}
如果(columnNumber==1)
{
字符串RollNumber=myCell.toString());
}
columnNumber++;
}
}
行数++;
}
}捕获(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>

//不是启动程序活动
我试了很多次在网上找到答案,但直到现在我还不能正确地找到答案。经过很多尝试和参考,我把这个问题放在这里,如果我能知道我做错了什么,这将非常有帮助

改为:

    InputStream myInputStream = getContentResolver().openInputStream(data.getData());

您得到了一个很好的内容方案uri,所以请使用它。

我使用了实现“org.apache.poi:poi:4.1.2”实现“org.apache.poi:poi ooxml:4.1.2”库请告诉uri.toString()和uri.getPath();uri.toString()的值 -content://com.android.providers.downloads.documents/document/msf%3A7333 uri.getPath()content://com.android.providers.downloads.documents/document/msf%3A7333“msf%3A7333”应该是文件名——但它显示如下。这里是否发生了任何类型的编码?uri.getPath()的值然后将是:
/document/msf%3A7333
。内容提供商知道哪个文件属于它。非常正常。您可以使用此uri查询内容提供商,以获取文件名和大小等。进行上述更改后,我将获得此异常“java.lang.NoSuchMethodError:没有静态方法元工厂(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;Ljava/lang/invoke/LambetaFactory;或其超类中(声明'java.lang.invoke.LambdaMetafactory'出现在/apex/com.android.runtime/javalib/core oj.jar中)“我是否使用了错误的库?我无法理解错误。我也不理解错误。您不需要任何特殊的库。
      File file = new File(uri.getPath());

      FileInputStream myInputStream=new FileInputStream(file);
    InputStream myInputStream = getContentResolver().openInputStream(data.getData());