整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

.NET导出Excel的四种方法及评测

.NET导出Excel的四种方法及评测

导出Excel是.NET的常见需求,开源社区、市场上,都提供了不少各式各样的Excel操作相关包。本文,我将使用NPOI、EPPlus、OpenXML、Aspose.Cells四个市面上常见的库,各完成一个导出Excel示例。然后对其代码风格和性能做一个横向比较。最后我将说出我自己的感想。

文中所有的示例代码可以在这里下载:

https://github.com/sdcb/blog-data/tree/master/2019/20190824-dotnet-excel-compare

NPOI

NPOI源自于Java的Apache POI(https://poi.apache.org/),目前最新版本是2.4.1。NPOI是开源项目,作者是华人(https://github.com/tonyqus/),项目地址是:https://github.com/tonyqus/npoi。

几年前大家导出Excel都使用COM,但COM不方便,这个组件的推出无疑弥补了.NET在Excel方面组件的空白,大家都说比COM好用。

NPOI还加入了.NET Core Community组织,项目地址是:https://github.com/dotnetcore/NPOI。

EPPlus

EPPlus是另一个开源的Excel操作库,目前最新版本是4.5.3.2。Github地址是:https://github.com/JanKallman/EPPlus。

EPPlus仅依赖基础类库BCL,完全没有第三方包依赖,也是.NET原生库。

EPPlus只支持导出Office 2007之后的格式,也就是xlsx。这已经是存在12年的格式了,但如果有客户想要导出xls,EPPlus将不支持。

OpenXML

OpenXML的NuGet包全称是DocumentFormat.OpenXml:是微软推出的较为低层的Excel操作库,最新稳定版本是2.9.1。OpenXML也是开源项目,地址是:https://github.com/OfficeDev/Open-XML-SDK。

从该项目的名字可以看出,OpenXML比较涉及底层,因此很容易令人浮想联翩,感觉它的性能、速度很可能是最快的,但真的如此吗?

Aspose.Cells

这是Aspose Pty Ltd公司推出的Excel操作库。它是众多Aspose File Format API产品其中之一。目前最新版本是19.8.0(基于年/月)。Aspose提供了应有尽有的文件格式支持,除了.NET外,Aspose还提供了C++和Java的包。

据我所知Aspose的客户支持服务也不错,客户提出的问题经常可以在下一次发布时解决。

Aspose.Cells是不开源,付费的库,但提供无限期的试用,据[官方网站](https://docs.aspose.com/display/cellsnet/Licensing#Licensing-EvaluationVersionLimitations)显示,试用版将

限制打开文件数量100个

限制使用Aspose.Cells.GridWeb功能

生成的Excel将添加如下水印:

但经过我的试用,无论是并行还是串行,都没找到限制打开文件数量100个的限制。因此,“试用版”对我们的物理限制,就只有这个水印了(当然加了这个水印,客户肯定也不会有好表情)。

Excel-COM

COM是随着Excel安装而自带的库,Excel的包名叫Microsoft.Office.Interop.Excel。本文不会深入解析,具体可以看[这篇文档](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/how-to-access-office-onterop-objects)。

我想要多说两句的是,COM的old-fashion(过时)不是没有原因的,据我所知COM有以下缺点:

  • 调用时会启动一个进程外的excel.exe,可能因为它为是专门为Office设计的(不是为.NET集成设计的)

  • 要求目标环境安装相关软件,没安装将无法运行

  • 显然也没办法跨平台

  • 使用了大量动态/多参数接口,对开发不是很友好

  • 不像托管内存,COM对资源释放也有要求,具体参见[这篇文章](https://www.breezetree.com/blog/common-mistakes-programming-excel-with-c-sharp)

横向比较


NPOI
EPPlus
OpenXML
Aspose
包依赖
有1个

封装程度正常
正常
低层
正常
支持格式
完善
仅xlsx
仅xlsx
完善
开源协议
Apache-2.0
LGPLMIT
不开源
收费类型
免费
免费
免费
收费

评测说明

版本与数据

所有代码的版本号基于上文中提到的最新稳定版本:


最新稳定版本号
NPOI
2.4.1
EPPlus
4.5.3.2
OpenXML2.9.1
Aspose.Cells
19.8.0

数据全部基于我上篇文章使用的6万条/10列的数据,总共数据量19,166 KB。所有数据可以从这里下载:https://github.com/sdcb/blog-data/tree/master/2019/20190821-generate-lorem-data

环境

项目
CPUE3-1230 v3 @ 3.30GHz
内存
24GB DDR3-1600 MHz (8GBx3)
操作系统Windows 10 1903 64
电源选项已设置为“高性能”
软件
LINQPad 6.0.18
运行时环境
.NET Core 3.0-preview8-28405-07

注意,LINQPad设置了optimize+,代码都是优化后执行的;代码都指定了Util.NewProcess=true;,确保每次运行都会在新进程中运行,不会互相影响。

我的性能测试函数介绍

IEnumerable<object> Measure(Action action, int times=5){ return Enumerable.Range(1, times).Select(i=> { var sw=Stopwatch.StartNew;
long memory1=GC.GetTotalMemory(true); long allocate1=GC.GetTotalAllocatedBytes(true); { action; } long allocate2=GC.GetTotalAllocatedBytes(true); long memory2=GC.GetTotalMemory(true);
sw.Stop; return new { 次数=i, 分配内存=(allocate2 - allocate1).ToString("N0"), 内存提高=(memory2 - memory1).ToString("N0"), 耗时=sw.ElapsedMilliseconds, }; });}

除了时间,内存占用实际也是非常非常重要、但容易被人忽略的性能指标。大家都以为“内存不值钱”,但——

  • 一旦访问量大,内存就会瞬间上涨,导致频繁GC,导致性能下降;

  • 内存高也会导致服务器分页,这时性能就会急剧下降;

  • 吞吐量下降会导致队列排满,此时服务器就会报503等错误,客户就发现服务器“宕机了”。

(提示:除非你的客户真的愿意多花钱再升级一下服务器,否则不要提“内存不值钱”。)

在我的性能测试函数中,使用了如下两个函数来测试内存占用:

  • GC.GetTotalAllocatedBytes(true) 获取分配内存大小

  • GC.GetTotalMemory(true) 获取占用内存大小

占用内存可能会比分配内存小,因为存在垃圾回收(GC),但GC会影响性能。

通过调用Measure函数,可以测得传入的action的耗时和内存占用。默认会调用5次,可以从5次测试结果中取出能反映性能的值。

测试基准

string Export<T>(List<T> data, string path){ PropertyInfo props=typeof(User).GetProperties; string noCache=; for (var i=0; i < props.Length; ++i) { noCache=props[i].Name; } for (var i=0; i < data.Count; ++i) { for (var j=0; j < props.Length; ++j) { noCache=props[j].GetValue(data[i]).ToString; } } return noCache;}

注意:

  • 我有意使用了反射,这符合我们导出Excel代码简单、易学、好用、好扩展的愿意;

  • 我有意使用了泛型T,而不是实际类型,这也让这些代码容易扩展;

  • 里面的noCache用来规避编译器优化删除代码的行为

测试结果:

次数
分配内存
内存提高
耗时
1
9,863,5208,712
156
29,852,5920
138
39,852,5920147
4
9,873,0969,240
136
59,853,936776
133

可见,基于反射操作6万/10列数据,每次需要分配约9MB内存,但这些内存都会被快速GC,最终内存提高较少。这些使用反射的代码运行耗时在130ms-150ms左右。

各个库的使用和性能表现

NPOI

void Export<T>(List<T> data, string path){ IWorkbook workbook=new XSSFWorkbook; ISheet sheet=workbook.CreateSheet("Sheet1");
var headRow=sheet.CreateRow(0); PropertyInfo props=typeof(User).GetProperties; for (var i=0; i < props.Length; ++i) { headRow.CreateCell(i).SetCellValue(props[i].Name); } for (var i=0; i < data.Count; ++i) { var row=sheet.CreateRow(i + 1); for (var j=0; j < props.Length; ++j) { row.CreateCell(j).SetCellValue(props[j].GetValue(data[i]).ToString); } }
using var file=File.Create(path); workbook.Write(file);}

注意:

里面用到了XSSFWorkBook,其中XSSF这个前缀是从Java的POI库传过来的,全称是XML SpreadSheet Format。

这种前缀在NPOI包中很常见。

XSSFWorkbook提供了bool Dispose方法,但它未实现(因此千万别调用它):

性能测试结果:

次数
分配内存
内存提高
耗时
1
1,598,586,416537,0486590
21,589,239,7287,712
10155
31,589,232,056-5,36810309
4
1,589,237,0647,144
10355
51,589,245,0009,56010594

分配内存稳定在1.48GB的样子,首次内存会提高524KB左右,后面趋于稳定。首次耗时6秒多,后面稳定在10秒多。

EPPlus

void Export<T>(List<T> data, string path){ using var stream=File.Create(path); using var excel=new ExcelPackage(stream); ExcelWorksheet sheet=excel.Workbook.Worksheets.Add("Sheet1"); PropertyInfo props=typeof(User).GetProperties; for (var i=0; i < props.Length; ++i) { sheet.Cells[1, i + 1].Value=props[i].Name; } for (var i=0; i < data.Count; ++i) { for (var j=0; j < props.Length; ++j) { sheet.Cells[i + 2, j + 1].Value=props[j].GetValue(data[i]); } } excel.Save;}

注意,不同于NPOI/Aspose.Cells,EPPlus的下标是基于1的(而不是0)。

次数
分配内存
内存提高
耗时
1
534,970,328156,0483248
2533,610,23214,8962807
3533,595,9367,6482853
4
533,590,7764,408
2742
5533,598,44011,2802759

分配内存约508MB,耗时首次稍长,约3.2秒,后面稳定在2.7-2.8秒。

OpenXML

void Export<T>(List<T> data, string path){ using SpreadsheetDocument excel=SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook);
WorkbookPart workbookPart=excel.AddWorkbookPart; workbookPart.Workbook=new Workbook;
WorksheetPart worksheetPart=workbookPart.AddNewPart<WorksheetPart>; worksheetPart.Worksheet=new Worksheet(new SheetData);
Sheets sheets=excel.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets); Sheet sheet=new Sheet { Id=excel.WorkbookPart.GetIdOfPart(worksheetPart), SheetId=1, Name="Sheet1" }; sheets.Append(sheet); SheetData sheetData=worksheetPart.Worksheet.GetFirstChild<SheetData>;
PropertyInfo props=typeof(User).GetProperties; { // header var row=new Row { RowIndex=1 }; sheetData.Append(row); row.Append(props.Select((prop, i)=> new Cell { CellReference=('A' + i - 1) + row.RowIndex.Value.ToString, CellValue=new CellValue(props[i].Name), DataType=new EnumValue<CellValues>(CellValues.String), })); } sheetData.Append(data.Select((item, i)=> { var row=new Row { RowIndex=(uint)(i + 2) }; row.Append(props.Select((prop, j)=> new Cell { CellReference=('A' + j - 1) + row.RowIndex.Value.ToString, CellValue=new CellValue(props[j].GetValue(data[i]).ToString), DataType=new EnumValue<CellValues>(CellValues.String), })); return row; })); excel.Save;}

注意,因为`OpenXML`比较偏低层,东西比较复杂,所以我们慢慢说:

  • 对于一些对象,它需要创建相应的Part,如WorksheetPart;

  • Excel可以使用SharedStringTable来共享变量值,适合相同字符串非常多的场景。

    但此示例共享变量值收益很低,但会极大地增加代码复杂性(普通用户可能很难写出),因此本示例未使用SharedStringTable;

  • 它基于单元格位置标识,如B3(第三行第二列),因此索引方式比EPPlus/NPOI都要复杂;

  • 代码示例中使用'A' + i - 1来计算位置标识,因此这个示例不能用于超过26列(字母数)的数据;

  • 代码使用LINQ(而不是循环)来枚举所有行/列,可以让代码在已经非常复杂的情况下,更简洁一点;

    经测试,将LINQ改成for循环对性能结果变化影响极其微小。

测试结果如下:

次数
分配内存
内存提高
耗时
1
556,937,896145,8324009
2555,981,2163123783
3555,985,9362,7603884
4
555,984,3841,8723869
5555,989,1203,8803704

内存占用约530MB左右,第一次比后面多1MB的样子,耗时3.7-4.0秒之间。

Aspose.Cells

void Export<T>(List<T> data, string path){ using var excel=new Workbook; Worksheet sheet=excel.Worksheets["Sheet1"]; PropertyInfo props=typeof(User).GetProperties; for (var i=0; i < props.Length; ++i) { sheet.Cells[0, i].Value=props[i].Name; } for (var i=0; i < data.Count; ++i) { for (var j=0; j < props.Length; ++j) { sheet.Cells[i + 1, j].Value=props[j].GetValue(data[i]); } } excel.Save(path);}

注意,Aspose.Cells像Excel软件一样,提供了Sheet1/Sheet2/Sheet3三个默认的工作表,因此取这三个工作表时,不要创建,而是取出来。

性能测试结果如下:

次数
分配内存
内存提高
耗时
1
404,004,9443,619,5203316
2357,931,6486,0482078
3357,934,7447,2162007
4
357,933,3766,2802017
5357,933,3606,4242007

Aspose.Cells首次占用内存385MB,用于3.3秒,后面每次降低为内存341MB,用时2.0秒。

总结

四种导出Excel库的横向评测数据如下,数据取5次数值的内存消耗中位数

,百分比以EPPlus的测试数据为100%基准:

次数
分配内存
内存占比
耗时
耗时占比
基准(仅反射)
9,853,9361.85%1334.82%
NPOI1,589,237,064297.83%10355375.32%
EPPlus533,598,440100%2759100%
OpenXML
555,985,936104.19%3884140.78%
Aspose357,933,36067%200772.74%

可以得出以下结论:

  1. Demo基于反射,但反射总损耗的性能不高,内存、耗时均不超过5%;

  2. NPOI的性能表现是所有项目中最差的,每次需要分配1.5GB的内存和超过10秒的耗时;

  3. EPPlus表现不错,内存和耗时在开源组中表现最佳;

  4. 收费的Aspose.Cells表现最佳,内存占用最低,用时也最短;

  5. 较为底层的OpenXML表现非常一般,比EPPlus要差,更不能与收费的Aspose相提并论;

我的感想

在真的愿意尝试一下之前,人们很容易相信自己的直觉。底层库,通常能带来更大的可扩展性,能做出上层库很难做的事来。底层库有时性能会更快,就像更底层的C/C++比上层的JavaScript更快一样。但事情也不都如此,如

  • 更高层的React.js能在性能上将较底层的DOM操作比下去

  • 数据库基于集合的操作也比基于游标的操作要快得多

在导出Excel这个例子中,我了解到Excel的xlsx格式是非常复杂的、多个xml的集合。如果基于xml做抽象——也是很正常的做法,拼出6万/10列的数据,需要至少60万个xml标签做拼接,很显然这需要分配/浪费大量内存,因此性能上不来。

我基于以下几点无责任猜测:Aspose内部可能没xml做抽象,而是纯数据做抽象(就像React.js那样),然后再统一写入到Excel文件。因此性能可以达到其它库达不到的目标:

  1. Aspose.Cells对xml等实现相关技术只字未提(可能因为要支持多种文件格式);

  2. Aspose.Cells是先在内存中创建,再写入文件/流(NPOI也是);

  3. Aspose.Cells创建Excel时要求客户直接使用Workbook类(NPOI也是);

  4. Aspose.Cells完全隐藏了Excel的位置(如B3)信息,下标从0开始(NPOI也是)

比较这几点,NPOI也与Aspose.Cells有几分相似,但导出不到6MB的`Excel`它内存分配居然高达1.5GB,是后者的444%!毕竟迭代更新了这么多年了,代码质量我相信应该没问题。因此我再次无责任推测:这可能因为它是从Java那边移植过来的。

我的选择/推荐

在我做这个性能评测前,我一直使用的是EPPlus,因为我不喜欢NPOI有第三方依赖,也不喜欢NPOI那些“XSSF”之类的前缀命名,也显然不会去费心思写那么多费力不讨好的OpenXML代码。

更别提这次评测发现EPPlus的性能确实不错,唯一的缺点就是它单元格下标从1开始的设计。即便如此,我还是首选推荐EPPlus。

近期也经常使用Aspose.Cells这种商业库,它的功能强大,API清晰好用,这个评测也证明它的性能卓越。除了高昂(https://purchase.aspose.com/pricing/cells/net)的价格,没别的缺点了。乃有钱客户/老板的不二之选!

出处:本文转载于微信公众号【DotNet骚操作】,作者【周杰DotNet 】

出处:微信公众号【DotNet骚操作】

微信不能留言,请点击原文链接去博客园留言。

原文链接:https://www.cnblogs.com/sdflysha/p/20190824-dotnet-excel-compare.html

. 前言

本章是完善用户管理的一个小功能---导入数据,本章将使用第三方库Magicodes.IE.Excel.AspNetCore

2. 类库简介

Magicodes.IE.Excel.AspNetCore库是心莱科技麦扣出品的一个支持Excel导入导出的功能。有兴趣的同学可以去搜索一下。类库是支持Dto导入导出以及动态导出,支持Excel、Word、Pdf和Html功能较多。不过作者维护的Github上的仓库。但是该库有个缺点是Excel导入不支持“.xls”文件,即不支持Excel97-2003。也许未来可以支持。

3. 代码示例

3.1 安装库Magicodes.IE.Excel.AspNetCore

我们仅演示使用Excel来完成学生数据的导入。我们需要在已准备好的工程中安装以下包,参考如下所示:

3.2 创建导入Student

创建导入类Student.ts并设置必要的属性

如上述代码所示,我们定义了以上学生数据类,主要注意事项如下

  • ExcelImporter特性可以设置一些导入的全局设置,比如是否标注错误、导入Sheet名称(如不设置则自动获取第一个)、截止读取的列数、表头位置。
  • 支持常用的数据验证设置,比如必填、最大长度。
  • 支持数据重复校验,比如身份证号码。见ImporterHeader特性的IsAllowRepeat设置。
  • 支持列头设置,将ImporterHeader的Name属性。除此之外,ImporterHeader还支持自动过滤空格(默认启用)、处理掉所有的空格、列索引等。
  • 对数据列启用了忽略设置,见SchoolId的”[ImporterHeader(IsIgnore=true)]”。
  • 使用了值映射,见“Gender”属性。启用值映射之后,将不会从枚举定义中获取值映射。
  • 支持枚举,支持从枚举的Display、Description特性中获取值映射。

3.3 注册导入接口

创建在项目FlyingHat.Extensions中创建OfficeService.cs类并单例注册IExcelImporter

打开Program.cs中写入builder.Services.AddOfficeService();

builder.Services.AddOfficeService();

3.4 生成导入模板并填充数据

通过构造函数注入 IExcelImporter ,然后开始编写导入功能,在导入之前是不是得准备一份模板?对于我们,手写模板?这是不存在的。Magicodes.IE.Excel.AspNetCore封装了根据DTO自动生成Excel导入模板的方法,我们可以直接调用。这里我们来看下导入的相关方法。

通过导出的文件完成数据填充后导入到数据库

3.5 前端代码

界面展示:

JS代码展示:

注意:

popup.panelWebBtn是我封装的一个方法,您可以下载源码并查看。关于数据错误提示,我是返回前5项,这样前端页面也容易展示,这个上传后的逻辑可以根据实际情况而修改。

结语

本章实现了Excel文件的导入导出,仅仅是类库的简单使用介绍,当然导入的方式也有其他类库例如NPOI等。详细功能请获取源码查看。各位同学在阅读实践过程中有看不懂或有其他想法的可以在评论区留言或者私信。教程有帮助的话请各位同学帮忙评论点赞关注三连,感谢大家!

----------------------------------------------------

私信: 校园图书管理系统 可以获取Gitee的链接

son.NET

http://json.codeplex.com/

Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换。

Math.NET

http://www.mathdotnet.com/

Math.NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算/科学运算,它是C#开发的开源类库。Math.NET含了一个支持线性代数的解析器,分析复杂微分,解方程等等功能。

Faker.Net

https://github.com/jonwingfield/Faker.Net

开发的时候是不是为测试数据烦恼?Faker.Net可以非常方便帮你生成大批量测试数据。例如人员表里面的姓名、性别什么的。

Html Agility Pack

http://htmlagilitypack.codeplex.com/

Html Agility Pack 是CodePlex 上的一个开源项目。它提供了标准的DOM API 和XPath 导航--即使 HTML 不是适当的格式!HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦。

NCrawler

http://ncrawler.codeplex.com/

NCrawler是一款国外的开源网络爬虫软件,遵循LGPL许可协议。其HTML处理使用的是htmlagilitypack开源库,采用xpath的方式处理定位网页元素,十分方便。

SuperWebSocket

http://superwebsocket.codeplex.com/

SuperWebSocket是基于.NET开源Socket框架SuperSocket开发的, SuperSocket所支持的大部分功能在SuperWebSocket中得到了继承。用户可通过SuperWebSocket来快速的构建可靠的,高性能的websocket服务器端应用程序。

SuperSocket

http://supersocket.codeplex.com/

SuperSocket 是 一个轻量级的可扩展的 Socket 开发框架,可用来构建一个服务器端 Socket 程序,而无需了解如何使用 Socket,如何维护Socket连接,Socket是如何工作的。该项目使用纯 C# 开发,易于扩展和集成到已有的项目。只要你的已有系统是使用.NET开发的,你都能够使用 SuperSocket来轻易的开发出你需要的Socket应用程序来集成到你的现有系统之中。

Quartz.NET

http://www.quartz-scheduler.net/

Quartz.NET 是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而 创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

Lucene.Net

http://lucenenet.apache.org/

Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。

HttpLib

http://httplib.codeplex.com/

一个基于C#语言的http协议的类库,Httplib让异步交互处理数据更容易了。类库的方法包括:上传文件到服务器,获取页面数据等等。

Smart Thread Pool

http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

智能线程池,用SmartThreadPool可以简单就实现支持多线程的程序,由线程池来管理线程,可以减少死锁的出现。SmartThreadPool还支持简单的生产者-消费者模式,当不需要对任务进行持久化时,还是很好用的。

DocX

https://docx.codeplex.com/

DocX是一个用来操作word的轻量级的类库。借助DocX,开发人员可以在不需要安装Microsoft Word的情况下操纵word2007/2010文件。

NPOI

http://npoi.codeplex.com/

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。

PDFsharp

https://pdfsharp.codeplex.com/

PDFsharp 是可以轻松地在 .NET 语言中创建PDF文档的开放源码库。它使用相同的绘制程序来创建 PDF 文档,在屏幕上显示,以及输出到打印机。可以修改、合并、拆分已经存在的 PDF 文件,支持透明图像。

Dapper

https://github.com/SamSaffron/dapper-dot-net

Dapper 是一个轻型的ORM类。代码就一个 SqlMapper.cs文件,编译后就40K的一个很小的Dll.Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超 过了DataTable。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如 果你知道原理也可以让它支持Mongo db。话说,这个ORM,博主自己也一直在使用,确实十分强悍,至少在性能方面,恐怕.NET里面的大多数ORM只能是望其项背了。

NHibernate

https://github.com/nhibernate

NHibernate是现在开发人员用的较多的一个ORM。NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

log4net

http://logging.apache.org/log4net/

log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。

SharpSerializer

http://sharpserializer.codeplex.com/

SharpSerializer是一个开源XML和二进制序列化器。SharpSerializer可以序列化Xml和自己的二进制格式,还可以序列化Json等其他文本格式或其他数据加密,压缩,优化等二进制流。

XProxy

http://xproxy.codeplex.com/

XProxy是一个支持插件的基础代理程序集。通过编写简单的插件程序,你将能开发各种各样的代理程序。
XProxy是一个支持插件开发的数据交换机,可以编写插件对中转数据进行处理。内置有NAT插件、加解密插件、反向代理、直接代理、间接代理等插件。

nopCommerce

http://nopcommerce.codeplex.com/releases/view/106146

nopcommerce 是国外的一个高质量的开源b2c 网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现 的,基于xml的多语言版本,非常灵活的语言切换功能,包括在后台都能同时编辑产品的中英文属性,非常适合做外贸,优秀超前的程序架构,性能也非常强大, 自定义的产品名称和分类又有很好的seo优化。综合能力远远高于国内的一些程序架构糟糕的.net商城程序,是二次开发和大型b2c架构的首选。3.0开 始支持多店。

Enterprise Library

https://entlib.codeplex.com/

Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns & practices 小组为.NET Framework 3.5 开发一套企业库, 目前最新版本为v5.0,支持.NET Framework 4.0,共包括9个Application Block,包括数据访问(Data Access Application Block)、异常管理(Exception Handling Application Block)、数据验证(Validation Application Block)等等,对企业应用开发非常有帮助,也非常实用。

Autofac

http://autofac.org/

Autofac是一款非常优秀的IOC框架,比较于其他的IOC框架,如Spring.NET,等等之类的,它非常的轻量级且性能上也很卓越。

AutoMapper

https://github.com/AutoMapper/AutoMapper

AutoMapper是一个.NET的对象映射工具。主要用于领域对象与DTO之间的转换、数据库查询结果映射至实体对象。

7-Zip

http://www.7-zip.org/

http://sourceforge.net/projects/sevenzip/postdownload?source=dlp

7-Zip 是 一款号称有着现今最高压缩比的压缩软件,它不仅支持独有的 7z 文件格式,而且还支持各种其它压缩文件格式,其中包括 ZIP, RAR, CAB, GZIP, BZIP2和 TAR 等等。此软件压缩的压缩比要比普通 ZIP 文件高 30-50% ,因此,它可以把 Zip 格式的文件再压缩 2-10% 。

.Net PDF 类库

PDFsharp

PDFsharp是一款可以让.NET框架支持的任何语言很容易的创建PDF文件的类库。

ASP.NET FO PDF

FO PDF 是一款C#编写类似于ASP.NET服务器控件的控件。它接受DataTable 和一些其它参数来创建XSL FO,并使用NFOP (Apache FOP Port in J#) PDF Formatter来绘制一个类似PDF Report 的DataGrid 。今后将会增加更多的标签来可以生成XSL FO 。

Report.NET

Report.NET 开源类库包含了生成精确PDF文档的类。它是.NET平台下的C#编写的,可以帮助你创建简单的灵活的PDF文件。你可以从任何ADO.NET的 DataSet取得数据来创建PDF文档。ASP.NET可以用Report.NET来创建动态的PDF响应页面。

SharpPDF

SharpPDF是可以用来简单的创建PDF文件的C#类库。它创建的文件百分白兼容PDF格式。

iTextSharp

iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件。http://hardrock.cnblogs.com/ 是一个关于 iTextSharp的中文Blog。

工作流

Workflow.Net

Workflow.Net是使用微软.Net技术基于wmfc标准的创建工作流引擎。

netBPM

NetBPM是JBpm移植到.net平台下的一款开源工作流软件。NetBpm可以很容易和.Net应用程序集成在一起,可以创建,执行和管理工作流程序。
Bpm Tool支持将业务模型转换成软件模型。业务开发人员可以使用模型驱动的方法设计,实现,执行和跟踪业务流程。因此开发人员能够更容易的关注业务逻辑的变化。

持久层框架

NHibernate

NHibernate是一个面向.NET环境的针对关系型数据库的对象持久化类库。
NHibernate来源于非常优秀的基于Java的Hibernate关系型持久化工具。 NHibernate从数据库底层来持久化你的.Net对象到关系型数据库。NHibernate为你处理这些,你不用自己写SQL去数据库存取对象。你 的代码仅仅和对象关联,NHibernat自动产生SQL语句,并确保对象提交到正确的表和字段中去.大量减少开发时人工使用SQL和ADO.NET处理 数据的时间. NHibernate可以帮助你消除或者包装那些针对特定数据库的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。因此对于那些在 基于.NET的中间层的应用中,它们实现面向对象的业务模型和商业逻辑的应用,NHibernate是最有用的。

FileHelpers Library

FileHelpers Library是一款C#编写的开源 .NET 类库。它使用简单,很容易就可以从固定长度文件或界定记录(CSV)读/写数据。它也支持从不同的数据存储格式(Excel, Access, SqlServer)导入/导出数据。

Websharp

Websharp是国人开源的一款开源持久层框架,它的目标是设计一个基于.Net的通用的应用软件系统的框架,以简化基于.Net平台的企业应用软件的开发。目前,Websharp关注于企业应用软件的以下几个方面:
1、 数据库访问
2、 O/R 映射
3、 AOP
4、 分布式访问

ObjectBroker

ObjectBroker是.NET平台下的一款开源O/R映射框架。它支持对象缓存,1:1, 1:n 和 m:n的关联映射等特性。

Gentle.NET

Gentle.NET是一款开源的与关系数据库(RDBMS)无关的对象持久层框架,可以自动生成SQL和对象结构。它拥有一个SQL工厂用来创建自定义查询、DataView构建助手和卓越的性能和完善的文档。

Ubik

Ubik是C# 2.0下的ORM持久层框架,当前是WinForms应用程序开发提供的.它支持OPath的子集而可以进行面向对象查询,且包含一个网络事件系统.

NDal

NDal是一个数据提取层(DAL)框架,它可以运行在.NET和Mono环境下。

Persist.NET

Persist.NET是C#编写的一款完整的持久层框架。

ObjectBroker

ObjectBroker是.NET平台下的数据库对象/关系映射(O/R Mapping)框架。

iBATIS.NET

iBATIS.NET帮助你的应用系统创建更好的持久层框架。

Advanced Data Provider

Advanced Data Provider是为ADO.NET提供的动态数据提供者 。可以让应用程序透明的访问不同的ADO.NET 数据提供者。

OJB.NET

OJB.NET是一款.NET平台下的对象/关系映射(O/R Mapping)工具。

图表制作

ZedGraph

ZedGraph是C#编写的.NET类库,提供了用户控件和web控件。它可以创建2D的线性图、条形图和饼图。它功能完整且有详细的功能自定义,不过使用默认的选项就足够好用了。

.NET Charts

一款类似 PieChart, StackBar, LineChart的C#开源图表组件。

NPlot

NPlot是一款.NET下的开源图表类库.它值得称道的地方是优雅且灵活的API设计.NPlot包含了Windows Form控件, ASP.NET控件和一个创建Bitmap图片的类。还有一个可用的GTK#控件。

XSCharting

XSCharting是C#开发的图表组件,提供了多种多样的图表选项。

DaveChart

DaveChart是一个免费的DotNet类库。

NChart

NChart 提供了很多值得应用在商业,教育等多个领域的2 D图表。

WebGis

SharpMap

SharpMap是一款易于使用的地图渲染器,它可以为Web和Windows应用程序渲染GIS数据。SharpMap是使用C#编写,基于.NET 2.0框架上开发的开源项目。

monoGIS

monoGIS将成为Mono平台下的开源完整GIS。已经发布了internet mapserver,OGC WMS实现和一些工具像空间格式转换。

NASA World Wind

NASA World Wind 是C#开发的个人电脑上的开源的3D图形虚拟地球系统。它结合了美国国家航空航天局(NASA)从卫星拍摄的图像,这些图像应用于Blue Marble, Landsat 7, SRTM, MODIS 以及其它更多的地方。

开源CMS(转)

开源.net框架的CMS

列举出自己见过的asp.net开源cms,方便初学者入门学习,如果有更好的开源cms请在评论中推荐,谢谢!
1、DotNetNuke(ASP.NET 2.0) 

DotNetNuke是一个Web应用框架的理想,为创建和部署的项目,如商业网站,企业内联网和外联网,在网上出版门户,并定制垂直应用软件。 方便用户-DotNetNuke旨在使用户可以更轻松地管理所有方面的项目。

下载网址:http://www.dotnetnuke.com/

2、Ludico

Ludico是C#编写的居于ASP.NET 2.0的Portal/CMS系统。它的模块化设计是你可以按照你希望的使用或开发网站功能。它里面有高级的用户管理,一个所见即所的(WYSIWYG)的编辑器等。

下载地址:http://sourceforge.net/projects/ludico/

3、umbraco 

Umbraco是一款在.net平台下C#开发的开源内容管理系统,该系统效率,灵活,用户界面都不错。
下载地址:http://umbraco.org/

4、mojoPortal

mojoPortal是一款C#开发的面相对象网站框架,它可以运行于Windows的ASP.NET 和GNU/Linux 或Mac OS X的Mono的平台上。
下载地址:http://www.mojoportal.com/

5、Kodai CMS

Kodai CMS是.NET平台下的一款功能齐全的内容管理系统。
下载地址:http://www.gotdotnet.com/workspaces/workspace.aspx?id=070f30c3-6089-4a75-b84c-fac654a7ec08
6、nkCMS

NkCMS是使用ASP.net和Sql server 2000开发的内容管理系统。
下载地址:http://nkcms.sourceforge.net/

7、Go.Kryo

Go.Kryo是一个用ASP.NET(C#).NET 实现的简单的内容管理系统,后台数据库使用Microsoft SQL Server 。
下载地址:http://sourceforge.net/projects/gokryo/
8、Amplefile

Amplefile是一款内容管理系统,是.Net环境下的windows应用程序,使用了.Net remoting.

下载地址:http://sourceforge.net/projects/amplefile/

9、ndCMS

ndCMS是 ASP.net (C#)下的一个内容管理系统。它提供了用户管理,文件管理,一个WYSIWYG编辑器,模板管理,拼写检查和内置的http压缩。ndCMS的目标是提供一个简单而快速的方式部署.Net站点

下载地址:http://ndcms-net.sourceforge.net/

10、Cuyahoga

Cuyahoga是C#开发的灵活的CMS / Portal 解决方案。它可以运行于Microsoft .NET 和Mono 平台,支持SQL Server, PostgreSQL或MySQL作为底层数据库。
下载地址:http://www.cuyahoga-project.org/

11、Rainbow

Rainbow项目是一款使用Microsoft‘s ASP.NET和C#技术开发的有丰富功能的开源内容管理系统。

12、NetCMS网站内容管理系统

NetCMS是基于ASP.NET2.0开发的网站内容管理系统,程序完全开源,没有任何文件加密, 不需要注册任何组件,完全开源方便您二次开发。

全新“网站模板与网站程序完全分离”的概念,具有强大的标签加样式的个性化组合,自定义标签、自定义表单、JS管理加JS模型(自定义JS,系统 JS)的灵活应用,支持不同频道、栏目、内容页、专题等应用不同的模板,随时能编辑、修改和更换网站界面,系统集成类同Macromedia Dreamweaver一样简单的可视模板编辑方式,可批量设置属性,模板标签全面支持目前最受欢迎的DIV+CSS格式,支持批量绑定模板,完全做到轻 松换肤。

13、拓文asp.net网站内容管理系统 v6.1

重 写的所有代码,程序的速度、灵活性、安全也有极大的提高。主打的文章、软件模块功能继续增强。 支持动态、静态页面混合存在,减少了不必要生成静态页面的负担。功能:文章采集、会员管理、广告管理、软件下载,新闻文章,留言本,调查投票,友情链接, 在线文件管理,公告发布,数据库管理。界面友好、功能完善、简单易用、管理方便。它能帮助您建立高效率的独立站点。CMS V6新特性 全新的选项卡式操作界面,首个采用选项卡式操作界面的CMS,极大提高管理人员的工作效率和用户体验。
多线程并发生成html ,多线程并发采集,编译级模板,模板可编程性,可定制模型,可扩展模型,可自定义字段,可自定义标签,支持任务调度,还有更多功能等待您的发掘。

CHINAZ编辑注:如果安装出错的话手动将Install里的*.SQL导入 修改Web.config的设置就可以了用户名admin密码123

14、ROYcms 是国内CMS市场的新秀、也是国内少有的采用微软的ASP.NET 2.0 + SQL2000/2005 技术框架开发的CMS,充分利用ASP.NET架构的优势,突破传统ASP类CMS的局限性,采用更稳定执行速度更高效的面向对象语言C#设计,沿续 PETshop的代码框架,全新的模板引擎机制,全新的静态生成方案,这些功能和技术上的革新塑造了一个基础结构稳定功能创新和执行高效的CMS。

下载地址:http://www.roycms.cn

1 奎宇工作室 / DotNetCodes C#

一些常用的功能性代码,可以减少许多开发时间,而且类与类之间没有什么依赖,每个类都可以单独拿出来使用

2 beyonehu / manual_dota C#

《刀塔传奇》开源项目,服务器+客户端,蛮牛主办深圳玩贝科技组织 http://www.unitymanual.com/forum-p...

3 oschina / wp7-app C#

OSCHINA 的 Windows Phone 7 客户端源码,可直接在 Marketplace 上搜索“开源中国”来安装此app

4 anycmd / anycmd C#

一个.net平台的完全开源的,完整支持rbac的,将会支持xacml、javascript的通用的权限框架、引擎、中间件、解决方案。

5 kerryjiang / SuperSocket C#

SuperSocket 是一个轻量级的可扩展的 Socket 开发框架,可用来构建一个服务器端 Socket 程序,而无需了解如何使用...

6 Scut / Scut C#

Scut游戏服务器引擎是使用C#语言开发,特别适用于手机网络游戏,支持使用Python脚本进行游戏开发;可以支持多种数据库:支持HTT...

7 nbboy / CommOAuth2 C#

支持国内淘宝,支付宝,新浪,微信,腾讯微博快捷登录

8 wojilu / wojilu C#

(1)一个 .net 平台下的全栈式、轻量级开发框架,包括 ORM、MVC、IOC、AOP、JSON、LOG 等,同时包括全套图文教程...

9 海洋饼干 / AForge.NET C#

AForge.NET 是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习...

10 奎宇工作室 / Asp.Net Mvc WebManger C#

基于asp.net mvc的开源网站管理系统

11 bobo2cj / iamge2text C#

识别出图片里的数字和字母

12 gsbhzh / GG C#

可在广域网部署运行的QQ高仿版 -- GG叽叽。 项目地址:http://www.cnblogs.com/justnow/

13 cheng5x / Yc.QrCode C#

码晒客/疯狂创意二维码,底层 ,模版制作开源

14 longshine / Mina.NET C#

Mina.NET是.NET上的轻量级高性能网络程序框架,支持TCP、UDP和串口等多种传输通道,能够帮助开发者快速地开发高伸缩性的应用程序。

15 葡萄城控件 / ActiveReports C#

ActiveReports是一款在全球范围内应用非常广泛的报表控件,以提供.NET报表所需的全部报表设计功能领先于同类报表控件,包括对...

16 wangwei123 / easy4net C#

easy4net是一个轻量级orm框架,灵活在于可以自己编写复杂的SQL语句查询,简单在于几分钟内便能上手使用,并支持mysql, m...

17 wobumang / wbm.weixinmpsdk C#

微信公众平台SDK。一个更方便,更快速的C#SDK,希望能帮助更多的朋友学习和使用

18 rainy_blue_sky / SmartHomeChat C#

用于局域网的聊天软件, 从其他开源平台上移植过来的, 感觉不错! 开发平台: VS2012 开发语言: ...

19 bobo2cj / SimpleWinformFrame C#

简单的winform开发架子,客户端主程序(tabControl),客户端自动更新程序(WebClient),服务端更新列表生成器(XML)

20 _Jerry / JLib C#

C#类库

21 kerryjiang / SuperWebSocket C#

SuperWebSocket是WebSocket协议服务器端的.NET实现. 作为HTML5的一个重要新特性,WebSocket 规...

22 yqblog / yqblog C#

yqblog-基于MVC,Bootstrap的个人博客系统

23 Aimeast / GitCandy C#

GitCandy是一个开源的基于Asp.Net Mvc的轻量级Git服务端。 QQ交流群:200319579

24 xiaocong_soft / CheckUpdate.Net C#

Winform开发的检查更新程序。可用于Winform/WPF,主要功能包括更新文件、更新程序自身、下载安装包等。

25 奎宇工作室 / NoIIS C#

基于.net4.0的免装IIS运行程序的工具,只要安装.net4.0,就可以快速启动网站程序,为客户演示提供方便

最后,如果你想学C/C++可以私信小编“01”获取素材资料以及开发工具和听课权限哦!