小功能 清单模板导入 根据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 ...
随机推荐
- 《即时消息技术剖析与实战》学习笔记3——IM系统如何保证消息的实时性
IM 技术经历过几次迭代升级,如图所示: 从简单.低效的短轮询逐步升级到相对效率可控的长轮询: 全双工的 Websocket 彻底解决了服务端的推送问题: 基于 TCP 长连接衍生的 IM 协议,能够 ...
- java中什么是抽象类(abstract)
一.什么是抽象类 由abstract修饰的方法叫抽象方法:由abstract修饰的类叫抽象类.抽象的类无法进行实例化,因为他不是具体存在的类,或者说这样的类还不够完善,不能直接使用new关键字调用其构 ...
- 关于使用mySqlSugar插入数据异常解决方案
项目的解决方案中引用的有mysqlsugar的数据库操作库,在使用插入数据过程中一些特殊的生僻字或表情符号总会提示: Incorrect string value: '\xF0\x9F...' for ...
- mysql存储过程的函数
存储过程和函数:类似java中的方法 好处:提高代码的重用性 .简化操作.减少了和数据库连接的次数,提高了效率 含义:一组预先编译好的sql语句集合,成批处理语句 语法: 一:创建语法 create ...
- NetCore 统一处理 webapi 返回null 转为“”
数据库中部分表字段允许空值,则代码中实体类对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前端对应字段赋值需要做nu ...
- 分布式图片服务器FastDFS
1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统.FastDFS 为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使 ...
- jsp,servlet文件上传问题完善
1. 上传文件时文件名中文乱码 upload.setHeaderEncoding("utf-8"); 有个疑惑: 不管设置不设置都不乱码,但是刘帅龙老师讲的时候出现了乱码 . 2. ...
- python json库
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. 1.json库的使用 使用 JSON 函数需要导入 json 库:import jso ...
- JavaWeb第三天--JavaScript
JavaScript 1. JavaScript概述 1.1 JavaScript是什么?有什么作用? HTML:就是用来写网页的.(人的身体) CSS:就是用来美化页面的.(人的衣服) JavaSc ...
- js new Date()不带时分秒时,时间变了 问题解决
//先把电脑系统时间的 时区 调到别的时间一下如 夏威夷 UTC-10:00//在浏览器的Console里运行如下代码,getMonth是从0开始的,所以要+1 var d=new Date(&quo ...