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