GWT-ben JSONObject konvertálása CSV-be
2019-05-21T14:55:12+02:00
2019-05-22T10:47:16+02:00
2022-08-18T23:45:33+02:00
pace
Sziasztok!

Adott egy GWT [GXT] projekt, amiben meg kéne oldanom egy változtatást, de életben nem használtam még GWT-t és a javascript sem az erősségem. 

A lényeg, hogy jelenleg van egy .xlsx export funkciója, ami tök jól működik. Használ hozzá valami 3rd party könyvtárat [excelbuilderjs], az hozza létre a fájlt, aztán a böngésző meg elmenti a kész fájlt. Most viszont azt akarják, hogy ne .xlsx legyen a vége, hanem .csv. Na, én itt egy kicsit nagyon elakadam, mert ez a GWT kód nekem teljesen katyvasz. Java EE még oké lenne, de ez...

Ezek az érintett függvények az .xlsx exporthoz, ezeket megtaláltam:

... 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
.length;j++) { head
[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
); 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); }-*/;
Találtam már egy ilyen csoda függvényt, ami JavaScript-ben (mert ez a GWT kód lényegében ugye az [mondom, nem használtam még ezt soha...]...) átkonvertálná a JSON adatot CSV-be, de ez nekem nem nagyon akar menni:

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 }
Itt maga a JSONObject típusa ugye ez: com.google.gwt.json.client.JSONObject, ami nekem már erősen fejfájást okoz...

Szóval a kérdésem, hogy ez hogyan oldható meg? Természetesen, ha úgy van én nem kérem a segítséget ingyen! 

Előre is köszönöm szépen.

PS.: a "gányolással" egyébként egyelőre itt tartok:

...

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)); }-*/;
Ami a böngésző JavaScript Console-jában ezt a hibát adja (mert még azt sem tudom ezt a cuccot hogyan kéne rendesen Eclipse-ből debuggolni :D):

com.google.gwt.logging.client.LogConfiguration SEVERE: Exception caught: Exception caught: (TypeError) : json_0_g$.map is not a functioncom.google.gwt.event.shared.UmbrellaException: Exception caught: Exception caught: (TypeError) : json_0_g$.map is not a function at Unknown.fillInStackTrace_0_g$(azs-0.js@3:130944) at Unknown.Throwable_3_g$(azs-0.js@8:130899) at Unknown.Exception_3_g$(azs-0.js@18:131042) at Unknown.RuntimeException_3_g$(azs-0.js@18:287158) at Unknown.UmbrellaException_3_g$(azs-0.js@25:313985)
Mutasd a teljes hozzászólást!

abcd