NPOI .NET Core 2.0

http://www.cnblogs.com/savorboard/p/dotnetcore-npoi.html

前言

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

欢迎转载,请在明显位置给出出处及链接

.NET Core 首例 Office 开源跨平台组件(NPOI Core)的更多相关文章

  1. .NET Core:面向未来的开源跨平台开发技术

    作为一种全新的开源和跨平台的开发平台,.NET Core 历经两年多的开发,终于在于2016年6月27日针对所有主流服务器和桌面操作系统发布 1.0 RTM 版本..NET Core 是一种通用开发平 ...

  2. 老牌开源Office操作组件NPOI现已支持.NET Core

    昨天在微信群里听到老牌Excel开发利器NPOI的作者瞿总说4.6.1版本的NPOI已经支持.NET Standard 2.0了,这也就意味着你可以在.NET Core中使用NPOI了. 作者:依乐祝 ...

  3. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端

    一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...

  4. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构

    一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...

  5. 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...

  6. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

  7. Net Core开源通讯组件 SmartRoute

    Net Core开源通讯组件 SmartRoute(服务即集群) SmartRoute是基于Dotnet Core设计的可运行在linux和windows下的服务通讯组件,其设计理念是去中心化和零配置 ...

  8. 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

    网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里.源代码: https://github.com/Tencent/mars作者:男人链接:https://zhuanlan ...

  9. 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore

    大家好 , 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 , 名字叫 HtmlCore  . 项目的一个主要目标是可以用 .Net 在 移动设备 上 开发 GUI 程序 (界面程 ...

随机推荐

  1. 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)

    Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...

  2. 异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  3. 继电器是如何成为CPU的(1)

    继电器是如何成为CPU的(1) ——<穿越计算机的迷雾>整理和总结 究竟是如何设计的电路,具有计算和控制的智力? 这一点也不高深.本系列文章从初中学的最简单的电路图说起,看看能不能从最初的 ...

  4. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  6. pt-table-checksum

    pt-table-checksum是percona公司提供的一个用于在线比对主从数据一致性的工具. 实现原理 将一张大表分成多个chunk,每次针对一个chunk进行校验,同时将校验的结果通过REPL ...

  7. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  8. mybatis_基础篇

    一.认识mybatis: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改 ...

  9. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  10. Android开发学习—— 创建项目时,不是继承activity,而是继承ActionBarActivity

    对于我们新建android项目时, 会 继承ActionBarActivity. 我们在新建项目时, 最小需求的sdk 选择 4.0以上版本.这样 新建的android项目就是继承activity了!