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

Android Kotlin:使用Volley从API下载并转换Excel文件的问题

解决Volley下载Excel文件并转换为本地文件的问题

你的问题出在使用了StringRequest处理二进制文件(Excel本质是ZIP压缩包,以PK开头),StringRequest会将二进制数据当作字符串解码,导致数据损坏。正确的做法是使用二进制请求获取原始字节数组,再写入文件。

步骤1:自定义Volley二进制请求

Volley没有内置的ByteArrayRequest,需要自己实现:

class ByteArrayRequest(
    method: Int,
    url: String,
    private val listener: Response.Listener<ByteArray>,
    errorListener: Response.ErrorListener
) : Request<ByteArray>(method, url, errorListener) {

    override fun deliverResponse(response: ByteArray) {
        listener.onResponse(response)
    }

    override fun parseNetworkResponse(response: NetworkResponse?): Response<ByteArray> {
        return Response.success(
            response?.data,
            HttpHeaderParser.parseCacheHeaders(response)
        )
    }
}

步骤2:使用二进制请求获取Excel数据

替换原来的StringRequest为上面的ByteArrayRequest:

val url = "你的API地址"
val byteArrayReq = ByteArrayRequest(
    Method.GET, url,
    Response.Listener { byteArray ->
        hidePregressBar()
        // 将字节数组保存为Excel文件
        saveByteArrayToExcel(byteArray)
    },
    Response.ErrorListener { error ->
        hidePregressBar()
        // 处理错误逻辑
    }
)

// 添加请求到Volley队列
Volley.newRequestQueue(this).add(byteArrayReq)

步骤3:实现字节数组转Excel文件的方法

将获取到的byte数组写入本地文件,注意处理存储规则:

private fun saveByteArrayToExcel(byteArray: ByteArray) {
    try {
        // 选择存储路径,比如App专属外部存储的Download目录
        val downloadDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
        val excelFile = File(downloadDir, "downloaded_excel.xlsx")

        // 写入字节数组到文件
        FileOutputStream(excelFile).use { outputStream ->
            outputStream.write(byteArray)
            outputStream.flush()
        }

        // 通知系统刷新媒体库,让文件能在文件管理器中被找到
        MediaScannerConnection.scanFile(
            this,
            arrayOf(excelFile.absolutePath),
            null,
            null
        )
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

注意事项

  • 权限适配:Android 10(API 29)及以上版本,使用getExternalFilesDir不需要动态申请存储权限;更低版本需在Manifest中添加WRITE_EXTERNAL_STORAGE权限并动态申请。
  • 文件格式匹配:确认API返回的是.xlsx还是.xls,文件名后缀要对应,避免文件无法正常打开。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:24:53