前言
最近項目中,需要使用到 Excel 導出,找了一圈發現沒有適用于 .NET Core的,不依賴Office和操作系統限制的 Office 組件,于是萌生了把 NPOI 適配并移植到 .NET Core 的想法。
NPOI 的介紹不多說了,不了解的可以看一下 NPOI百度百科 的介紹,在此感謝瞿總和他的團隊的貢獻。
NPOI 的移植之路并非想象的那么容易,因為其依賴了 System.Drawing 和 System.Window.Forms 兩個組件,還有一個第三方的 SharpZipLib 庫,在 GitHub 克隆了最新的代碼并且轉換為 NetStandrad 1.6 編譯之后,出現了數不清的錯誤,應該有上千個吧,在經過一天的努力之后(包括刪除,修改,重寫),錯誤數量已經減少到了100多個,50多個,20多個,編譯通過。
在移植的過程中可以真切感受到當初NPOI的作者在寫這些代碼時候的辛苦努力,因為NPOI最初是基于 .Net Framework 1.1 框架寫的,那個時候沒有泛型,沒有var,沒有很多的現成的類庫,全都是靠最基礎的一些數據結構來實現,雖然里面的很多種寫法在目前看來可以很大程序的精簡,但是在當時的條件下 真的是不容易。
在通過編譯之后,心里想著應該問題不大了,于是測試了一下,不幸的是,各種問題,又經過半天的調整之后,打算放棄了。 于是又去 github 上面搜索看看有沒有其他什么解決方案之類的,無意間搜索到了一個 NPOI.Core 的一個項目,是一個老外移植的 NPOI 到Core平臺,原來已經有人做了Core的移植了,克隆下來之后發現編譯不過,又進去看了一下代碼,這個庫目前依賴于Windows平臺,而我們項目是運行在CentOS的,其并不能在Linux上運行,看來還是空歡喜一場。
怎么辦? 于是,又一次重構開始了,有了前一次的重構經驗之后,這一次可謂是輕車熟路了,NPOI Core 庫 里面使用了很多.NET Core netstandrad 標準不支持的 Hashtable 和 ArrayList 等數據結構,這些已經被新的泛型 Directory 和 List 替代了,還有依賴的 SharpZipLib 等壓縮組件也都替換成了 NetStandrad 的實現,當然還有其他很多雜七雜八的就不細說了,最后,終于 netstandrad 1.6 下編譯通過。
通過之后,本地 visual studio 下 新建了一個項目,簡單測試了導出 Excel 的功能,沒問題,也沒有報錯,心里很開心...。 這個時候我在想,最關鍵的就是能不能在Linux上正常運行了,其實這個時候我心里想我已經把依賴于.NET Framework 的各種類都換成了net standrad了,應該問題不大了。
然后在一頓 dotnet publish 之后,把部署包傳到了 Linux 下進行測試,果然,運行通過,并沒有拋出任何異常,而且Excel也生成了,把Excel傳輸到windows上使用office打開,完美...
然后緊接著就是繼續各種測試了,在測試到 Word 的導出功能時候,出問題了。因為NPOI 天生對Word的功能支持的并不是很完善,心想是不是.NET Framewok下導出也不行啊,于是又新建的一個.NET Framework的項目,使用NPOI Team提供的 dll 測試,發現可以導出。然后就開始跟代碼,各種測試,重構,最終Word的導出功能也沒有問題了。緊接著又發到了Linux上測試,沒有問題,心里的石頭落地了。
在通過測試之后,本想著把這次調整的代碼以 PR 的形式推送給原作者的時候,發現好像原作者已經不維護這個項目了,無奈,只能自己發布NuGet了。
于是我就把它重新發布到 NuGet 了,如果使用的過程中有問題,大家可以去我的github下面提交 issue。
GitHub : https://github.com/yuleyule66/Npoi.Core
NuGet :
Getting Started
導出 Excel
本示例代碼包含:
- 多個 Sheet
- 合并單元格
- 自動調整列寬
- 填充背景色
var newFile = @"newbook.core.xlsx";
using (var fs = new FileStream(newFile, FileMode.Create, FileAccess.Write)) {
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");
sheet1.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10));
var rowIndex = 0;
IRow row = sheet1.CreateRow(rowIndex);
row.Height = 30 * 80;
row.CreateCell(0).SetCellValue("這是單元格內容,可以設置很長,看能不能自動調整列寬");
sheet1.AutoSizeColumn(0);
rowIndex++;
var sheet2 = workbook.CreateSheet("Sheet2");
var style1 = workbook.CreateCellStyle();
style1.FillForegroundColor = HSSFColor.Blue.Index2;
style1.FillPattern = FillPattern.SolidForeground;
var style2 = workbook.CreateCellStyle();
style2.FillForegroundColor = HSSFColor.Yellow.Index2;
style2.FillPattern = FillPattern.SolidForeground;
var cell2 = sheet2.CreateRow(0).CreateCell(0);
cell2.CellStyle = style1;
cell2.SetCellValue(0);
cell2 = sheet2.CreateRow(1).CreateCell(0);
cell2.CellStyle = style2;
cell2.SetCellValue(1);
cell2 = sheet2.CreateRow(2).CreateCell(0);
cell2.CellStyle = style1;
cell2.SetCellValue(2);
cell2 = sheet2.CreateRow(3).CreateCell(0);
cell2.CellStyle = style2;
cell2.SetCellValue(3);
cell2 = sheet2.CreateRow(4).CreateCell(0);
cell2.CellStyle = style1;
cell2.SetCellValue(4);
workbook.Write(fs);
}
導出 Word
本示例代碼包含:
- 設置段落對其方式
- 設置段落字體
- 設置段落縮進
- 這是字體大小
var newFile2 = @"newbook.core.docx";
using (var fs = new FileStream(newFile2, FileMode.Create, FileAccess.Write)) {
XWPFDocument doc = new XWPFDocument();
var p0 = doc.CreateParagraph();
p0.Alignment = ParagraphAlignment.CENTER;
XWPFRun r0 = p0.CreateRun();
r0.FontFamily = "microsoft yahei";
r0.FontSize = 18;
r0.IsBold = true;
r0.SetText("這里是標題");
var p1 = doc.CreateParagraph();
p1.Alignment = ParagraphAlignment.LEFT;
p1.IndentationFirstLine = 500;
XWPFRun r1 = p1.CreateRun();
r1.FontFamily = "仿宋";
r1.FontSize = 12;
r1.IsBold = true;
r1.SetText("這里是正文,這里是正文這里是正文這里是正文這里是正文這里是正文這里是正文這里是正文這里是正文這里是正文這里是正文這里是正文");
doc.Write(fs);
}
總結
據不完全統計,這應該是 .NET Core 首例 Office 跨平臺 組件了,大家如果在使用的過程中有什么問題,可以在 Github 上提交Issue(盡量使用英文)。當然更希望你能夠提交 PR 來幫助一起完善 NPOI。
如果你覺得本篇博客對您有幫助的話,感謝您的【推薦】。
如果你對 .NET Core 感興趣可以關注我,我會定期在博客分享關于 .NET Core 的學習心得。
本文地址:http://www.cnblogs.com/savorboard/p/netcore-npoi.html
作者博客:Savorboard
歡迎轉載,請在明顯位置給出出處及鏈接
文章列表
不含病毒。www.avast.com |
留言列表