首页 > 解决方案 > 尝试从 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>

我尝试了很多在网上找到答案,但直到现在我都无法正确地做到这一点。经过大量的尝试和参考,我把这个问题放在这里,如果我能知道我做错了什么,那将非常有帮助。

标签: androidexcelapache-poi

解决方案


      File file = new File(uri.getPath());

      FileInputStream myInputStream=new FileInputStream(file);

改成:

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

你有一个很好的内容方案 uri 所以使用它。


推荐阅读