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

Expo导出JSON转CSV文件无法保存到下载文件夹问题咨询

解决方案

问题根源

  • 调用FileSystem.writeAsStringAsync时未添加await关键字,文件写入操作还没完成就执行后续创建资源的逻辑,你看到的带_U/_V属性的Promise结构,就是未等待异步执行完成的返回结果
  • CSV内容拼接逻辑错误,直接拼接JSON数组对象不会自动转为CSV格式的行数据,缺少换行符和字段遍历、特殊字符转义逻辑
  • 缺少异常捕获逻辑,无法定位操作失败的具体原因

调整后可运行代码

CSV = async () => {
  try {
    // 1. 完整处理JSON转CSV逻辑
    const data = this.state.results;
    const headers = 'Transaction ID,Title,Amount,Category,Note,Date\n'; // 头部末尾加换行
    // 遍历JSON数组拼接每一行数据,处理字段内的引号、逗号等特殊字符转义
    const rows = data.map(item => {
      return [
        item.transactionId,
        item.title,
        item.amount,
        item.category,
        item.note,
        item.date
      ].map(field => `"${String(field).replace(/"/g, '""')}"`).join(',');
    }).join('\n');
    const csvContent = headers + rows;

    // 2. 定义临时写入路径(App私有目录)
    const tempPath = FileSystem.documentDirectory + "test.csv";

    // 3. 申请存储权限
    const { status } = await MediaLibrary.requestPermissionsAsync();
    if (status !== "granted") {
      alert("存储权限未授予,无法保存文件");
      return;
    }

    // 4. 等待文件写入完成再执行后续操作
    await FileSystem.writeAsStringAsync(tempPath, csvContent, { encoding: FileSystem.EncodingType.UTF8 });

    // 5. 转存到系统公共下载文件夹
    const fileAsset = await MediaLibrary.createAssetAsync(tempPath);
    await MediaLibrary.createAlbumAsync("Download", fileAsset, false);

    alert("CSV文件已成功保存到系统下载文件夹");
    // 可选:清理App私有目录下的临时文件
    await FileSystem.deleteAsync(tempPath, { idempotent: true });
  } catch (error) {
    console.error("保存失败:", error);
    alert("保存失败:" + error.message);
  }
}

验证方式

调整后运行代码,看到成功提示后,直接打开系统自带的「下载」应用,即可找到生成的test.csv文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:15:03