最近在做一个火炬之光的技能系统的demo,需要用到配置表工具。

&在网上没有找到让自己满意的工具&自己感兴趣,

so自己做了一个。

我使用的C#语言,用了网上的SimpleJSON工具脚本来做的,下面直接上代码:

界面代码(ps.注释掉的部分是生成对应代码的类,但感觉目前写的不好,就不上传了。。。)

 using System;
 using System.Collections.Generic;
 using System.Windows.Forms;

 namespace ConfigTool
 {
     public partial class Form1 : Form
     {
         private string excelPath;
         private string jsonPath;
         private string codePath;

         public Form1()
         {
             InitializeComponent();
             InitPath();
         }

         private void InitPath()
         {
             excelPath = Tool. GetPath() + "ConfigExcel";
             jsonPath = Tool.GetPath() + "Assets\\Resources\\Config";
             //codePath = Tool.GetPath(5) + "Assets\\Scripts\\Config";
             folderPath.Text = excelPath;
         }

         private void createJsonAndCode_Click(object sender, EventArgs e)
         {
             ExcelToJson etoJson = new ExcelToJson(excelPath, jsonPath);
             etoJson.CreateJsonFiles();
             fileNum.Text = etoJson.GetFileCount().ToString();

             //AutoCreateCode createCode = new AutoCreateCode(codePath, etoJson.JsonDic);
             //createCode.CreateCodeFiles();
         }
     }
 }

工具代码

 using System;
 using System.IO;

 namespace ConfigTool
 {
     public static class Tool
     {
         /// <summary>
         /// 创建文件
         /// </summary>
         /// <param name="_path">文件路径(包含文件名及其后缀)</param>
         /// <param name="_content">文件存储的内容</param>
         public static void CreateFile(string _path, string _content)
         {
             FileStream file = new FileStream(_path, FileMode.Create, FileAccess.Write);
             StreamWriter writer = new StreamWriter(file);
             writer.WriteLine(_content);
             writer.Close();
             file.Close();
             Console.WriteLine(string.Format("生成{0}", _path));
         }

         /// <summary>
         /// 删除指定文件夹下的子文件(不含子文件夹)
         /// </summary>
         /// <param name="_folderPath">文件夹路径</param>
         public static void ClearFiles(string _folderPath)
         {
             Console.WriteLine("开始删除文件,文件夹目录为" + _folderPath);
             if (!Directory.Exists(_folderPath))
             {
                 Console.WriteLine("指定的文件路径不存在");
                 return;
             }
             var files = Directory.GetFiles(_folderPath);
             foreach (var a in files)
             {
                 File.Delete(a);
             }
             Console.WriteLine("删除完成");
         }

         /// <summary>
         /// 获取当前exe的上层几层路径
         /// </summary>
         /// <param name="_upperNum">向上几级</param>
         /// <returns>路径</returns>
         public static string GetPath(int _upperNum)
         {
             string exePath = Directory.GetCurrentDirectory();
             string[] temp = exePath.Split("\\".ToCharArray());
             string path = string.Empty;
             ; i < temp.Length - _upperNum; i++)
             {
                 path += temp[i];
                 path += "\\";
             }
             return path;
         }
     }
 }

excel转json文件代码

 using System;
 using System.Collections.Generic;
 using SimpleJSON;
 using System.IO;
 using System.Data.OleDb;
 using System.Data;

 namespace ConfigTool
 {
     public class ExcelToJson
     {
         private string sourcePath;
         private string savePath;
         private Dictionary<string, JSONClass> jsonDic = new Dictionary<string, JSONClass>();
         private int fileNum;
         public Dictionary<string, JSONClass> JsonDic
         {
             get
             {
                 return jsonDic;
             }
         }

         public ExcelToJson(string _sourcePath, string _savePath)
         {
             sourcePath = _sourcePath;
             savePath = _savePath;
         }

         public void CreateJsonFiles()
         {
             Tool.ClearFiles(savePath);
             AllConvertToJsons();
             foreach (var a in jsonDic)
             {
                 string path = string.Format("{0}\\{1}.json", savePath, a.Key);
                 Tool.CreateFile(path, a.Value.ToString());
             }
         }

         public int GetFileCount()
         {
             return fileNum;
         }

         private void AllConvertToJsons()
         {
             jsonDic.Clear();
             var excelPathList = GetAllExcel();
             fileNum = excelPathList.Count;
             foreach (var a in excelPathList)
             {
                 ConvertToJson(a);
             }
         }

         private void ConvertToJson(string _excelPath)
         {
             OleDbConnection connection = CreateExcelOleDbConnection(_excelPath);
             if (connection == null)
             {
                 Console.WriteLine("无法成功生成OleDbConnection");
                 return;
             }
             List<OleDbDataReader> readers = InitExcel(_excelPath, connection);
             ReadersToJson(readers, connection);
         }

         #region ConvertToJson 具体实现方法
         private List<OleDbDataReader> InitExcel(string _excelPath, OleDbConnection _connection)
         {
             if (_connection == null)
             {
                 return null;
             }
             _connection.Open();
             DataTable dataTable = _connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

             List<OleDbDataReader> readers = new List<OleDbDataReader>();
             ; i < dataTable.Rows.Count; i++)
             {
                 string sheetName = dataTable.Rows[i]["Table_Name"].ToString();
                 if (sheetName.Contains("#"))//表中页签开头'#'为注释
                 {
                     continue;
                 }
                 OleDbCommand command = new OleDbCommand(string.Format("select * from [{0}]", sheetName), _connection);
                 readers.Add(command.ExecuteReader());
             }
             return readers;
         }

         private OleDbConnection CreateExcelOleDbConnection(string _excelPath)
         {
             if (!File.Exists(_excelPath))
             {
                 Console.WriteLine("未找到指定文件" + _excelPath);
                 return null;
             }

             string strExtension = Path.GetExtension(_excelPath);
             string initStr = string.Empty;
             switch (strExtension)
             {
                 case ".xls":
                     initStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1;\"", _excelPath);
                     break;
                 case ".xlsx":
                     initStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1;\"", _excelPath);
                     break;
                 default:
                     Console.WriteLine("目标文件不是excel文件");
                     return null;
                     break;
             }

             return new OleDbConnection(initStr);
         }

         private void ReadersToJson(List<OleDbDataReader> _readers, OleDbConnection _connection)
         {
             ; i < _readers.Count; i++)
             {
                 OleDbDataReader reader = _readers[i];

                 //获取表头
                 reader.Read();
                 ].ToString();
                 if (configTitle == null || configTitle == "")
                 {
                     Console.WriteLine("表头填写不正确");
                 }
                 ;

                 //跳过无用行
                 while (reader.Read())
                 {
                     nextLineIndex++;
                     ].ToString() == "Start")
                     {
                         break;
                     }
                 }

                 //存储json的key,simplejson无法直接获取key
                 int maxRowNum = reader.FieldCount;
                 JSONClass jsonKey = new JSONClass();
                 JSONClass jsonData = new JSONClass();
                 reader.Read();
                 ; j < maxRowNum; j++)
                 {
                     string key = reader[j].ToString();
                     jsonKey.Add(key, key);
                 }
                 jsonData.Add("variate", jsonKey);

                 //依次按行读取有效数据
                 while (reader.Read())
                 {
                     ].ToString();
                     if (key == "End")
                     {
                         break;
                     }

                     JSONClass curLineJson = new JSONClass();
                     ; j < maxRowNum; j++)
                     {
                         curLineJson.Add(jsonKey[j - ], reader[j].ToString());
                     }
                     jsonData.Add(key, curLineJson);
                 }
                 reader.Close();

                 //将当前页签的json文件存储到字典中
                 if (jsonDic.ContainsKey(configTitle))
                 {
                     jsonDic[configTitle].Add(jsonData);
                 }
                 else
                 {
                     jsonDic.Add(configTitle, jsonData);
                 }
             }
             _connection.Close();
         }
         #endregion ConvertToJson 具体实现方法

         /// <summary>
         /// 获取源文件夹中的excel文件,文件名中的"###"作为注释,含有"###"的文件不计进行转换
         /// </summary>
         /// <returns>excel文件路径列表</returns>
         private List<string> GetAllExcel()
         {
             DirectoryInfo dirInfo = new DirectoryInfo(sourcePath);
             FileInfo[] fileInfos = dirInfo.GetFiles();
             List<string> rtnValue = new List<string>();
             foreach (var a in fileInfos)
             {
                 if (a.FullName.Contains("###"))
                 {
                     continue;
                 }
                 if (a.FullName.Contains(".xlsx")
                     || a.FullName.Contains(".xls"))
                 {
                     if (rtnValue.Contains(a.FullName))
                     {
                         continue;
                     }
                     rtnValue.Add(a.FullName);
                 }
             }
             return rtnValue;
         }
     }
 } 

总结:

起始最核心的部分还是读取excel的部分,感觉应该对OleDbDataReader做一下说明:OleDbDataReader是一行一行来读取excel的读完一行再读下一行。我所写的确定表头,确定excel有效数据开始行就是利用这个性质来做的。

ps.刚开始理解不好,写了好几个无用的循环,后来反应过来改掉了(手动捂脸)。

excel转json工具的制作(C#语言)的更多相关文章

  1. Python——Excel转Json工具

    Python工具Excel转Json 前置条件 1.安装python 下载python 我下载的是2.7: 2.配置环境变量 我的电脑右键--属性--高级系统设置--环境变量: 添加python的安装 ...

  2. Excel转Json工具

    应用程序在本地的数据配置的格式一般有JSON.XML.YAML.INI等格式,但是如果直接编写JSON数据往往不是特别方便, 今天给大家分享的是如何在EXCEL配置好数据,然后一键转换成JSON和C# ...

  3. TableML-GUI篇(Excel编译/解析工具)

    项目情况 本文接上篇TableML Excel编译/解析工具,本文主要介绍GUI工具的使用,及配置项,如果你想了解此工具更加详细的说明,请阅读上篇文章. 项目地址:https://github.com ...

  4. Excel转Json,Json转CSharp

    一份给策划最好的礼物!就是:Excel2Json2CSharp 策划配置Excel,动不动就要改数值啊,增加字段啊. 程序这边对应的解析类就得改动啊.整一个麻烦了得! 所以我就整理了这个Excel2J ...

  5. Octopus——excel导入导出工具

    Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...

  6. Excel转Json

    参考: Excel2JSON Excel转JSON Excel另存为JSON的技巧  (office的插件) excel2json 游戏程序员的自我修养 (其他人写的工具) Excel转JSON格式- ...

  7. 强大的json工具:fastJson

    fastJson   FastJSON是一个很好的java开源json工具类库,相比其他同类的json类库,它的速度的确是fast,最快!但是文档做得不好,在应用前不得不亲测一些功能.   实际上其他 ...

  8. 使用bison和yacc制作脚本语言(1)

    使用bison和yacc制作脚本语言(1) 环境: 环境 windows 10 Cygwin64 语言 C 工具 mingw bison flex 主要是使用bison和flex这两个软件,编译器无所 ...

  9. java简易excel导入导出工具(封装POI)

    Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...

随机推荐

  1. 如何使用DOS命令(cd命令)

    如何使用DOS命令 DOS是Disk Operation System(磁盘操作系统)的简称,是个人计算机上的一类操作系统.它直接操纵管理硬盘的文件,一般都是黑底白色文字的界面.顾名思义,DOS主要是 ...

  2. [git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF

    遇到这两个错误,是因为Git的换行符检查功能. core.safecrlf Git提供了一个换行符检查功能(core.safecrlf),可以在提交时检查文件是否混用了不同风格的换行符.这个功能的选项 ...

  3. UnicodeEncodeError: 'ascii' codec can't encode characters in position 820-823: ordinal not in range(128)

    真是奇怪了,在itermi里 print(data) 就能直接运行,而在sublime里,就非得写成这样 print(data.encode('utf-8'))

  4. 锁(MySQL篇)—之MyISAM表锁

    前言 锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...

  5. JQuery中$.each 和$(selector).each()的区别详解

    PS:晚上在写页面时,发现了一个问题,$.each 和$(selector).each()有哪些区别?百度搜索关键词,首页显示出来一些前人的经验,总结一下,发上来. 1.$(selector).eac ...

  6. temp

    netstat -tlnap lsof -i :40735 ps -ef|grep 10259 iftop iptraf nethogs gidxylxhqp http://blog.csdn.net ...

  7. 启动Tomcat内存溢出解决:java.lang.OutOfMemoryError: PermGen space

    Eclispe 设置Tomcat的时候,双击server的配置,配置如下:

  8. Web压力测试系统-nGrinder

    nGrinder是一个免费的.开放源代码的Web性能测试工具.它本身是JAVA WEB应用程序,在Tomcat服务器中运行. 它由一个controller端和一个或多个Agent端组成.nGrinde ...

  9. linux shell -常用脚本

    题记:来源与网络和自己工作中总结.有些脚本片段,函数经常使用. 1.判断登录用户 1.1脚本 [devtac@test_1 shell]$ vi check_user.sh #! /bin/sh ec ...

  10. [转载]深入理解HTTP Session

    深入理解HTTP Session   session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...