小功能 清单模板导入 根据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 ...
随机推荐
- 『金字塔 区间dp』
金字塔 Description 虽然探索金字塔是极其老套的剧情,但是这一队 探险家还是到了某金字塔脚下.经过多年的研究,科 学家对这座金字塔的内部结构已经有所了解.首先, 金字塔由若干房间组成,房间之 ...
- PTA 甲级 1139
https://pintia.cn/problem-sets/994805342720868352/problems/994805344776077312 其实这道题目不难,但是有很多坑点! 首先数据 ...
- (10)ASP.NET Core 中的环境(Environments:dev, stage, prod)
1.环境变量配置 ASP.NET Core在应用程序启动时读取环境变量(Properties\launchSettings.json)ASPNETCORE_ENVIRONMENT,并将该值存储在IHo ...
- mysql 事务的实现原理
开篇 相信大家都用过事务以及了解他的特点,如原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)等.今天想跟大家一起研究下事务 ...
- linux启动tomcat很久或者很慢Tomcat启动时卡在“INFO: Deploying web application directory ......”的解决方法
解决方案: 找到jdk1.x.x_xx/jre/lib/security/java.security文件,在文件中找到securerandom.source这个设置项,将其改为: securerand ...
- java加密解密工具类
package com.founder.mrp.util; import java.nio.charset.StandardCharsets; import java.security.Key; im ...
- 解决老大难疑惑:指针 vs 引用
▶疑问描述 1. 引用reference的本质: 常指针 ——> 什么时候用指针?= 就按Java中的引用变量那样用? ——> 什么时候用引用? ①函数的入参/返回值时 ②T&am ...
- 调用日志输出错误:TypeError: 'int' object is not callable等
*)TypeError: 'int' object is not callable 错误信息: Traceback (most recent call last): File "Visual ...
- PAT 1008数组元素右移问题
PAT 1008数组元素右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变 ...
- Vue学习之监听methods、watch及computed比较小结(十一)
一.三者之间的对比: 1.methods方法表示一个具体的操作,主要书写业务逻辑: 2.watch:一个对象,键是需要观察的表达式,值是对应回调函数.主要用来监听某些特定数据的变化,从而进行某些具体业 ...