当前位置: 首页 > 科技观察

.NETCore首款Office开源跨平台组件(NPOICore)

时间:2023-03-12 03:39:42 科技观察

前言最近的一个项目中,需要用到Excel导出。搜索了一圈,发现没有适合.NETCore且不依赖于Office和操作系统限制的Office。组件,于是萌生了将NPOI适配移植到.NETCore的想法。NPOI的介绍就不多说了。不知道的可以看看NPOI百度百科的介绍。我要感谢曲先生和他的团队所做的贡献。NPOI的移植并没有想象的那么容易,因为它依赖System.Drawing和System.Window.Forms两个组件,还有一个第三方的SharpZipLib库,从GitHub上克隆了最新的代码,编译后转成NetStandrad1.6,错误无数。应该有成千上万。经过一天的努力(包括删除、修改、重写),错误数量分别减少到100多个、50多个、20多个,编译通过。在移植的过程中,你能真正感受到NPOI作者在编写这些代码时的辛苦,因为NPOI最初是基于.NetFramework1.1框架编写的。那时候没有泛型,没有var,现成的类也不多。库都是通过一些最基本的数据结构来实现的。虽然很多写法在目前看来可以大大简化程序,但在当时的条件下确实很不容易。编译通过后,觉得问题应该不严重,于是测试了一下。可惜调整了半天,各种问题都打算放弃了。于是去github上搜索了一下,看看有没有其他的解决办法。无意中发现了NPOI.Core的一个项目,是老外将NPOI移植到Core平台上的。原来已经有人做了核心移植。clone之后发现编译不了,于是进去看代码。这个库目前依赖于Windows平台,而我们的项目是运行在CentOS上的,无法在Linux上运行。看来还是很开心的。该怎么办?于是,又开始了重构。经过上次的重构经历,这一次可以说是摸熟了路。NPOICore库使用了很多.NETCorenetstandrad标准不支持的数据结构,例如Hashtable和ArrayList。这些已经被新的通用Directory和List所取代,依赖的SharpZipLib和其他压缩组件也被NetStandrad的实现所取代。当然还有很多杂七杂八的东西就不细说了。***,终于在netstandrad1.6下编译通过。通过后在本地visualstudio下新建工程,简单测试导出到Excel的功能。没有问题,也没有报错。我很高兴....这时候我在想,最重要的是它能不能在Linux上正常运行。其实这个时候我心里想,我把依赖.NETFramework的各种类都换成了netstandrad,应该问题不大。.然后在一个dotnetpublish之后,将部署包传给Linux进行测试。果然,没有抛出任何异常,运行通过,Excel也生成了。把Excel传到windows用office打开,***。..然后继续进行各种测试。测试Word的导出功能时,出错了。因为NPOI对Word的功能支持不是很好,不知道是不是在.NETFramework下不能导出,于是新建一个.NETFramework工程,用NPOITeam提供的dll测试,发现可以可以导出。然后开始跟着代码走,各种测试,重构,终于Word的导出功能没问题了。紧接着,它被送到Linux上进行测试。没有问题,心里的石头落了地。测试通过后,想着把调整后的代码以PR的形式推送给原作者时,发现原作者已经不维护这个项目了,无奈只好自己发布NuGet。所以我将它重新发布到NuGet。如果在使用过程中有什么问题,可以在我的github下提交issue。GitHub:https://github.com/yuleyule66/Npoi.CoreNuGet:GettingStartedExportExcel此示例代码包括:多张表格合并单元格自动调整列宽填充背景色varnewFile=@"newbook.core.xlsx";using(varfs=newFileStream(newFile,FileMode.Create,FileAccess.Write)){IWorkbookworkbook=newXSSFWorkbook();ISheetsheet1=workbook.CreateSheet("Sheet1");sheet1.AddMergedRegion(newCellRangeAddress(0,0,0,10));varrowIndex=0;IRowrow=sheet1.CreateRow(rowIndex);row.Height=30*80;row.CreateCell(0).SetCellValue("这是单元格内容,可以设置很长,看看列宽能不能自动调整");sheet1.AutoSizeColumn(0);rowIndex++;varsheet2=workbook.CreateSheet("Sheet2");varstyle1=workbook.CreateCellStyle();style1.FillForegroundColor=HSSFColor.Blue.Index2;style1.FillPattern=FillPattern。SolidForeground;varstyle2=workbook.CreateCellStyle();style2.FillForegroundColor=HSSFColor.Yellow.Index2;style2.FillPattern=FillPattern.SolidForeground;varcell2=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此示例代码包含:varnewFile2=@"newbook.core.docx";using(varfs=newFileStream(newFile2,FileMode.Create,FileAccess.Write)){XWPFDocumentdoc=newXWPFDocument();varp0=doc.CreateParagraph();p0.Alignment=ParagraphAlignment.CENTER;XWPFRunr0=p0.CreateRun();r0.FontFamily="microsoftyahei";r0.FontSize=18;r0.IsBold=true;r0.SetText("这是标题");varp1=doc.CreateParagraph();p1.Alignment=ParagraphAlignment.LEFT;p1.IndentationFirstLine=500;XWPFRunr1=p1.CreateRun();r1.FontFamily="仿宋";r1.FontSize=12;r1.IsBold=true;r1.SetText("这里是文字这里是文字这里是文字这里是文字这里是文字这里是文字这里是文字texthereisthetexthereThisisthetexthereisthetexthereisthetext");doc.Write(fs);}总结据不完全统计,这应该是.NETCore中第一个Office跨平台组件。如果大家在使用过程中有什么问题,可以在Github上提交Issue(尽量使用英文),当然也希望大家可以提交PR,帮助提高NPOI,如果觉得这篇博客有帮助给你,谢谢你的【推荐】。如果你对.NETCore感兴趣,可以关注我,我会定期在博客上分享我对.NETCore的学习心得。本文地址:http://www.cnblogs.com/savorboard/p/netcore-npoi.html作者博客:Savorboard