欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#实现Json转DataTable并导出Excel的方法示例

程序员文章站 2022-05-26 14:57:45
本文实例讲述了c#实现json转datatable并导出excel的方法。分享给大家供大家参考,具体如下: 需求:有一个log文件,需要整理成excel,日志文件里面的数...

本文实例讲述了c#实现json转datatable并导出excel的方法。分享给大家供大家参考,具体如下:

需求:有一个log文件,需要整理成excel,日志文件里面的数据都是json字符串

思路是,把json字符串转换成datatable,然后导出到excel

在网上找了一些资料,整理了以下三种类型的json

一、json转换datatable

1.处理简单json:

[{"mac":"20:f1:7c:c5:cd:80","rssi":"-86","ch":"9"},{"mac":"20:f1:7c:c5:cd:85","rssi":"-91","ch":"9"}]

/// <summary>
/// json 字符串 转换为 datatable数据集合
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static datatable todatatabletwo(string json)
{
  datatable datatable = new datatable(); //实例化
  datatable result;
  try
  {
    javascriptserializer javascriptserializer = new javascriptserializer();
    javascriptserializer.maxjsonlength = int32.maxvalue; //取得最大数值
    arraylist arraylist = javascriptserializer.deserialize<arraylist>(json);
    if (arraylist.count > 0)
    {
      foreach (dictionary<string, object> dictionary in arraylist)
      {
        if (dictionary.keys.count<string>() == 0)
        {
          result = datatable;
          return result;
        }
        //columns
        if (datatable.columns.count == 0)
        {
          foreach (string current in dictionary.keys)
          {
            datatable.columns.add(current, dictionary[current].gettype());
          }
        }
        //rows
        datarow datarow = datatable.newrow();
        foreach (string current in dictionary.keys)
        {
          datarow[current] = dictionary[current];
        }
        datatable.rows.add(datarow); //循环添加行到datatable中
      }
    }
  }
  catch
  {
  }
  result = datatable;
  return result;
}

2.处理复杂json

[{"id":"00e58d51","data":[{"mac":"20:f1:7c:c5:cd:80","rssi":"-86","ch":"9"},{"mac":"20:f1:7c:c5:cd:85","rssi":"-91","ch":"9"}]},
{"id":"00e58d53","data":[{"mac":"bc:d1:77:8e:26:78","rssi":"-94","ch":"11"},{"mac":"14:d1:1f:3e:bb:ac","rssi":"-76","ch":"11"},{"mac":"20:f1:7c:d4:05:41","rssi":"-86","ch":"12"}]}]

/// <summary>
/// json 字符串 转换为 datatable数据集合
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static datatable todatatable(string json)
{
  datatable datatable = new datatable(); //实例化
  datatable result;
  try
  {
    javascriptserializer javascriptserializer = new javascriptserializer();
    javascriptserializer.maxjsonlength = int32.maxvalue; //取得最大数值
    arraylist arraylist = javascriptserializer.deserialize<arraylist>(json);
    if (arraylist.count > 0)
    {
      foreach (dictionary<string, object> dictionary in arraylist)
      {
        if (dictionary.keys.count<string>() == 0)
        {
          result = datatable;
          return result;
        }
        //columns
        if (datatable.columns.count == 0)
        {
          foreach (string current in dictionary.keys)
          {
            if (current != "data")
              datatable.columns.add(current, dictionary[current].gettype());
            else
            {
              arraylist list = dictionary[current] as arraylist;
              foreach (dictionary<string, object> dic in list)
              {
                foreach (string key in dic.keys)
                {
                  datatable.columns.add(key, dic[key].gettype());
                }
                break;
              }
            }
          }
        }
        //rows
        string root = "";
        foreach (string current in dictionary.keys)
        {
          if (current != "data")
            root = current;
          else
          {
            arraylist list = dictionary[current] as arraylist;
            foreach (dictionary<string, object> dic in list)
            {
              datarow datarow = datatable.newrow();
              datarow[root] = dictionary[root];
              foreach (string key in dic.keys)
              {
                datarow[key] = dic[key];
              }
              datatable.rows.add(datarow);
            }
          }
        }
      }
    }
  }
  catch
  {
  }
  result = datatable;
  return result;
}

3.处理不规则json,因为列并不确定,所以直接定义列,不动态生成

[{"id":"00e58d53","data":[{"mac":"34:b3:54:89:86:64","rssi":"-86","ch":"13"},{"mac":"50:bd:5f:02:80:44","rssi":"-90","ch":"1"}]},
{"id":"00ccda81","data":[{"mac":"bc:46:99:4e:96:c8","rssi":"-92","ch":"1"},{"mac":"bc:3a:ea:fc:77:6c","rssi":"-93","ch":"6","ds":"y","essid":"vienna hotel wifi"}]}]

/// <summary>
/// json 字符串 转换为 datatable数据集合
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static datatable todatatable(string json)
{
  datatable datatable = new datatable(); //实例化
  datatable result;
  try
  {
    datatable.columns.add("id");
    datatable.columns.add("mac");
    datatable.columns.add("rssi");
    datatable.columns.add("ch");
    datatable.columns.add("ts");
    datatable.columns.add("tmc");
    datatable.columns.add("tc");
    datatable.columns.add("ds");
    datatable.columns.add("essid");
    javascriptserializer javascriptserializer = new javascriptserializer();
    javascriptserializer.maxjsonlength = int32.maxvalue; //取得最大数值
    arraylist arraylist = javascriptserializer.deserialize<arraylist>(json);
    if (arraylist.count > 0)
    {
      foreach (dictionary<string, object> dictionary in arraylist)
      {
        if (dictionary.keys.count<string>() == 0)
        {
          result = datatable;
          return result;
        }//rows
        string root = "";
        foreach (string current in dictionary.keys)
        {
          if (current != "data")
            root = current;
          else
          {
            arraylist list = dictionary[current] as arraylist;
            foreach (dictionary<string, object> dic in list)
            {
              datarow datarow = datatable.newrow();
              datarow[root] = dictionary[root];
              foreach (string key in dic.keys)
              {
                datarow[key] = dic[key];
              }
              datatable.rows.add(datarow);
            }
          }
        }
      }
    }
  }
  catch
  {
  }
  result = datatable;
  return result;
}

二、导出excel

/// <summary>
/// 导出excel
/// </summary>
/// <param name="table"></param>
/// <param name="file"></param>
public void datatabletocsv(datatable table, string file)
{
  string title = "";
  filestream fs = new filestream(file, filemode.openorcreate);
  streamwriter sw = new streamwriter(new bufferedstream(fs), system.text.encoding.default);
  for (int i = 0; i < table.columns.count; i++)
  {
    title += table.columns[i].columnname + "\t"; //栏位:自动跳到下一单元格
  }
  title = title.substring(0, title.length - 1) + "\n";
  sw.write(title);
  foreach (datarow row in table.rows)
  {
    string line = "";
    for (int i = 0; i < table.columns.count; i++)
    {
      line += row[i].tostring().trim() + "\t"; //内容:自动跳到下一单元格
    }
    line = line.substring(0, line.length - 1) + "\n";
    sw.write(line);
  }
  sw.close();
  fs.close();
}

三、调用实现,数据导出到excel

protected void button1_click(object sender, eventargs e)
{
  string str = file.readalltext(@"c:\users\admin\desktop\json.txt");
  datatable dt = todatatable(str);
  this.datatabletocsv(dt, @"e:\json.xls"); //调用函数
}

ps:关于json操作,这里再为大家推荐几款比较实用的json在线工具供大家参考使用:

在线json代码检验、检验、美化、格式化工具:

json在线格式化工具:

在线xml/json互相转换工具:

json代码在线格式化/美化/压缩/编辑/转换工具:

在线json压缩/转义工具:

更多关于c#相关内容还可查看本站专题:《c#字符串操作技巧总结》、《c#常见控件用法教程》、《winform控件用法总结》、《c#程序设计之线程使用技巧总结》、《c#中xml文件操作技巧汇总》、《c#数据结构与算法教程》、《c#数组操作技巧总结》及《c#面向对象程序设计入门教程

希望本文所述对大家c#程序设计有所帮助。