OfficeOpenXml.Entends 是一个OfficeOpenXml拓展,用于根据模板输出excel,依赖于EPPlus(码农一致好评,其API操作及友好程度要高于 NPOI),可以直接在NuGet中获取
OfficeOpenXml.Entends 1.0.1.0 用法介绍,直接上代码吧
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using OfficeOpenXml; 5 using System.IO; 6 using OfficeOpenXml.Extends; 7 8 namespace Test 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 FileInfo info = new FileInfo("tpl.xlsx"); 15 ExcelPackage packet = new ExcelPackage(info); 16 var book = packet.Workbook; 17 18 Random random = new Random(); 19 20 Dictionary<string, IEnumerable<string>> dic = new Dictionary<string, IEnumerable<string>>(); 21 dic.Add("水果", new string[] { "桃子", "李子", "香蕉", "梨" }); 22 dic.Add("蔬菜", new string[] { "青菜", "土豆", "黄瓜", "啤酒" }); 23 24 //构造model 25 var model = new 26 { 27 ProjectName = "灰太狼", 28 Name = "Jeff", 29 CreatedAt = DateTime.Now, 30 BuyerName = "Bill", 31 Cates = dic.Select(m => new 32 { 33 Name = m.Key, 34 Items = m.Value.Select(n => new 35 { 36 Name = n, 37 Price = (decimal)random.Next(1, 100), 38 Amount = random.Next(1, 100) 39 }) 40 }) 41 }; 42 43 //下面的FillModel就是OfficeOpenXml.Extends提供的拓展方法, 1.0.1.0也就只有这个拓展方法 44 book.Worksheets.First().FillModel(model); 45 46 packet.SaveAs(new FileInfo(DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx")); 47 } 48 } 49 }
下面是xls模板
excel模板中,将第一列空余出来作为代码控制列(可以将正常的模板做完之后插入第一列),单元格中使用 { ... } 来输出内容,注意:输出内容中目前不支持运算、方法,仅支持 变量、成员。
控制代码目前支持 for 循环,支持嵌套,要用索引时参考单元格A6的写法(注意:索引计数从1开始,因为excel中通常序号从1开始)。
下面是输出的excel
输出excel是不是省事了很多,不用在代码里面再写合并单元格。。样式。。边框等等了
2018-1-17 已经发布1.0.4版本,请大家更新到最新版
修复了一些bug,增加了一个输出公式的功能
Install-Package OfficeOpenXml.Extends -Version 1.0.4
如:模板如下
输出结果:
这样实现了同一列统计数量的功能。
下面让我们来解析一下工作原理。
用 @= 开头便于程序识别,解析时会将 @ 去掉,就变成了公式。后面的内容对 {...} 进行解释并替换,程序会将这写文字输出为 =SUM(R[-4]C:R[-1]C),是不是看起来和excel中的公式差不多了。
R[-4]表示相对值-4行,R[-1]表示相对值-1行,C后面没有 [] 表示当前列。
最终输出的内容变成 =SUM(D6:D9)