把代码备份一下,免得硬盘又坏了,看来已经造成心理阴影了啊。

方式一:

        //清单范本
public void test1()
{
//生成说明
var ds = ExcelHelper.ExcelToDataSet(true, "清单范本.xlsx");
var dt = ds.Tables[];
dt.Columns.Remove("序号"); //列名
List<string> columnNames = new List<string>();
PropertyInfo[] pArray = typeof(ListingTemplate).GetProperties();
pArray.ToList().ForEach(c =>
{
columnNames.Add(c.Name);
}); //Excel的列名 修改为 属性名
for (int i = ; i < dt.Columns.Count; i++)
{
dt.Columns[i].ColumnName = columnNames[i];
} List<ListingTemplate> allListingTemplates = new List<ListingTemplate>(); //三级节点
List<ListingTemplate> threeNodes = new List<ListingTemplate>();
threeNodes = DataTableToEntities<ListingTemplate>(dt); //一级节点
ListingTemplate oneNode = new ListingTemplate { Id = , Level = , Name = "重庆奉溪高速公路" };
allListingTemplates.Add(oneNode); //二级节点
int twoNodes_StartId = allListingTemplates.OrderByDescending(c => c.Id).FirstOrDefault().Id;
var twoNodes = threeNodes.Where(c => !string.IsNullOrWhiteSpace(c.Chapter)).Select(c =>
{
twoNodes_StartId++;
return new ListingTemplate
{
Id = twoNodes_StartId,
Chapter = c.Chapter,
Name = c.Chapter,
Level = ,
ParentId = oneNode.Id
};
});
allListingTemplates.AddRange(twoNodes); //三级节点 生成树
//根据清单编码生成 判断依据 含有“-”的数量 和 含有“(”的数量 、 名称是否以父节点Code一个开头
int threeNodes_StartId = allListingTemplates.OrderByDescending(c => c.Id).FirstOrDefault().Id;
for (int i = ; i < threeNodes.Count; i++)
{
var item = threeNodes[i];
threeNodes_StartId++; item.Id = threeNodes_StartId;
bool hasBracket = item.Code.Contains("("); int num = item.Code.Split(new string[] { "-" }, StringSplitOptions.None).Length - ;
if ((num == ) && !string.IsNullOrWhiteSpace(item.Chapter))
{
item.Level = ;
item.ParentId = allListingTemplates.Where(c => c.Name == item.Chapter).FirstOrDefault().Id;
}
else if (num == )
{
item.Level = ;
} if (
(num == )
&& hasBracket
&& item.Code.StartsWith(//当前编码 以 上级编码 开始
allListingTemplates
.Where(c => c.Level == )
.OrderByDescending(c => c.Id)
.FirstOrDefault()
.Code
)
)
{
item.Level = ;
}
//else if ()
//{
// //有一个“-”,上面个是章节
//}
else if (num == )
{
item.Level = ;
} if (num == )
{
item.Level = ;
}
if (num == )
{
item.Level = ;
}
if (num == )
{
item.Level = ;
}
//else if ((num == 3) || ((num == (num - 1)) && hasBracket))
//{
// item.Level = 7;
//}
//else if ((num == 4) || ((num == (num - 1)) && hasBracket))
//{
// item.Level = 8;
//}
//else if ((num == 5) || ((num == (num - 1)) && hasBracket))
//{
// item.Level = 9;
//}
if (num > )
{
throw new Exception("暂无该判断!" + item.Code);
} if (item.Level >= )
{
item.ParentId = allListingTemplates
.Where(c => c.Level == (item.Level - ))
.OrderByDescending(c => c.Id)
.FirstOrDefault().Id;
}
allListingTemplates.Add(item); } StringBuilder sb = new StringBuilder();
allListingTemplates.ForEach(c =>
{
var sql = GetInsertSQL<ListingTemplate>(c);
sb.Append(sql);
}); ExecuteNonQuery(sb.ToString()); }

方式二:

        //清单范本
public void test1_1()
{
//生成说明
var ds = ExcelHelper.ExcelToDataSet(true, "清单范本-原版2.xlsx");
var dt = ds.Tables[];
dt.Columns.Remove("序号"); //列名
List<string> columnNames = new List<string>();
PropertyInfo[] pArray = typeof(ListingTemplate).GetProperties();
pArray.ToList().ForEach(c =>
{
columnNames.Add(c.Name);
}); //Excel的列名 修改为 属性名
for (int i = ; i < dt.Columns.Count; i++)
{
dt.Columns[i].ColumnName = columnNames[i];
} List<ListingTemplate> allListingTemplates = new List<ListingTemplate>(); //三级节点
List<ListingTemplate> threeNodes = new List<ListingTemplate>();
threeNodes = DataTableToEntities<ListingTemplate>(dt); //一级节点
ListingTemplate oneNode = new ListingTemplate { Id = , Level = , Name = "重庆奉溪高速公路" };
allListingTemplates.Add(oneNode); //二级节点 章节不为空
int twoNodes_StartId = allListingTemplates.OrderByDescending(c => c.Id).FirstOrDefault().Id;
var twoNodes = threeNodes.Where(c => !string.IsNullOrWhiteSpace(c.Chapter)).Select(c =>
{
twoNodes_StartId++;
return new ListingTemplate
{
Id = twoNodes_StartId,
Chapter = c.Chapter,
Name = c.Chapter,
Level = ,
ParentId = oneNode.Id
};
});
allListingTemplates.AddRange(twoNodes); //汇总为父节点 没有汇总的为子节点 //三级节点 生成树
//根据清单编码生成 判断依据 含有“-”的数量 和 含有“(”的数量 、 名称是否以父节点Code一个开头
int threeNodes_StartId = allListingTemplates.OrderByDescending(c => c.Id).FirstOrDefault().Id;
for (int i = ; i < threeNodes.Count; i++)
{
var item = threeNodes[i];
threeNodes_StartId++; item.Id = threeNodes_StartId; //判断逻辑:
//第一个汇总 怎么关联父节点:第一个汇总前面的汇总 即为父节点
//第二个汇总 怎么关联父节点:往上找同级汇总节点 找到连续的两个汇总节点,且后一个是前一个的汇总子节点 ListingTemplate parent = null;
if ((item.Type == "汇总") && !string.IsNullOrWhiteSpace(item.Chapter))
{
//汇总 含 章节
parent = allListingTemplates.Where(c => c.Name == item.Chapter).First(); }
else if (!string.IsNullOrWhiteSpace(item.Chapter))
{
//不是汇总 但 含 章节
parent = allListingTemplates.Where(c => c.Name == item.Chapter).First(); }
else if (item.Type == "汇总")
{
//汇总 不含 章节
if (allListingTemplates.Last().Type == "汇总")
{
//判断上一个是否也是汇总
parent = allListingTemplates.Last();
}
else
{
if (!item.Code.Contains("-"))
{
//如果没有包含‘-’,父节点 为 含章节的节点
parent = allListingTemplates.Where(c => !string.IsNullOrWhiteSpace(c.Chapter)).Last();
}
else
{
//倒序查找汇总节点
var list = allListingTemplates.Where(c => c.Type == "汇总").ToList();
for (int j = list.Count - ; j >= ; j--)
{
if (j == )
{
break;
}
//相邻判断:id相减等于一
var item1 = list[j];
var item2 = list[j - ];
if ((item1.Id - item2.Id) == )
{
//相邻 且 同级
if (item1.Code.Split('-').Length == item.Code.Split('-').Length)
{
parent = item2;
break;
}
}
} //上面没有找到 那就用编码去找
if (parent == null)
{
parent = allListingTemplates.Where(c => c.Code == item.Code.Substring(, item.Code.LastIndexOf('-'))).First();
}
}
} }
else
{
//子节点
parent = allListingTemplates.Where(c => c.Type == "汇总").Last();
} item.ParentId = parent.Id;
item.Level = parent.Level + ; allListingTemplates.Add(item); } StringBuilder sb = new StringBuilder();
allListingTemplates.ForEach(c =>
{
var sql = GetInsertSQL<ListingTemplate>(c);
sb.Append(sql);
}); ExecuteNonQuery(sb.ToString()); }

小功能 清单模板导入 根据Excel生成树的更多相关文章

  1. [经验共享] MapGIS实用小功能图解——由excel文件导成MapGIS点文件

    项目小组的几个成员都是学地下水和环境的,对于GIS懂得不是很多,于是把一些我们经常用到的mapgis实用小功能做成帮助文档,方便大家使用,发布共享! 1.整理好EXCEL文件(注意X,Y坐标的正确性( ...

  2. asp.net core web的导入导出excel功能

    这里主要记录下asp.net core web页面上进行导入导出excel的操作. 主要是导入,因为现在使用的很多前端框架(例如kendo ui)本身就有导出的功能. 这里使用到EPPlus.Core ...

  3. 任务清单小功能的实现(任务的增、删、改、查、存储)使用Vue实现

    文章目录 1.实现的效果(视频演示) 2.重点讲解(编辑的实现) 2.1 提示(官网介绍nextTick的用法) 3.编辑功能的核心代码 4.完整的代码 5.以往练习 任务清单案例(纯Vue) 实现的 ...

  4. vue Excel导入,下载Excel模板,导出Excel

    vue  Excel导入,下载Excel模板,导出Excel vue  Excel导入,下载Excel模板 <template> <div style="display: ...

  5. 小技巧之“将Text文件中的数据导入到Excel中,这里空格为分割符为例”

    1.使用场景 将数据以文本导出后,想录入到Excel中,的简便方案, 起因:对于Excel的导出,Text导出明显会更方便些 2.将Text文件中的数据导入到Excel中,这里空格为分割符为例的步骤 ...

  6. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  7. Java基于注解和反射导入导出Excel

    代码地址如下:http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包以 ...

  8. EasyOffice-.NetCore一行代码导入导出Excel,生成Word

    简介 Excel和Word操作在开发过程中经常需要使用,这类工作不涉及到核心业务,但又往往不可缺少.以往的开发方式在业务代码中直接引入NPOI.Aspose或者其他第三方库,工作繁琐,耗时多,扩展性差 ...

  9. EasyPOI导入导出Excel

    EasyPOI工具可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 导入maven依赖 <dependency> <group ...

随机推荐

  1. 【题解】Sonya and Matrix Beauty [Codeforces1080E]

    [题解]Sonya and Matrix Beauty [Codeforces1080E] 传送门:\(Sonya\) \(and\) \(Matrix\) \(Beauty\) \([CF1080E ...

  2. spring Boot 学习(八、Spring Boot与与监控管理)

    一.监控管理通过引入spring-boot-starter-actuator,可以使用Spring Boot为我们提供的准 生产环境下的应用监控和管理功能.我们可以通过HTTP,JMX,SSH协议来进 ...

  3. BAPI_TRANSACTION_COMMIT

    通过NCO执行SAP里面的 BAPI_TRANSACTION_COMMIT 并不能直接生效,类似SQL 里面的事物一样,需要有开始与结束,正确的方式如下: RfcSessionManager.Begi ...

  4. (原创)C#操作MYSQL数据库

    应用程序对数据库的操作都是只有4个:增,删,改,查. 只有”查”的操作需要使用适配器来存储查询得到的数据.其它3个操作不需要用到适配器. 不同的数据库有共同操作方法:都要建立连接对象,连接对象要有连接 ...

  5. 【转】socket通信-C#实现udp通讯

    在日常碰到的项目中,有些场景下不适合使用tcp常连接,而需要靠UDP无连接的数据收发.那么如何使用SharpSocket完成UDP收发数据呢?其中要掌握的关键点是什么呢? 点击查看原博文内容

  6. azure跨域问题(访问azure存储账户数据,blob)

    访问azure存储账户数据报错:405错误 解决方案 打开访问的存储账户--->CORS--->Blob服务 全部填写*就可以了,点击“保存”即可. iframe就可以展示blob中的pd ...

  7. SQL Server 2017 下载及安装详细教程

    SQL Servicer 2017 下载及安装 1)下载安装SQLServer 2)安装SQLServer management Studio. 一.     下载及安装SQLServer 下载链接( ...

  8. word,excel,ppt转pdf

    第一步 需要下载jar包和jacob-1.14.3-x64.dll * <dependency> * <groupId>net.sf.jacob-project</gro ...

  9. 06-Vue路由

    什么是路由 对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源: 对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有 ...

  10. Mac pro操作快捷键

    1. 在Finder顶部显示文件/文件夹全路径 终端里输入:defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE;kil ...