Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
導出Excel是.NET的常見需求,開源社區、市場上,都提供了不少各式各樣的Excel操作相關包。本文,我將使用NPOI、EPPlus、OpenXML、Aspose.Cells四個市面上常見的庫,各完成一個導出Excel示例。然后對其代碼風格和性能做一個橫向比較。最后我將說出我自己的感想。
文中所有的示例代碼可以在這里下載:
https://github.com/sdcb/blog-data/tree/master/2019/20190824-dotnet-excel-compare
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是另一個開源的Excel操作庫,目前最新版本是4.5.3.2。Github地址是:https://github.com/JanKallman/EPPlus。
EPPlus僅依賴基礎類庫BCL,完全沒有第三方包依賴,也是.NET原生庫。
EPPlus只支持導出Office 2007之后的格式,也就是xlsx。這已經是存在12年的格式了,但如果有客戶想要導出xls,EPPlus將不支持。
OpenXML的NuGet包全稱是DocumentFormat.OpenXml:是微軟推出的較為低層的Excel操作庫,最新穩定版本是2.9.1。OpenXML也是開源項目,地址是:https://github.com/OfficeDev/Open-XML-SDK。
從該項目的名字可以看出,OpenXML比較涉及底層,因此很容易令人浮想聯翩,感覺它的性能、速度很可能是最快的,但真的如此嗎?
這是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個的限制。因此,“試用版”對我們的物理限制,就只有這個水印了(當然加了這個水印,客戶肯定也不會有好表情)。
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 | LGPL | MIT | 不開源 |
收費類型 | 免費 | 免費 | 免費 | 收費 |
所有代碼的版本號基于上文中提到的最新穩定版本:
包 | 最新穩定版本號 |
NPOI | 2.4.1 |
EPPlus | 4.5.3.2 |
OpenXML | 2.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
項目 | 值 |
CPU | E3-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,520 | 8,712 | 156 |
2 | 9,852,592 | 0 | 138 |
3 | 9,852,592 | 0 | 147 |
4 | 9,873,096 | 9,240 | 136 |
5 | 9,853,936 | 776 | 133 |
可見,基于反射操作6萬/10列數據,每次需要分配約9MB內存,但這些內存都會被快速GC,最終內存提高較少。這些使用反射的代碼運行耗時在130ms-150ms左右。
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,416 | 537,048 | 6590 |
2 | 1,589,239,728 | 7,712 | 10155 |
3 | 1,589,232,056 | -5,368 | 10309 |
4 | 1,589,237,064 | 7,144 | 10355 |
5 | 1,589,245,000 | 9,560 | 10594 |
分配內存穩定在1.48GB的樣子,首次內存會提高524KB左右,后面趨于穩定。首次耗時6秒多,后面穩定在10秒多。
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,328 | 156,048 | 3248 |
2 | 533,610,232 | 14,896 | 2807 |
3 | 533,595,936 | 7,648 | 2853 |
4 | 533,590,776 | 4,408 | 2742 |
5 | 533,598,440 | 11,280 | 2759 |
分配內存約508MB,耗時首次稍長,約3.2秒,后面穩定在2.7-2.8秒。
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,896 | 145,832 | 4009 |
2 | 555,981,216 | 312 | 3783 |
3 | 555,985,936 | 2,760 | 3884 |
4 | 555,984,384 | 1,872 | 3869 |
5 | 555,989,120 | 3,880 | 3704 |
內存占用約530MB左右,第一次比后面多1MB的樣子,耗時3.7-4.0秒之間。
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,944 | 3,619,520 | 3316 |
2 | 357,931,648 | 6,048 | 2078 |
3 | 357,934,744 | 7,216 | 2007 |
4 | 357,933,376 | 6,280 | 2017 |
5 | 357,933,360 | 6,424 | 2007 |
Aspose.Cells首次占用內存385MB,用于3.3秒,后面每次降低為內存341MB,用時2.0秒。
四種導出Excel庫的橫向評測數據如下,數據取5次數值的內存消耗中位數
,百分比以EPPlus的測試數據為100%基準:
次數 | 分配內存 | 內存占比 | 耗時 | 耗時占比 |
基準(僅反射) | 9,853,936 | 1.85% | 133 | 4.82% |
NPOI | 1,589,237,064 | 297.83% | 10355 | 375.32% |
EPPlus | 533,598,440 | 100% | 2759 | 100% |
OpenXML | 555,985,936 | 104.19% | 3884 | 140.78% |
Aspose | 357,933,360 | 67% | 2007 | 72.74% |
可以得出以下結論:
Demo基于反射,但反射總損耗的性能不高,內存、耗時均不超過5%;
NPOI的性能表現是所有項目中最差的,每次需要分配1.5GB的內存和超過10秒的耗時;
EPPlus表現不錯,內存和耗時在開源組中表現最佳;
收費的Aspose.Cells表現最佳,內存占用最低,用時也最短;
較為底層的OpenXML表現非常一般,比EPPlus要差,更不能與收費的Aspose相提并論;
在真的愿意嘗試一下之前,人們很容易相信自己的直覺。底層庫,通常能帶來更大的可擴展性,能做出上層庫很難做的事來。底層庫有時性能會更快,就像更底層的C/C++比上層的JavaScript更快一樣。但事情也不都如此,如
更高層的React.js能在性能上將較底層的DOM操作比下去
數據庫基于集合的操作也比基于游標的操作要快得多
在導出Excel這個例子中,我了解到Excel的xlsx格式是非常復雜的、多個xml的集合。如果基于xml做抽象——也是很正常的做法,拼出6萬/10列的數據,需要至少60萬個xml標簽做拼接,很顯然這需要分配/浪費大量內存,因此性能上不來。
我基于以下幾點無責任猜測:Aspose內部可能沒xml做抽象,而是純數據做抽象(就像React.js那樣),然后再統一寫入到Excel文件。因此性能可以達到其它庫達不到的目標:
Aspose.Cells對xml等實現相關技術只字未提(可能因為要支持多種文件格式);
Aspose.Cells是先在內存中創建,再寫入文件/流(NPOI也是);
Aspose.Cells創建Excel時要求客戶直接使用Workbook類(NPOI也是);
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。
Magicodes.IE.Excel.AspNetCore庫是心萊科技麥扣出品的一個支持Excel導入導出的功能。有興趣的同學可以去搜索一下。類庫是支持Dto導入導出以及動態導出,支持Excel、Word、Pdf和Html功能較多。不過作者維護的Github上的倉庫。但是該庫有個缺點是Excel導入不支持“.xls”文件,即不支持Excel97-2003。也許未來可以支持。
我們僅演示使用Excel來完成學生數據的導入。我們需要在已準備好的工程中安裝以下包,參考如下所示:
創建導入類Student.ts并設置必要的屬性
如上述代碼所示,我們定義了以上學生數據類,主要注意事項如下
創建在項目FlyingHat.Extensions中創建OfficeService.cs類并單例注冊IExcelImporter
打開Program.cs中寫入builder.Services.AddOfficeService();
builder.Services.AddOfficeService();
通過構造函數注入 IExcelImporter ,然后開始編寫導入功能,在導入之前是不是得準備一份模板?對于我們,手寫模板?這是不存在的。Magicodes.IE.Excel.AspNetCore封裝了根據DTO自動生成Excel導入模板的方法,我們可以直接調用。這里我們來看下導入的相關方法。
通過導出的文件完成數據填充后導入到數據庫
界面展示:
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”獲取素材資料以及開發工具和聽課權限哦!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。