JSON格式串以CSV格式保存

在报表项目开发过程中,UI端显示的数据用户想通过界面的”下载“按钮保存下来,而数据已经以JSON格式得到了,这是只需要把json格式的文件转化为excel,怎么转化,开源的有org.json.CDL,但这个东东的缺点是转化后就不能UI上的顺序保持一致,为此专门改写了网上的代码,见

  List exportData = getKeyValFromJson(account_rep);
  LinkedHashMap map = getKeyFromJson(account_rep);

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.beanutils.BeanUtils;
 
/**
 * 文件操作
 */
public class CSVUtils {
 
  /**
   * 生成为CVS文件 
   * @param exportData
   *       源数据List
   * @param map
   *       csv文件的列表头map
   * @param outPutPath
   *       文件路径
   * @param fileName
   *       文件名称
   * @return
   */
  @SuppressWarnings("rawtypes")
  public static File createCSVFile(List exportData, LinkedHashMap map, String outPutPath,
                   String fileName,String encoding) {
    File csvFile = null;
    BufferedWriter csvFileOutputStream = null;
    try {
      File file = new File(outPutPath);
      if (!file.exists()) {
        file.mkdir();
      }
      //定义文件名格式并创建
      csvFile = File.createTempFile(fileName, ".csv", new File(outPutPath));
      System.out.println("csvFile:" + csvFile);
      // UTF-8使正确读取分隔符"," 
      csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
        csvFile), encoding), 1024);
      System.out.println("csvFileOutputStream:" + csvFileOutputStream);
      // 写入文件头部 
      for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {
        java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
        csvFileOutputStream
          .write((String) propertyEntry.getValue() != null ? (String) propertyEntry
            .getValue() : "");
        if (propertyIterator.hasNext()) {
          csvFileOutputStream.write(",");
        }
      }
      csvFileOutputStream.newLine();
      // 写入文件内容 
      for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
        Object row = (Object) iterator.next();
        for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
          .hasNext();) {
          java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
            .next();
          csvFileOutputStream.write((String) BeanUtils.getProperty(row,
            (String) propertyEntry.getKey()));
          if (propertyIterator.hasNext()) {
            csvFileOutputStream.write(",");
          }
        }
        if (iterator.hasNext()) {
          csvFileOutputStream.newLine();
        }
      }
      csvFileOutputStream.flush();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        csvFileOutputStream.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return csvFile;
  }
 
  /**
   * 下载文件
   * @param response
   * @param csvFilePath
   *       文件路径
   * @param fileName
   *       文件名称
   * @throws IOException
   */
  public static void exportFile(HttpServletResponse response, String csvFilePath, String fileName)
                                                  throws IOException {
    response.setContentType("application/csv;charset=UTF-8");
    response.setHeader("Content-Disposition",
      "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
 
    InputStream in = null;
    try {
      in = new FileInputStream(csvFilePath);
      int len = 0;
      byte[] buffer = new byte[1024];
      response.setCharacterEncoding("UTF-8");
      OutputStream out = response.getOutputStream();
      while ((len = in.read(buffer)) > 0) {
        out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
        out.write(buffer, 0, len);
      }
    } catch (FileNotFoundException e) {
      System.out.println(e);
    } finally {
      if (in != null) {
        try {
          in.close();
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    }
  }
 
  
 
  /**
   * 下载文件
   * @param response
   * @param csvFilePath
   *       文件路径
   * @param fileName
   *       文件名称
   * @throws IOException
   */
  public static void get(HttpServletResponse response, String csvFilePath, String fileName)
                                                  throws IOException {
    response.setContentType("application/csv;charset=UTF-8");
    response.setHeader("Content-Disposition",
      "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
 
    InputStream in = null;
    try {
      in = new FileInputStream(csvFilePath);
      int len = 0;
      byte[] buffer = new byte[1024];
      response.setCharacterEncoding("UTF-8");
      OutputStream out = response.getOutputStream();
      while ((len = in.read(buffer)) > 0) {
        out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
        out.write(buffer, 0, len);
      }
    } catch (FileNotFoundException e) {
      System.out.println(e);
    } finally {
      if (in != null) {
        try {
          in.close();
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    }
  }
  
  /**
   * 删除该目录filePath下的所有文件
   * @param filePath
   *      文件目录路径
   */
  public static void deleteFiles(String filePath) {
    File file = new File(filePath);
    if (file.exists()) {
      File[] files = file.listFiles();
      for (int i = 0; i < files.length; i++) {
        if (files[i].isFile()) {
          files[i].delete();
        }
      }
    }
  }
 
  /**
   * 删除单个文件
   * @param filePath
   *     文件目录路径
   * @param fileName
   *     文件名称
   */
  public static void deleteFile(String filePath, String fileName) {
    File file = new File(filePath);
    if (file.exists()) {
      File[] files = file.listFiles();
      for (int i = 0; i < files.length; i++) {
        if (files[i].isFile()) {
          if (files[i].getName().equals(fileName)) {
            files[i].delete();
            return;
          }
        }
      }
    }
  }
 
  /**i
   * 返回数组里面存放的是每条item的key-value
   * @param sjoin
   */ 
  public static List getKeyValFromJson(String json){
	  if(json==null || "".endsWith(json)){return null;}
	  List exportData = new ArrayList<Map>();
	 
	  int lenOfJson = json.length();
	  int itemEndIndex = 0;
	  String item="";
	  //[{"date":"2016-08-24","campaign":"铁弯头 额外","group_name":"cese"}]
	  for(int index= 0; index < lenOfJson; index++){
		  if(json.charAt(index)=='[') {
			  System.out.println("开始解析JSON");
		  }
		  
		  if(json.charAt(index)=='{') {//unitl next item
			  System.out.println("开始解析一条item");
			  Map row = new LinkedHashMap<String, String>();
			  index++;
			  while(json.charAt(index)!='}'){
				  index=json.indexOf("\"",index);//direct into '"'
				  int index_keyend=json.indexOf("\":\"",index);//get key的endIndex(不计)
				  String key = json.substring(index+1,index_keyend);
				  
				  index = json.indexOf("\"",index_keyend+3);// index
				  String value = json.substring(index_keyend+3, index);
				  
				  value.replaceAll(",", "");
				  System.out.println(key+":"+value);
				  row.put(key, value);
				  //"," OR "}" after value
				  index+=1;
				  if(json.charAt(index)=='}'){
					  break;
				  }
			  }
			  System.out.println("结束解析一条item");
			  exportData.add(row);
		  }
			  
			  
		 if(json.charAt(index)==']') {
			 System.out.println("结束解析JSON");
	     }  
	  }
	      
	  return exportData;
  }
  
  /**i
   * 返回数组里面存放的是每条item的key-key
   * @param sjoin
   */ 
  public static LinkedHashMap getKeyFromJson(String json){
	  if(json==null || "".endsWith(json)){return null;}
	  LinkedHashMap row = new LinkedHashMap<String, String>();
	  int lenOfJson = json.length();
	  String item="";
	//[{"date":"2016-08-24","campaign":"铁弯头 额外","group_name":"cese"}]
	  for(int index= 0; index < lenOfJson; index++){
		  if(json.charAt(index)=='[') {
			  System.out.println("开始解析JSON");
		  }
		  
		  if(json.charAt(index)=='{') {//unitl next item
			  System.out.println("开始解析一条item");
			  index++;
			  while(json.charAt(index)!='}'){
				  index=json.indexOf("\"",index);//direct into '"'
				  int index_keyend=json.indexOf("\":\"",index);//get key的endIndex(不计)
				  String key = json.substring(index+1,index_keyend);
				  
				  index = json.indexOf("\"",index_keyend+3);// index
				  String value = json.substring(index_keyend+3, index);
				  
				  value =value.replaceAll(",", "");
				  System.out.println(key+":"+value);
				  row.put(key, key);
				  
				  //"," OR "}" after value
				  index+=1;
				  if(json.charAt(index)=='}'){
					  break;
				  }
			  }
			  
			  System.out.println("结束解析一条item");
		  }
		if(row.size()>0){
			break;
		} 

	  }
	  return row;
  }
  /**
   * 测试数据
   * @param args
   */
  @SuppressWarnings({ "rawtypes", "unchecked" })
  public static void main(String[] args) {
  String account_rep = "";
  List exportData = getKeyValFromJson(account_rep);
  LinkedHashMap map = getKeyFromJson(account_rep);
    /*List exportData = new ArrayList<Map>();
    Map row1 = new LinkedHashMap<String, String>();
    row1.put("1", "11");
    row1.put("2", "12");
    row1.put("3", "13");
    row1.put("4", "14");
    exportData.add(row1);
    row1 = new LinkedHashMap<String, String>();
    row1.put("1", "21");
    row1.put("2", "22");
    row1.put("3", "23");
    row1.put("4", "24");
    exportData.add(row1);
    LinkedHashMap map = new LinkedHashMap();
    map.put("1", "first");
    map.put("2", "second");
    map.put("3", "third");
    map.put("4", "fourth");*/
 
    String path = "c:/export/";
    String fileName = "文件导出";
    File file = CSVUtils.createCSVFile(exportData, map, path, fileName,"GB18030");
    String fileName2 = file.getName();
    System.out.println("文件名称:" + fileName2);
  }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Windows上的JSON格式化应用程序可用于将JSON数据转换为易于阅读和理解的格式。这样的应用程序通常具有以下功能和用途: 1. JSON数据格式转化:JSON格式化应用程序可以将JSON字符串转换为带有缩进和换行符的易于阅读的格式。这使得开发人员和分析师更容易理解和分析复杂的JSON数据。 2. 文件编辑和保存JSON格式化应用程序通常支持打开和编辑JSON文件,并可以保存格式化的JSON文件。这使得用户可以轻松地对JSON数据进行修改和保存。 3. JSON语法验证:JSON格式化应用程序可以检查JSON数据的语法是否正确。它可以报告任何语法错误,帮助开发人员和用户更容易地发现和纠正错误。 4. 数据浏览和搜索:JSON格式化应用程序通常提供一个用户友好的界面来浏览和搜索JSON数据。用户可以展开和收起不需要的部分,并使用搜索功能快速定位特定的数据。 5. 数据导入和导出:JSON格式化应用程序通常支持将JSON数据导入和导出到其他格式,如CSV或Excel。这使得用户可以轻松地在不同的数据源和应用程序之间进行数据交换和共享。 总的来说,Windows上的JSON格式化应用程序提供了一个方便和高效的方式来处理和分析JSON数据。它们帮助开发人员和用户更好地理解和利用JSON数据,提高工作效率和开发效果。 ### 回答2: Windows Json格式化应用是一种可以对Json数据进行格式化和美化的应用程序。Json是一种轻量级的数据交换格式,通常用于在不同的系统之间传递和存储数据。然而,Json数据在传输和阅读方面可能不够直观和友好,这就是为什么需要Json格式化应用的原因。 Json格式化应用可以将复杂的Json数据重新格式化为易于阅读和理解的形式。通过应用程序提供的功能,用户可以将Json数据中的缩进、换行、空格等元素进行自定义和调整,使数据更加结构化和清晰。此外,Json格式化应用还可以对Json数据进行排序、过滤和搜索,帮助用户更快速地找到所需的信息。 在Windows平台上,有许多Json格式化应用可供选择。其中一些应用程序具有直观的用户界面,使用户可以通过简单的拖放或导入文件的方式加载和处理Json数据。应用程序通常提供实时预览功能,以便用户可以即时看到格式化后的结果,并进行必要的调整和修改。 此外,Json格式化应用通常还具有批量处理的能力,可以同时处理多个Json文件或大量的Json数据。用户可以设置自定义的格式化规则和选项,以适应不同的数据需求和个人偏好。 总而言之,Windows Json格式化应用是一种方便、易于使用的工具,可以帮助用户将复杂的Json数据重新格式化为更加直观和可读的形式。它使得处理和阅读Json数据变得更加高效和方便,减少了人工解析的工作量,提高了工作效率。 ### 回答3: Windows操作系统上有很多可以用于JSON格式化的应用程序。JSON格式化是将JSON数据转化成可读性更好的形式,使其更易于理解和修改。以下是一些常见的Windows JSON格式化应用: 1. Visual Studio Code:这是一款功能强大的代码编辑器,它支持多种编程语言,并且内置了很多插件。其中之一就是用于JSON格式化的插件。通过该插件,用户可以轻松地对JSON数据进行格式化和美化。 2. Notepad++:这是一个免费的文本编辑器,它支持多种编程语言,并且可以轻松地格式JSON数据。用户只需要将JSON数据复制到Notepad++中,然后选择合适的选项即可完成格式化。 3. JSONLint:这是一个在线的JSON格式验证和格式化工具。用户可以将JSON数据复制到JSONLint的网站上,然后点击“格式化”按钮即可完成格式化。此外,JSONLint还会显示可能存在的语法错误,帮助用户更好地检查和修复JSON数据。 4. JSON Viewer:这是一个可视化的JSON格式化工具,用户可以轻松地在Windows上安装并使用。它可以将JSON数据以树状结构展示,方便用户查看和编辑JSON数据的各个部分。 总之,Windows操作系统上有多种JSON格式化的应用程序可供选择。这些应用程序提供了方便快捷的方式,帮助用户更好地理解和编辑JSON数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值