excel转json工具的制作(C#语言)
最近在做一个火炬之光的技能系统的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#语言)的更多相关文章
- Python——Excel转Json工具
Python工具Excel转Json 前置条件 1.安装python 下载python 我下载的是2.7: 2.配置环境变量 我的电脑右键--属性--高级系统设置--环境变量: 添加python的安装 ...
- Excel转Json工具
应用程序在本地的数据配置的格式一般有JSON.XML.YAML.INI等格式,但是如果直接编写JSON数据往往不是特别方便, 今天给大家分享的是如何在EXCEL配置好数据,然后一键转换成JSON和C# ...
- TableML-GUI篇(Excel编译/解析工具)
项目情况 本文接上篇TableML Excel编译/解析工具,本文主要介绍GUI工具的使用,及配置项,如果你想了解此工具更加详细的说明,请阅读上篇文章. 项目地址:https://github.com ...
- Excel转Json,Json转CSharp
一份给策划最好的礼物!就是:Excel2Json2CSharp 策划配置Excel,动不动就要改数值啊,增加字段啊. 程序这边对应的解析类就得改动啊.整一个麻烦了得! 所以我就整理了这个Excel2J ...
- Octopus——excel导入导出工具
Octopus Octopus是一个简易的Excel导入导出工具.目前主要就两个功能: 导入:将excel中一行数据转换为指定的java对象,并通过指定的正则表达式检查合法性. 导出:按照给定的xml ...
- Excel转Json
参考: Excel2JSON Excel转JSON Excel另存为JSON的技巧 (office的插件) excel2json 游戏程序员的自我修养 (其他人写的工具) Excel转JSON格式- ...
- 强大的json工具:fastJson
fastJson FastJSON是一个很好的java开源json工具类库,相比其他同类的json类库,它的速度的确是fast,最快!但是文档做得不好,在应用前不得不亲测一些功能. 实际上其他 ...
- 使用bison和yacc制作脚本语言(1)
使用bison和yacc制作脚本语言(1) 环境: 环境 windows 10 Cygwin64 语言 C 工具 mingw bison flex 主要是使用bison和flex这两个软件,编译器无所 ...
- java简易excel导入导出工具(封装POI)
Octopus 如何导入excel 如何导出excel github项目地址 Octopus Octopus 是一个简单的java excel导入导出工具. 如何导入excel 下面是一个excel文 ...
随机推荐
- 【基础】MVC路由规则
一.RouteData解析过程 在ASP.NET MVC中,服务器收到来自客户端的请求后,会经过一些列的处理拿到请求的数据,比如在Pipeline 管线事件中,通过订阅适当的事件,将HttpConte ...
- win10下的使用
一.win10下使用win7那样的图片查看器快些. 打开图片的设置,关闭自动增强我的图片 二.查看win10秘钥 1.打开注册表,依次定位:HKEY_LOCAL_MACHINE/SOFTWARE/Mi ...
- IOS和Android图标尺寸
刚开始接触UI的时候,碰到的最多的就是尺寸问题,今天我们就来谈谈IOS和Android 图标设计尺寸吧! 一.IOS篇 1.iOS app图标的圆角半径是多少? (注:现在IOS图标是不需要再画圆角了 ...
- .vue文件里引用单独样式和js文件
style只能引一个,script可以引多个
- Tomcat 利用server.xml进行其他盘符的其他项目映射的部署以及JSP引用其他盘符的图片(虚拟目录及虚拟路径)
Tomcat 利用server.xml进行项目映射的部署 2013-07-17 15:14 12843人阅读 评论(4) 收藏 举报 分类: web 开发(5) 版权声明:本文为博主原创文章,欢迎 ...
- 【学习笔记】JAva编程思想之多态
1.如果java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽在基类的任何版本.因此,无论是在该层或者他的基类中对方法进行定义,重载机制都可以正常工作. 2.使用@O ...
- MySQL自动化运维之用mysqldump和mysqlbinlog实现某一数据库的每周全备和每天差异备份,并添加到执行计划【热备】
案例: 线上有一数据库,需要每周全备一次,每天差备一次[安全起见还是差备吧,不要增备,不要吝啬磁盘哦,而且差备恢复还很快] 1.每周对数据库hellodb做完全备份 crontab任务计划: * * ...
- 2. K线学习知识二
1. K线 - 阳线 定义:阳线是证券市场上指收盘价高于开盘价的K线,K线图中用红线标注表示涨势. A:小阳星 全日中股价波动很小,开盘价与收盘价极其接近,收盘价略高于开盘价. 小阳星的出现,表明行情 ...
- c#过滤html标签
public string HtmlFilter(string html) { //设置要删除的标记 string[] lable = { "font ...
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...