草庐IT

java - 如何在 GWT 中将 JSONObject 转换为 .csv?

coder 2024-03-21 原文

我是 GWT 的新手,很抱歉,如果这是一个微不足道的问题,但我找不到答案。我有这个已经工作的功能,我可以在其中导出为 .xlsx 一张表。没关系,它可以毫无问题地导出文件。这是使用此第 3 方实用程序:https://github.com/stephenliberty/excel-builder.js/

我的问题是我想将文件保存为 .csv 但我无法转换此 gwt 版本的 JSONObject ( com.google.gwt.json.client.JSONObject.JSONObject()) 到 csv 中,我找不到任何关于这个 excel-builder-js 的有用文档,如果这也可以导出为 csv 或不......这怎么可能?

    ...
            JSONObject object = new JSONObject();
            object.put("head", head);
            object.put("cols", columns);
            object.put("data", array);
            exportXlsxFromTable(JsonUtils.safeEval(object.toString()), GWT.getModuleName(), name);
    ...

    public static native void exportXlsxFromTable(JavaScriptObject originalData, String project, String name) /*-{
        var uri = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,';
    $wnd
            .require(
                    [ project + '/excelbuilderjs/excel-builder', project + '/excelbuilderjs/Template/BasicReport' ],
                    function(EB, BR, downloader) {
                        var basicReport = new BR({
                            name : name
                        });
                        basicReport.setHeader([
                            {bold: false, text: name}, "", ""
                        ]);
                        var head = originalData['head'];
                        for (var i=0;i<head.length;i++) {
                            for (var j=0;j<head[i].length;j++) {
                                head[i][j].metadata = { type: 'string' };
                            }
                        }
                        basicReport.setData(head.concat(originalData['data']));
                        basicReport.setColumns(originalData['cols']);

                        var data = EB.createFile(basicReport.prepare());
                        //          window.location.href = uri + data;
                        $entry(@com.mycompany.gxt.framework.view.dom.DOMUtils::downloadFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)("myfile.xlsx", uri, data));

                    });
    }-*/;

public static native void downloadFile(String filename, String uri, String base64) /*-{
    var iframeDownloadFn = function(filename, uri, base64) {
        var values = {
            fn : 'b64d',
            fname : filename,
            fcont : uri + base64
        };
        try {
            $wnd.document.body.removeChild($wnd.downloadIframe);
        } catch (e) {
        }
        var iframe = $wnd.document.createElement("iframe");
        $wnd.document.body.appendChild(iframe);

        var iDoc = iframe.contentWindow.document;
        var form = iDoc.createElement("form");
        form
                .setAttribute("action",
                        @com.mycompany.gxt.framework.client.FrameworkClient::DOWNLOAD_URL);
        form.setAttribute("method", 'POST');
        form.setAttribute("style", 'display: none');
        for ( var property in values) {
            if (values.hasOwnProperty(property)) {
                var value = values[property];
                if (value instanceof Array) {
                    for (var i = 0, l = value.length; i < l; i++) {
                        var el = iDoc.createElement("input");
                        el.setAttribute("type", 'hidden');
                        el.setAttribute("name", property);
                        el.setAttribute("value", value[i]);

                        form.appendChild(el);
                    }
                } else {
                    var el1 = iDoc.createElement("input");
                    el1.setAttribute("type", 'hidden');
                    el1.setAttribute("name", property);
                    el1.setAttribute("value", value);
                    form.appendChild(el1);
                }
            }
        }
        iDoc.body.appendChild(form);
        form.submit();
        $wnd.downloadIframe = iframe;
    }
    var clickLink = function(link, uri, base64) {
        var cancelled = true;

        try {
            if (document.createEvent) {
                var event = document.createEvent("MouseEvents");
                event.initMouseEvent("click", true, true, window, 0, 0, 0,
                        0, 0, false, false, false, false, 0, null);
                cancelled = !link.dispatchEvent(event);
            } else if (link.fireEvent) {
                cancelled = !link.fireEvent("onclick");
            }
        } catch (e) {
            cancelled = true;
        }

        link.parentNode.removeChild(link);

        if (cancelled) {
            iframeDownloadFn(filename, uri, base64);
        }
    }
    var link = $wnd.document.createElement("a");
    link.setAttribute("href", uri + base64);
    link.setAttribute("name", filename);
    link.setAttribute("title", filename);
    link.setAttribute("download", filename);
    $wnd.document.body.appendChild(link);
    clickLink(link, uri, base64);
}-*/;

编辑:

尝试了“Mon Mohon Singha”的 javasript 建议,我现在在这里:

  JSONObject object = new JSONObject();
object.put("head", head);
object.put("cols", columns);
object.put("data", array);

exportCsvFromTable(object.toString(), GWT.getModuleName(), name);

public static native void exportCsvFromTable(String originalData, String project, String name) /*-{
var uri = 'text/csv;charset=utf-8;';

function convertToCSV(jsData){
     var json = jsData;
     var fields = Object.keys(json[0]);
     var replacer = function(key, value) { return value === null ? '' : value }
     var csv = json.map(function(row){
       return fields.map(function(fieldName){
         return JSON.stringify(row[fieldName], replacer)
       }).join(',')
     })
     csv.unshift(fields.join(',')) // add header column
     return csv.join('\r\n');
   }

var data = convertToCSV(originalData);
//     window.location.href = uri + data;
$entry(@com.mycompany.gxt.framework.view.dom.DOMUtils::downloadFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)("export.csv", uri, data));

}-*/;

但是我遇到了这个错误,所以我假设我没有使用正确的类型...

com.google.gwt.logging.client.LogConfiguration
SEVERE: Exception caught: Exception caught: (TypeError) : json_0_g$.map is not a function com.google.gwt.event.shared.UmbrellaException: Exception caught: Exception caught: (TypeError) : json_0_g$.map is not a function
 at Unknown.fillInStackTrace_0_g$(as-0.js@3:130944)
 at Unknown.Throwable_3_g$(as-0.js@8:130899)
 at Unknown.Exception_3_g$(as-0.js@18:131042)
 at Unknown.RuntimeException_3_g$(as-0.js@18:287158)
 at Unknown.UmbrellaException_3_g$(as-0.js@25:313985)

EDIT2.:

这是注销的 JavaScriptObject。删除了一些“数据”行以便更清楚:

Object
cols: Array(10)
0: {name: "ID", type: "string"}
1: {name: "NAME", type: "string"}
2: {name: "FIRST NAME", type: "string"}
3: {name: "BIRTHDAY", type: "string"}
4: {name: "BIRTH PLACE", type: "string"}
5: {name: "BIRTH COUNTRY", type: "string"}
6: {name: "NATIONALITY", type: "string"}
7: {name: "ORGANISATION", type: "string"}
8: {name: "FUNCTION", type: "string"}
9: {name: "PLACE", type: "string"}
length: 10
__proto__: Array(0)
data: Array(100)
0: (10) [1470, "John", "Doe", "03.03.1988", "", "", "CANADA", "BPA", "", ""]
1: (10) [1469, "Test", "NAme", "25.03.1999", "CANADA", "CANADA", "CANADA", "test", "", "LA"]
2: (10) [1467, "Mike", "Test2", "06.05.2019", "Paris", "", "", "test", "ikol", "LA"]
3: (10) [1465, "Flanders", "Ned2", "23.12.1974", "Salt Lake City", "", "", "Orgatest", "BPA", ""]
4: (10) [1462, "Bro", "Jo", "03.07.2018", "abc", "USA", "USA", "MY COMPANY", "Catering", "A"]
5: (10) [1461, "Bro", "Jo", "01.08.2018", "abc", "USA", "USA", "MY COMPANY", "Catering", "A"]
...
length: 100
__proto__: Array(0)
head: Array(1)
0: (10) ["ID", "NAME", "FIRST NAME", "BIRTHDAY", "BIRTH PLACE", "BIRTH COUNTRY", "NATIONALITY", "ORGANISATION", "FUNCTION", "PLACE"]
length: 1
__proto__: Array(0)
__proto__: Object

编辑 3.:

正如 Rob Newton 所建议的那样,我编辑了转换函数:

public static native void exportCsvFromTable(JavaScriptObject originalData, String project, String name) /*-{
        var uri = 'text/csv;charset=utf-8;';

        function convertToCSV(jsData){
              //console.log(originalData);
              var json = jsData;
              //var fields = Object.keys(json);
              //var replacer = function(key, value) { return value === null ? '' : value }

              var headerCSV = json.head[0].join(',');

              var rowsCSV = json.data.map( function(row) {
                return row.join(',');
              } );

              rowsCSV.unshift(headerCSV);

              console.log(rowsCSV.join('\r\n'));

              return rowsCSV.join('\r\n');
            }

            var data = convertToCSV(originalData);
            //          window.location.href = uri + data;
            $entry(@com.mycompany.gxt.framework.view.dom.DOMUtils::downloadFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)("export.csv", uri, data));

}-*/;

转换后的数据看起来没问题:

ID,NAME,FIRST NAME,BIRTHDAY,BIRTH PLACE,BIRTH COUNTRY,NATIONALITY,ORGANISATION,FUNCTION,PLACE
31471,Test,Test,07.05.2019,New,,,XYZ,ikl,
31470,John,Doe,03.03.1988,,,Canada,XYZ,,
31469,New,Test,25.03.1999,Right,USA,USA,,LA
...

遗憾的是,下载产生了一个 0 字节的无效文件 :(

最佳答案

js中的json数据到csv

我不知道 GWT。可能对你有帮助

function convertToCSV(jsData){
      var json = jsData;
      var fields = Object.keys(json[0]);
      var replacer = function(key, value) { return value === null ? '' : value }
      var csv = json.map(function(row){
        return fields.map(function(fieldName){
          return JSON.stringify(row[fieldName], replacer)
        }).join(',')
      })
      csv.unshift(fields.join(',')) // add header column
      return csv.join('\r\n');
    }

function exportCSVFile(items, fileTitle) {
        var csv = convertToCSV(items);
        var exportedFilenmae = fileTitle + '.csv' || 'export.csv';
        var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
        if (navigator.msSaveBlob) {
            navigator.msSaveBlob(blob, exportedFilenmae);
        } else {
            var link = document.createElement("a");
            if (link.download !== undefined) {
                var url = URL.createObjectURL(blob);
                link.setAttribute("href", url);
                link.setAttribute("download", exportedFilenmae);
                link.style.visibility = 'hidden';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        }
        return true
    }

关于java - 如何在 GWT 中将 JSONObject 转换为 .csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56227393/

有关java - 如何在 GWT 中将 JSONObject 转换为 .csv?的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  6. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  7. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  8. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  9. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  10. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

随机推荐