zl程序教程

您现在的位置是:首页 >  后端

当前栏目

.NET Core首例Office开源跨平台组件(NPOI Core)

NetCore组件开源 Office 跨平台 npoi
2023-09-27 14:21:25 时间

前言

最近项目中,需要使用到 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 :


image

Getting Started

导出 Excel

本示例代码包含:


    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 的学习心得。


作者:杨晓东

来源:51CTO


.net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务 Cygwin工具编译Redis Redis6.x版本是未编译版本(官方很调皮,所以没办法,咱只好帮他们编译一下了),所以咱们先下载一个Cygwin,用它来对Redis进行编译。
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP 使用Autofac进行服务注册实践:新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi项目下,引用Autofac的三个包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。
.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏 经过一段时间的努力,iNeuDA产品组件已经开发和测试完成,现在正式上线。现在iNeuOS工业互联网操作系统的技术体系和产品体系更佳完善,为中小企业提供更佳全面解决方案。
Protocol Buffer(简称Protobuf或PB) 是一个跨平台的消息交互协议,类似xml、json等 ;别只会用Json和XML了,快来看看Google出品的Protocol Buffer!由于是Google的出品,我相信Protocol Buffer已经具备足够的吸引力。
我们都知道 protobuf是由Google开发的一款与平台无关,语言无关,可扩展的序列化结构数据格式,可用做数据存储格式,  通信协议 ! 在前面《.NET开源Protobuf-net组件修炼手册》基础入门课程中我们已经对Google的Protobuf有了一个比较全面的了解和认识,本次高级进修课程主要的侧重点是讲解 Protobuf 通信协议应用。
《Visual Edge Computing Service视图计算产品发布介绍》PDF 立即下载