You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio应用无法在所有机型下载目录生成Excel文件求助

问题解决方案

问题1:电脑连接后无法识别生成的文件

原因:文件生成后未触发系统媒体扫描,电脑通过MTP协议读取手机文件时依赖系统媒体数据库索引,未扫描的文件不会被索引,因此无法被识别。

解决方法:文件生成完成后,调用MediaScannerConnection主动通知系统扫描该文件,更新媒体数据库。

问题2:无SD卡的Moto G9无法生成文件

原因:

  1. 存储路径适配问题:Environment.getExternalStorageDirectory()在Android 10(API 29)及以上受Scoped Storage机制限制,直接操作公共目录会出现权限问题;无SD卡设备的外部存储逻辑与带SD卡设备不同,直接硬编码路径易出错。
  2. 权限申请不规范:原代码直接调用权限申请但未处理回调,可能导致权限未真正授予。
  3. 格式不匹配:代码用HSSFWorkbook生成的是.xls格式文件,但文件名后缀设为.xlsx,可能引发系统识别异常。

解决方法:

  • 使用APP专属外部存储目录getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),Android 10+无需额外权限即可写入。
  • 补充权限申请的回调逻辑,确保权限正常授予。
  • 统一文件格式:要么将文件名改为.xls,要么改用XSSFWorkbook生成.xlsx格式文件。

修改后的完整代码

import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaScannerConnection;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;

public class MainActivity extends AppCompatActivity {

    private EditText editTextExcel;
    private static final int STORAGE_PERMISSION_REQUEST_CODE = 100;
    private File filePath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextExcel = findViewById(R.id.editText);
        // 适配Android 10+的APP专属Download目录
        filePath = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "mynew2.xls");

        // 提前检查并申请存储权限
        checkStoragePermission();
    }

    private void checkStoragePermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    STORAGE_PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == STORAGE_PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "存储权限已授予", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "需授予存储权限才能生成文件", Toast.LENGTH_SHORT).show();
            }
        }
    }

    public void buttonCreateExcel(View view) {
        // 生成文件前再次校验权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "请先授予存储权限", Toast.LENGTH_SHORT).show();
            checkStoragePermission();
            return;
        }

        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        HSSFSheet hssfSheet = hssfWorkbook.createSheet("Custom Sheet");

        HSSFRow hssfRow = hssfSheet.createRow(0);
        HSSFCell hssfCell = hssfRow.createCell(0);

        hssfCell.setCellValue(editTextExcel.getText().toString());

        try {
            // 确保父目录存在,避免创建文件失败
            if (!filePath.getParentFile().exists()) {
                filePath.getParentFile().mkdirs();
            }

            FileOutputStream fileOutputStream = new FileOutputStream(filePath);
            hssfWorkbook.write(fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();

            // 通知系统扫描文件,解决电脑无法识别的问题
            MediaScannerConnection.scanFile(this,
                    new String[]{filePath.getAbsolutePath()},
                    new String[]{"application/vnd.ms-excel"},
                    (path, uri) -> {
                        Toast.makeText(MainActivity.this, "文件生成成功", Toast.LENGTH_SHORT).show();
                    });

        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "文件生成失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
}

额外说明

  1. 生成.xlsx格式:若需生成.xlsx文件,需将HSSFWorkbook替换为XSSFWorkbook,并在依赖中添加poi-ooxml库。
  2. 写入公共Download目录:如果必须写入系统公共Download目录(非APP专属),Android 10+需使用MediaStore API进行文件写入,不能直接通过File类操作。
  3. Android 13+权限适配:Android 13+对存储权限做了细粒度划分,若写入公共目录需申请对应媒体权限(如READ_MEDIA_IMAGES),或继续使用MediaStore API。

内容的提问来源于stack exchange,提问作者Ammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:15:38