2014-08-22 3 views
-1

Я не слишком хорошо разбираюсь в том, как выводить файлы обратно на клиент с Java. Я пытаюсь создать CSV-файл, который будет отправлен обратно клиенту и открыт в Excel.Java-выход JSON в CSV-файл

Я нашел this tool для создания серверной части. Я не уверен точно, как использовать его, чтобы вернуть фактический файл. Here является образцом кода, который я использовал для возврата txt-файла, который, я думаю, могу использовать части ответа, но я больше не извлекаю файл, так как я создаю этот CSV, поэтому я не уверен, что я можешь использовать.

В приведенном ниже коде самый большой вопрос - что мне нужно вернуть с помощью контроллера и как это сделать? Я не уверен, что мне нужно возвращаться между этим, а также от CSV-записи к контроллеру. Любая помощь будет оценена по достоинству.

Вот мой код до сих пор:

Контроллер:

@RequestMapping(value = "/web/csvexport", method = RequestMethod.POST) 
protected void processCSV(HttpServletRequest request, HttpServletResponse response, @RequestBody String jsonRequest) 
     throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    try { 
     CSVWriter csvWriter = new CSVWriter(); 
     JsonFlattener jsonFlattener = new JsonFlattener(); 
     String fileName = "StandardQuery"; 
     csvWriter.writeAsCSV(jsonFlattener.parseJson(jsonRequest), fileName); 

    } catch (Exception e) { 
     System.out.println("Exception: " + e); 
    } 
} 

CVS Автор:

public class CSVWriter { 
public void writeAsCSV(List<Map<String, String>> flatJson, String fileName) throws FileNotFoundException { 
    Set<String> headers = collectHeaders(flatJson); 
    String output = StringUtils.join(headers.toArray(), ",") + "\n"; 
    for (Map<String, String> map : flatJson) { 
     output = output + getCommaSeperatedRow(headers, map) + "\n"; 
    } 
    writeToFile(output, fileName); 
} 

private void writeToFile(String output, String fileName) throws FileNotFoundException { 
    BufferedWriter writer = null; 
    try { 
     writer = new BufferedWriter(new FileWriter(fileName)); 
     writer.write(output); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     close(writer); 
    } 
} 

private void close(BufferedWriter writer) { 
    try { 
     if (writer != null) { 
      writer.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private String getCommaSeperatedRow(Set<String> headers, Map<String, String> map) { 
    List<String> items = new ArrayList<String>(); 
    for (String header : headers) { 
     String value = map.get(header) == null ? "" : map.get(header).replace(",", ""); 
     items.add(value); 
    } 
    return StringUtils.join(items.toArray(), ","); 
} 

private Set<String> collectHeaders(List<Map<String, String>> flatJson) { 
    Set<String> headers = new TreeSet<String>(); 
    for (Map<String, String> map : flatJson) { 
     headers.addAll(map.keySet()); 
    } 
    return headers; 
} 

}

Json Flattener:

public class JsonFlattener { 
public Map<String, String> parse(JSONObject jsonObject) { 
    Map<String, String> flatJson = new HashMap<String, String>(); 
    flatten(jsonObject, flatJson, ""); 
    return flatJson; 
} 

public List<Map<String, String>> parse(JSONArray jsonArray) { 
    List<Map<String, String>> flatJson = new ArrayList<Map<String, String>>(); 
    int length = jsonArray.length(); 
    for (int i = 0; i < length; i++) { 
     JSONObject jsonObject = jsonArray.getJSONObject(i); 
     Map<String, String> stringMap = parse(jsonObject); 
     flatJson.add(stringMap); 
    } 
    return flatJson; 
} 

public List<Map<String, String>> parseJson(String json) throws Exception { 
    List<Map<String, String>> flatJson = null; 
    try { 
     JSONObject jsonObject = new JSONObject(json); 
     flatJson = new ArrayList<Map<String, String>>(); 
     flatJson.add(parse(jsonObject)); 
    } catch (JSONException je) { 
     flatJson = handleAsArray(json); 
    } 
    return flatJson; 
} 

private List<Map<String, String>> handleAsArray(String json) throws Exception { 
    List<Map<String, String>> flatJson = null; 
    try { 
     JSONArray jsonArray = new JSONArray(json); 
     flatJson = parse(jsonArray); 
    } catch (Exception e) { 
     throw new Exception("Json might be malformed"); 
    } 
    return flatJson; 
} 

private void flatten(JSONArray obj, Map<String, String> flatJson, String prefix) { 
    int length = obj.length(); 
    for (int i = 0; i < length; i++) { 
     if (obj.get(i).getClass() == JSONArray.class) { 
      JSONArray jsonArray = (JSONArray) obj.get(i); 
      if (jsonArray.length() < 1) continue; 
      flatten(jsonArray, flatJson, prefix + i); 
     } else if (obj.get(i).getClass() == JSONObject.class) { 
      JSONObject jsonObject = (JSONObject) obj.get(i); 
      flatten(jsonObject, flatJson, prefix + (i + 1)); 
     } else { 
      String value = obj.getString(i); 
      if (value != null) 
       flatJson.put(prefix + (i + 1), value); 
     } 
    } 
} 

private void flatten(JSONObject obj, Map<String, String> flatJson, String prefix) { 
    Iterator iterator = obj.keys(); 
    while (iterator.hasNext()) { 
     String key = iterator.next().toString(); 
     if (obj.get(key).getClass() == JSONObject.class) { 
      JSONObject jsonObject = (JSONObject) obj.get(key); 
      flatten(jsonObject, flatJson, prefix); 
     } else if (obj.get(key).getClass() == JSONArray.class) { 
      JSONArray jsonArray = (JSONArray) obj.get(key); 
      if (jsonArray.length() < 1) continue; 
      flatten(jsonArray, flatJson, key); 
     } else { 
      String value = obj.getString(key); 
      if (value != null && !value.equals("null")) 
       flatJson.put(prefix + key, value); 
     } 
    } 
} 

}

Вот услуга, с которой я звоню. Я использовал это, чтобы вернуть .txt файл перед тем, так что я не знаю, как использовать это, но я думаю, что если я поток файл обратно он будет обрабатывать его ...:

getFile: function(jsonObj, fileName) { 
     var _defer = $q.defer(); 
     $http.post("/web/csvexport/", jsonObj).success(function(data, status, headers) { 

      var octetStreamMime = "application/octet-stream"; 

      // Get the headers 
      headers = headers(); 

      // Get the filename from the x-filename header or default to "download.bin" 
      //var filename = headers["x-filename"] || "logfile.log"; 
      var filename = fileName; 

      // Determine the content type from the header or default to "application/octet-stream" 
      var contentType = headers["content-type"] || octetStreamMime; 

      if(navigator.msSaveBlob) 
      { 
       // Save blob is supported, so get the blob as it's contentType and call save. 
       var blob = new Blob([data], { type: contentType }); 
       navigator.msSaveBlob(blob, filename); 
       console.log("SaveBlob Success"); 
      } 
      else 
      { 
       // Get the blob url creator 
       var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL; 
       if(urlCreator) 
       { 
        // Try to use a download link 
        var link = document.createElement("a"); 
        if("download" in link) 
        { 
         // Prepare a blob URL 
         var blob = new Blob([data], { type: contentType }); 
         var url = urlCreator.createObjectURL(blob); 
         link.setAttribute("href", url); 

         // Set the download attribute (Supported in Chrome 14+/Firefox 20+) 
         link.setAttribute("download", filename); 

         // Simulate clicking the download link 
         var event = document.createEvent('MouseEvents'); 
         event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); 
         link.dispatchEvent(event); 

         console.log("Download link Success"); 

        } else { 
         // Prepare a blob URL 
         // Use application/octet-stream when using window.location to force download 
         var blob = new Blob([data], { type: octetStreamMime }); 
         var url = urlCreator.createObjectURL(blob); 
         window.location = url; 

         console.log("window.location Success"); 
        } 

       } else { 
        console.log("Not supported"); 
       } 
      } 

ответ

1

Во-первых, почему Дон» t использовать CSV mime type вместо html?

заменить

response.setContentType("text/html;charset=UTF-8"); 

по

response.setContentType("text/csv"); 

И вы знаете, что Джексон, Java JSON API ручки CSV? см. https://github.com/FasterXML/jackson-dataformat-csv

Окончательно, в контроллере вам необходимо использовать printWriter из ответа для записи CSV.

Не забывайте, чтобы использовать Stream или BufferedString для обработки большого файла и улучшения производительности.

+0

Я думаю, что забыл изменить его обратно в csv после другого образца, который я пытался. Благодарю. И я не знаком с Джексоном или этим JSON API, я должен посмотреть, смогу ли я это использовать. Я все еще не уверен в коде, чтобы записать файл обратно, хотя – mrshickadance

Смежные вопросы