小功能 清单模板导入 根据Excel生成树
把代码备份一下,免得硬盘又坏了,看来已经造成心理阴影了啊。
方式一:
//清单范本
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生成树的更多相关文章
- [经验共享] MapGIS实用小功能图解——由excel文件导成MapGIS点文件
项目小组的几个成员都是学地下水和环境的,对于GIS懂得不是很多,于是把一些我们经常用到的mapgis实用小功能做成帮助文档,方便大家使用,发布共享! 1.整理好EXCEL文件(注意X,Y坐标的正确性( ...
- asp.net core web的导入导出excel功能
这里主要记录下asp.net core web页面上进行导入导出excel的操作. 主要是导入,因为现在使用的很多前端框架(例如kendo ui)本身就有导出的功能. 这里使用到EPPlus.Core ...
- 任务清单小功能的实现(任务的增、删、改、查、存储)使用Vue实现
文章目录 1.实现的效果(视频演示) 2.重点讲解(编辑的实现) 2.1 提示(官网介绍nextTick的用法) 3.编辑功能的核心代码 4.完整的代码 5.以往练习 任务清单案例(纯Vue) 实现的 ...
- vue Excel导入,下载Excel模板,导出Excel
vue Excel导入,下载Excel模板,导出Excel vue Excel导入,下载Excel模板 <template> <div style="display: ...
- 小技巧之“将Text文件中的数据导入到Excel中,这里空格为分割符为例”
1.使用场景 将数据以文本导出后,想录入到Excel中,的简便方案, 起因:对于Excel的导出,Text导出明显会更方便些 2.将Text文件中的数据导入到Excel中,这里空格为分割符为例的步骤 ...
- 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 ...
- Java基于注解和反射导入导出Excel
代码地址如下:http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包以 ...
- EasyOffice-.NetCore一行代码导入导出Excel,生成Word
简介 Excel和Word操作在开发过程中经常需要使用,这类工作不涉及到核心业务,但又往往不可缺少.以往的开发方式在业务代码中直接引入NPOI.Aspose或者其他第三方库,工作繁琐,耗时多,扩展性差 ...
- EasyPOI导入导出Excel
EasyPOI工具可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 导入maven依赖 <dependency> <group ...
随机推荐
- docker镜像上传阿里云仓库
推送至阿里云镜像:1.首先在阿里云上选择容器镜像服务,创建命名空间以及镜像仓库2. docker login --username=zhangshitongsky@163.com registry.c ...
- C#事件和委托(C#学习笔记03)
委托 1. C# 中的委托类似于 C 或 C++ 中指向函数的指针.委托表示引用某个方法的引用类型变量,运行时可以更改引用对象. 2. 特别地,委托可以用于处理事件或回调函数.并且,所有的委托类都是从 ...
- WinForm的TextBox限制只能输入数字并且屏蔽默认右键菜单
基于Window消息实现 class TextBoxExt:TextBox { private const int WM_RBUTTONDOWN = 0x0204; private const int ...
- Apache Tomcat 9.0 Tomcat9 服务无法启动。发生服务特定错误: 4.
在Tomcat的安装目录下,bin文件夹里面 找到tomcat9w.exe 双击进去,将第四页java里面第一个复选框Use default 选中 保存即可启动tomcat9服务
- npm err! Unexpected end of JSON input while parsing near解决办法
npm install时出现npm err! Unexpected end of JSON input while parsing near错误 输入 npm cache clean --fore ...
- easyui datagrid Column Group 列组、 复杂表头 嵌套表头 组合表头 (转载)
核心: rowspan:2 //占两行 colspan:3 //占三列 所有的colspan下的二级列表头,统一放在一个数组里. 文章一: 转载来源:https://blog.csdn.ne ...
- Jmeter场景设置与监听
目录 Jmeter场景设置 场景运行 Jmeter测试监控 Samples:取样器运行次数(提交了多少笔业务). Jmeter场景设置 场景的概念: 场景是用来尽量真实模拟用户操作的工作单元,场景设计 ...
- idea导入mybatis源码
1.最近在学mybatis,想下载源码导入idea结果网上一查没有一篇完整的,结果让我进了个大坑,算了,废话少说 2.两种办法,一个是git客户端克隆,另外一个是下载code压缩包.先说通过git客户 ...
- 【Spring Cloud】Spring Cloud之Spring Cloud Sleuth,分布式服务跟踪(1)
一.Spring Cloud Sleuth组件的作用 为微服务架构增加分布式服务跟踪的能力,对于每个请求,进行全链路调用的跟踪,可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈等. 二 ...
- Letsencrypt.org CA免费证书生成
Letsencrypt.org CA免费证书使用 Let's 支持多中客户端,这里使用acme.sh客户端配置免费证书. acme.sh优点: github官方地址 纯用Shell(Unix外壳)语言 ...