kinuyツ
2022-04-25T16:29:55+00:00
Excel, ppt, Word 都属于微软的产品, 大多用在Windows操作系统. 对Excel的高级操作, 特别是连表操作, 大多数人会用VBA. 然而VBA是20年前的产物, VB语言也在十几年前停止了维护, 连他的儿子VB.Net 也在去年停止了维护, VB可以说已经寿终正寝了. 对于VBA, 微软也有以C# 为开发语言的VSTO作为替代.
微软主推的编程语言是C# . C# 是完全的面向对象的语言, 也可以与C++联合编程, 也可以启动Unsafe模式操作指针, 和Java有90%的语法相似度. C# 不仅可以做Web, 硬件, 工控上位机, 桌面, 做很多小工具也效果拔群, 今天我就来教大家如何用Windows窗体 做一个 Excel 一对多, 联表查询的案例.
1, 需求:
现在有2个表
表1:
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-iznuK16T1kSbn-7n.jpg[/img]
表2:
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-6v1fK15T1kSa2-8i.jpg[/img]
现在有6名选手参加了电子竞技比赛, 有人夺冠, 有人落榜. 现在要筛选出表1中的选手资料, 筛选条件是 表2中夺冠次数>1, 且夺冠项目中含有"魔兽" 字样.
如果用VBA, 势必要写Sql语句, 各种内连接, 外连接, 说实话复杂的sql语句我也不会. 但是C# 下有很多非常好用的ORM, 比如sqlsugar, 就是一款轻量级的ORM, 只需要linq, 按几下tab 就出来查询结果了.
在这里我用Windows窗体做了一个小程序, 我会在稍后放在某度网盘分享给大家.
2, 思路:
使用NPOI将 Excel以DataTable的格式读入winform
使用sqlsugar 使用codeFirst生成数据库(sqlite是轻量级数据库,几Kb且无需安装)
使用sqlsugar将Excel的数据存入sqlite.
使用hasmap/dictionary生成外键
使用sqlsugar进行一对多查询
使用NPOI将查询的结果导出到excel
关键Nuget包: System.Sqlite, sqlsugar, NPOI, Newtonsoft.Json
3, 过程:
选择Excel的Sheet数量(我是2个Sheet), 点击生成数据库
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-f0w3KmT1kSfe-8q.jpg[/img]
点击读取Excel(此时需要关闭你需要导入的Excel)
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-jt7fK1bT1kSfe-av.jpg[/img]
选中, 提示导入成功
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-51zqKmT1kSfe-ba.jpg[/img]
点击插入数据库
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-kvhfKtT1kSfe-e7.jpg[/img]
点击生成外键:
可以看到外键生成成功了
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-fb5uK18T1kSfe-8f.jpg[/img]
点击一对多查询, 右边的DateGridView已经显示出筛选结果了, 满足夺冠次数大于1, 且项目中包含"魔兽"字样的选手为
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-8i8iK23T3cSys-m5.jpg[/img]
4, 导出到Excel
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-asjoKvT1kSbp-8b.jpg[/img]
其中, 用的核心 lambda表达式为
Db.Queryable<选手表>()
.Includes(p => p.项目表)
.Where(p=>p.项目表.Count()>1)
.Where(p => p.项目表.Any(z => z.夺冠项目.Contains("魔兽")))
.ToDataTable();
完全不用写SQL, 只用对应逻辑, 按Tab即可
微软主推的编程语言是C# . C# 是完全的面向对象的语言, 也可以与C++联合编程, 也可以启动Unsafe模式操作指针, 和Java有90%的语法相似度. C# 不仅可以做Web, 硬件, 工控上位机, 桌面, 做很多小工具也效果拔群, 今天我就来教大家如何用Windows窗体 做一个 Excel 一对多, 联表查询的案例.
1, 需求:
现在有2个表
表1:
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-iznuK16T1kSbn-7n.jpg[/img]
表2:
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-6v1fK15T1kSa2-8i.jpg[/img]
现在有6名选手参加了电子竞技比赛, 有人夺冠, 有人落榜. 现在要筛选出表1中的选手资料, 筛选条件是 表2中夺冠次数>1, 且夺冠项目中含有"魔兽" 字样.
如果用VBA, 势必要写Sql语句, 各种内连接, 外连接, 说实话复杂的sql语句我也不会. 但是C# 下有很多非常好用的ORM, 比如sqlsugar, 就是一款轻量级的ORM, 只需要linq, 按几下tab 就出来查询结果了.
在这里我用Windows窗体做了一个小程序, 我会在稍后放在某度网盘分享给大家.
2, 思路:
使用NPOI将 Excel以DataTable的格式读入winform
使用sqlsugar 使用codeFirst生成数据库(sqlite是轻量级数据库,几Kb且无需安装)
使用sqlsugar将Excel的数据存入sqlite.
使用hasmap/dictionary生成外键
使用sqlsugar进行一对多查询
使用NPOI将查询的结果导出到excel
关键Nuget包: System.Sqlite, sqlsugar, NPOI, Newtonsoft.Json
3, 过程:
选择Excel的Sheet数量(我是2个Sheet), 点击生成数据库
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-f0w3KmT1kSfe-8q.jpg[/img]
点击读取Excel(此时需要关闭你需要导入的Excel)
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-jt7fK1bT1kSfe-av.jpg[/img]
选中, 提示导入成功
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-51zqKmT1kSfe-ba.jpg[/img]
点击插入数据库
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-kvhfKtT1kSfe-e7.jpg[/img]
点击生成外键:
可以看到外键生成成功了
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-fb5uK18T1kSfe-8f.jpg[/img]
点击一对多查询, 右边的DateGridView已经显示出筛选结果了, 满足夺冠次数大于1, 且项目中包含"魔兽"字样的选手为
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-8i8iK23T3cSys-m5.jpg[/img]
4, 导出到Excel
[img]https://img.nga.178.com/attachments/mon_202205/02/-vabhQ17q-asjoKvT1kSbp-8b.jpg[/img]
其中, 用的核心 lambda表达式为
Db.Queryable<选手表>()
.Includes(p => p.项目表)
.Where(p=>p.项目表.Count()>1)
.Where(p => p.项目表.Any(z => z.夺冠项目.Contains("魔兽")))
.ToDataTable();
完全不用写SQL, 只用对应逻辑, 按Tab即可