当前位置: 首页 > 知识库问答 >
问题:

如何将在JS中创建的csv文件下载到您的android手机(webview)

东方琪
2023-03-14
var createACSVFile = function () {
    var ArrayOfDataToExport = [];
    for (var k = 0; k < localStorage.length; k++) {
        console.log([localStorage.key(k),JSON.parse(localStorage.getItem(localStorage.key(k)))]);
        ArrayOfDataToExport.push([localStorage.key(k),JSON.parse(localStorage.getItem(localStorage.key(k)))])
    }


    var csvRows = [];

    for(var i=0, l=ArrayOfDataToExport.length; i<l; ++i){
        csvRows.push(ArrayOfDataToExport[i].join(','));
    }

    var csvString = csvRows.join("%0A");
    var a         = document.createElement('a');
    a.href        = 'data:attachment/csv,' + csvString;
    a.target      = '_blank';
    a.download    = 'exportFile.csv';

    document.body.appendChild(a);
    a.click();
};

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

        view = (WebView) this.findViewById(R.id.webView);
        view.getSettings().setJavaScriptEnabled(true);
        view.getSettings().setAllowFileAccess(true);
        view.getSettings().setDomStorageEnabled(true);
        view.getSettings().setUseWideViewPort(true);
        view.getSettings().setLoadWithOverviewMode(true);
        view.setInitialScale(1);
        view.getSettings().setJavaScriptEnabled(true);
        view.getSettings().setSupportZoom(false);
        view.setWebViewClient(new MyBrowser(){

            @Override
            public void onPageFinished(WebView view, String url) {
            //hide loading image
            findViewById(R.id.imageLoading1).setVisibility(View.GONE);
            //show webview
            findViewById(R.id.webView).setVisibility(View.VISIBLE);
        }


        });
        view.loadUrl("file:///android_asset/www/index.html");
        view.setWebChromeClient(new WebChromeClient(){
});
        view.setDownloadListener(new DownloadListener() {
            public void onDownloadStart(String url, String userAgent,
                                        String contentDisposition, String mimetype,
                                        long contentLength) {
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(url));
                startActivity(i);
            }
        });
    }

更新

如果将其添加到AndroidManifest.xml中,将得到相同的错误:

<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>

共有1个答案

童化
2023-03-14

我所做的是在JS中生成导出到csv所需的数据,如下所示:

var generateTheDataToExportToArrayString = function () {
    var ArrayOfDataToExport = [];
    for (var k = 0; k < localStorage.length; k++) {
        var keyName = (localStorage.key(k));
        var data = JSON.parse(localStorage.getItem(localStorage.key(k)));
}
    var String = '[';
    for (var i = 0; i < ArrayOfDataToExport.length; i++){
        if (typeof ArrayOfDataToExport[i][1] === "object"){
            String += "[" + ArrayOfDataToExport[i][0] + ",";
            if (ArrayOfDataToExport[i][1].length > 1 || ArrayOfDataToExport[i][1].length === 0){
                if (ArrayOfDataToExport[i][1].length === 0){
                    String += '[' + '' + ']]';
                }
                else {
                    for (var k = 0; k < ArrayOfDataToExport[i][1].length; k++){
                        String += '[';
                        for (var l = 0; l < ArrayOfDataToExport[i][1][k].length - 1; l++){
                            String += ArrayOfDataToExport[i][1][k][l]+ ",";
                        }

                        String += ArrayOfDataToExport[i][1][k][ArrayOfDataToExport[i][1][k].length - 1] + "],";
                    }
                    String = String.slice(0, -1);
                    String += "],";
                }
            }
            else {
                String += "[";
                for (var j = 0; j < ArrayOfDataToExport[i][1].length - 2; j++){
                    String += ArrayOfDataToExport[i][1][j] + ",";
                }
                String += ArrayOfDataToExport[i][1][ArrayOfDataToExport[i][1].length - 1] + "]],";
            }
        }
        else {
            String += "[" + ArrayOfDataToExport[i][0] + ",";
            String += ArrayOfDataToExport[i][1] + "],";
        }

    }
    String = String.slice(0, -1);
    String += "]";
    console.log(String);
};

你说我做的最后一件事就是记录那个字符串。我将在Java代码中捕获如下所示:

public void onConsoleMessage(String message, int lineNumber, String sourceID) {
                if (sourceID.equals("file:///android_asset/www/assets/js/parseTest.js") && lineNumber == 184 ){
                    generateNoteOnSD(getBaseContext(),"export.csv", message);
                }
            }

这是函数generateNoteonsd:

public void generateNoteOnSD(Context context, String sFileName, String sBody) {
        try {
            File root = new File(Environment.getExternalStorageDirectory(), "Backup_Data_For_AltFolio");
            if (!root.exists()) {
                root.mkdirs();
            }
            File gpxfile = new File(root, sFileName);
            FileWriter writer = new FileWriter(gpxfile);
            writer.append(sBody);
            writer.flush();
            writer.close();
            Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 类似资料:
  • 问题内容: 我正在研究Java ExtJS应用程序,需要在其中创建和下载CSV文件。 单击按钮后,我希望将CSV文件下载到客户端计算机上。 在按钮侦听器上,我正在使用AJAX调用servlet。在那里,我正在创建一个CSV文件。 我不希望将CSV文件保存在服务器中。我希望使用下载选项 动态 创建文件。我希望将文件的内容创建为字符串,然后将其作为 文件 提供,然后在浏览器中以下载模式打开该 文件 (

  • 问题内容: 我是一个新手程序员,我搜索了很多有关我的问题的内容,但是找不到关于此的有用的解决方案或教程。 我的目标是我有一个PHP数组,并且数组元素显示在页面上的列表中。 我想添加一个选项,以便用户如果需要,他/她可以创建带有数组元素的CSV文件并下载。 我不知道该怎么做。我也搜索了很多。但尚未找到任何有用的资源。 请为我提供一些教程或解决方案或建议以自己实施。由于我是新手,请提供易于实施的解决方

  • 问题内容: 我的API控制器返回的是csv文件,如下所示: 我的angularjs将发送和接收csv文件如下所示: 在chrome中,它将下载一个名为,但没有文件扩展名的文件。该文件的内容为。 在IE10中,没有下载任何内容。 我该怎么做才能解决此问题? 问题答案: 像这样尝试:

  • 当用户点击下载按钮时,文件应该被下载,而不会在新标签中打开文件预览。如何实现这在反应js?

  • 问题内容: 我收到来自api的文件网址作为响应。当用户单击“下载”按钮时,应在不打开新选项卡的文件预览的情况下下载文件。如何在React JS中实现这一目标? 问题答案: 从前端触发浏览器下载不可靠。 您应该做的是创建一个端点,该端点在被调用时将提供正确的响应头,从而触发浏览器下载。 前端代码只能做很多事情。例如,取决于浏览器,“下载”属性可能只是在新标签中打开文件。 您需要查看的响应标头可能是和

  • 问题内容: 在angularjs中,我创建了一些加载JSON对象的对象: 在控制器中,我可以这样称呼它: 如您所见,我正在加载文件。 对文件执行相同的处理流程是什么? 在我的情况下 是对象列表。 有人知道如何使用或其他方式获取CSV数据吗? 问题答案: 您必须将CSV文件解析为一个数组。您可以在其他替代方法中看到此问题 然后,您将得到如下结果: