下面是源代码:vs版本是 vs2017社区版
百度云(不需要积分):链接:https://pan.baidu.com/s/14mHxL67qjuEWKjUPrSH2yA 提取码:k40n
优快云(需要积分):https://download.youkuaiyun.com/download/sun_zeliang/11341469
如果不需要源代码,只想要工具的话:
百度云(不需要积分): 链接:https://pan.baidu.com/s/1H5PTJVjX7X3TdY-SX5ktCg 提取码:8y5n 提取码:8y5n
优快云(需要积分):https://download.youkuaiyun.com/download/sun_zeliang/11341466
使用方法参考工具根目录readme.txt,学别人高级软件一回哈哈。完结,撒花!!
将Xml的帮助类修改了一下,支持多个导出和保存了
直接上代码
//Xml的Model类
public class Mdl_ExportXml
{
public string ExcelPath { get; set; }
public string JsonFileName { get; set; }
public List<string> ExcelNameList { get; set; }
public List<string> JsonColumnTypeList { get; set; }
public List<string> JsonColumnNameList { get; set; }
}
public class XmlHelper
{
public static void CreateXml(List<Mdl_ExportXml> mdl_ExportXmls, string xmlName)
{
//创建一个XML文档对象
XmlDocument doc = new XmlDocument();
//声明XML头部信息
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
//添加进doc对象子节点
doc.AppendChild(dec);
//创建根节点
XmlElement files = doc.CreateElement("files");
doc.AppendChild(files);
foreach (Mdl_ExportXml mdl_ExportXml in mdl_ExportXmls)
{
//再创建根节点下的子节点
XmlElement file = doc.CreateElement("file");
//设置子节点属性
file.SetAttribute("excel_path", mdl_ExportXml.ExcelPath); //excel路径
file.SetAttribute("json_file_name", mdl_ExportXml.JsonFileName); //导出的json文件名
files.AppendChild(file);
XmlElement columns = doc.CreateElement("columns");
for (int i = 0; i < mdl_ExportXml.ExcelNameList.Count; i++)
{
//再创建根节点下的子节点
XmlElement field = doc.CreateElement("column");
//设置子节点属性
field.SetAttribute("excel_column_name", mdl_ExportXml.ExcelNameList[i]); //excel名称
field.SetAttribute("json_column_name", mdl_ExportXml.JsonColumnNameList[i]); //json字段名
field.SetAttribute("json_column_type", mdl_ExportXml.JsonColumnTypeList[i]); //json字段类型
columns.AppendChild(field);
}
//最后把标记添加到根节点的子节点下
file.AppendChild(columns);
}
//doc文档对象保存写入
doc.Save(xmlName);
}
public static List<Mdl_ExportXml> LoadXml(string xmlName)
{
List<Mdl_ExportXml> mdl_ExportXmls = new List<Mdl_ExportXml>();
//将XML文件加载进来
XmlDocument doc = new XmlDocument();
doc.Load(xmlName);
//获取根节点
XmlElement root = doc.DocumentElement;
XmlNodeList files = root.GetElementsByTagName("file"); //获得所有的excel文件
foreach (XmlNode file in files)
{
Mdl_ExportXml mdl_ExportXml = new Mdl_ExportXml();
mdl_ExportXml.ExcelPath = ((XmlElement)file).GetAttribute("excel_path");
mdl_ExportXml.JsonFileName = ((XmlElement)file).GetAttribute("json_file_name");
List<string> excelNameList = new List<string>();
List<string> jsonNameList = new List<string>();
List<string> jsonTypeList = new List<string>();
XmlNode node = file.FirstChild; //获得所有的column
foreach (XmlNode column in node.ChildNodes)
{
string excel_column_name = ((XmlElement)column).GetAttribute("excel_column_name");
string json_column_name = ((XmlElement)column).GetAttribute("json_column_name");
string json_column_type = ((XmlElement)column).GetAttribute("json_column_type");
excelNameList.Add(excel_column_name);
jsonNameList.Add(json_column_name);
jsonTypeList.Add(json_column_type);
}
mdl_ExportXml.ExcelNameList = excelNameList;
mdl_ExportXml.JsonColumnNameList = jsonNameList;
mdl_ExportXml.JsonColumnTypeList = jsonTypeList;
mdl_ExportXmls.Add(mdl_ExportXml);
}
return mdl_ExportXmls;
}
}
导出来的json是这样的:
应该是满足需要了,接下来看载入的数据
这边就给出断点调试下的数据了,相信大家也能看明白
根据对比xml文件内容可以看出来,载入的xml file有3个,然后第一个的信息如上述内容,完全是正确的。
操作Excel的方法也修改了,原先使用基于com组件的操作放,会导致后台很多Excel.exe的进程,而且兼容性也很不好,这边将改为采用EPPLUS 第三方链接库来操作Excel。
代码更加简单了,这里直接给出EPPLUS 的Excel转DataTable的代码。
private DataTable WorksheetToTable(string filePath)
{
try
{
FileInfo existingFile = new FileInfo(filePath);
ExcelPackage package = new ExcelPackage(existingFile);
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];//选定 指定页 默认第一个Sheet
//获取worksheet的行数
int rows = worksheet.Dimension.End.Row;
//获取worksheet的列数
int cols = worksheet.Dimension.End.Column;
DataTable dt = new DataTable(worksheet.Name);
DataRow dr = null;
for (int i = 1; i <= rows; i++)
{
if (i > 1)
dr = dt.Rows.Add();
for (int j = 1; j <= cols; j++)
{
//默认将第一行设置为datatable的标题
if (i == 1)
dt.Columns.Add(GetString(worksheet.Cells[i, j].Value));
//剩下的写入datatable
else
dr[j - 1] = GetString(worksheet.Cells[i, j].Value);
}
}
return dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
然后还添加了一个工具的设置类,因为有一些路径是具有记忆功能,比如导出目录,载入和保存Xml的路径,这边也存入Xml文件然后放到工具的根目录下,这边代码就不给了,比上面的Xml操作方法简单很多。
根据界面,因为导出C#暂时不做,我们现在就剩导出单个Json文件和导出所有Json文件了。哈哈有很多小的代码没有讲,最后会放出源码,大家感兴趣可以看一下,接下来写导出单个Json文件。
导出单个Json文件
/******************************************************************************************
* 导出一个Json
* */
private void ExportOneJson(Mdl_ExportXml mdl_ExportXml)
{
string excelPath = mdl_ExportXml.ExcelPath;
DataTable dt = WorksheetToTable(excelPath);
//创建一个新的DataTable用于导出Json
DataTable newDt = new DataTable();
foreach (var item in mdl_ExportXml.JsonColumnNameList)
{
newDt.Columns.Add(item);
}
DataRow dr = newDt.NewRow();
foreach (var item in dt.Rows)
{
dr = newDt.NewRow();
for (int i = 0; i < newDt.Columns.Count; i++)
{
if (mdl_ExportXml.JsonColumnTypeList[i] == "int")
{
dr[newDt.Columns[i]] = int.Parse(((DataRow)item)[i].ToString());
}
else
{
dr[newDt.Columns[i]] = ((DataRow)item)[i].ToString();
}
}
newDt.Rows.Add(dr);
}
string json = JsonConvert.SerializeObject(newDt);
json = ConvertJsonString(json);
string filePath = mdl_SetXml.ExportJsonPath;
string fileName = mdl_ExportXml.JsonFileName + ".json";
SaveJsonFile(filePath, fileName, json);
}
/******************************************************************************************
* 格式化Json字符串
* */
private string ConvertJsonString(string json)
{
//格式化json字符串
JsonSerializer serializer = new JsonSerializer();
TextReader tr = new StringReader(json);
JsonTextReader jtr = new JsonTextReader(tr);
object obj = serializer.Deserialize(jtr);
if (obj != null)
{
StringWriter textWriter = new StringWriter();
JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
{
Formatting = Formatting.Indented,
Indentation = 4,
IndentChar = ' '
};
serializer.Serialize(jsonWriter, obj);
return textWriter.ToString();
}
else
{
return json;
}
}
/******************************************************************************************
* 保存Json
* */
private void SaveJsonFile(string FilePath, string FileName, string content)
{
string strFilePath = FilePath + "//" + FileName;
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath);
}
StreamWriter write = new StreamWriter(strFilePath, false, System.Text.Encoding.UTF8);
write.Write(content);
write.Close();
}
导出单个Json文件
也就是for循环把所有的Excel导出啦,这边就不给出代码了。
总结
至此,导表工具开发结束啦,主要用到的就是操作Excel,DataTable转Json,生成Xml等知识点了,可能还有Bug,等之后使用中遇到在改,还有一个问题就是,因为开发的时候并没有太多测试性能,有可能Excel数量多,数据量大会卡,这个也后面在改了,总之,先用着哈哈。
感谢各位的观看,也欢迎大佬指导一下,总感觉写的不是很好,很多地方都没有推敲。