Unity导表工具开发(三)

本文围绕Unity导表工具开发展开,介绍了工具开发过程中的多项改进,如修改Xml帮助类、采用EPPLUS库操作Excel、添加工具设置类等。还提及导出单个Json文件的方法,最后总结开发结束,指出可能存在性能问题待后续改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity导表工具开发(一)

Unity导表工具开发(二)

Unity导表工具开发(三)

Unity导表工具开发(四)

 

下面是源代码: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数量多,数据量大会卡,这个也后面在改了,总之,先用着哈哈。

感谢各位的观看,也欢迎大佬指导一下,总感觉写的不是很好,很多地方都没有推敲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值