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

前言

最近项目中,需要使用到 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应用迁移到.NET Core(一)

  • .NET应用迁移到.NET Core(二)风险评估

  • .NET应用迁移到.NET Core(三)从商业角度看移植过程

  • .NET应用迁移到.NET Core--调查案例

原文地址:http://www.cnblogs.com/savorboard/p/netcore-npoi.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

员工管理系统---SpringBoot

目录结构 全部代码 package com.kuang.config;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;//拦截器 public class LoginHandlerInterceptor implements Hand…

深入Java集合系列之五:PriorityQueue

转载自 深入Java集合系列之五:PriorityQueue 前言 今天继续来分析一下PriorityQueue的源码实现,实际上在Java集合框架中,还有ArrayDeque(一种双端队列),这里就来分析一下PriorityQueue的源码。PriorityQu…

linux系统操作大全,Linux系统的常用操作命令大全

From:http://www.xiaoxiaozi.com/2010/11/09/1985/摘自:http://hi.baidu.com/jackywdx/blog/item/393ccf4b64268bf482025cde.html系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostnam…

抹掉所有内容和设置 连接到icloud时出错 iphone还原出厂设置

设置-》抹掉所有内容和设置 点击设置 在顶部输入框中 输入抹掉 2个子就可以找到 1,点通用,存储用量,如果icloud为不可用, 设置--蜂窝数据-网络为无线网和蜂窝数据,成功的点个赞吧~!(这个过…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——hibernate的config文件(hibernate.cfg.xml)

hibernate.cfg.xml文件&#xff0c;必不可少的一个xml文件&#xff0c;上面附有数据库的用户名&#xff0c;密码&#xff0c;链接字符串&#xff0c;方言等信息&#xff0c;还包含映射的文件路径&#xff1a; <?xml version1.0 encodingUTF-8?> <!DOCTYPE hibernate…

微服务的前世今生

译者&#xff1a;周元昊 与许多人认为的不同&#xff0c;微服务的概念已有相当长的历史&#xff0c;SOA&#xff08;面向服务的体系架构&#xff09;也不是90年代才被提出的。在最近举办的伦敦微服务大会上&#xff0c;Greg Young就微服务核心概念的前世今生进行了演讲。其中他…

linux 查看本机网关地址,linux查看服务器网关地址

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情什么是弹性…

非阻塞线程安全列表——ConcurrentLinkedDeque应用举例

转载自 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例 在java中,最常用的数据结构可能是列表。有数目不详的元素列表,你可以添加、阅读、或删除任何位置的元素。此外,并发列表允许不同的线程列表中添加或删除元素时不产生任何数据不一致。非阻塞列表提供如下操作,如果…

整合JDBC---SpringBoot

整合JDBC SpringData简介 对于数据访问层&#xff0c;无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库)&#xff0c;Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。 Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库&#xff0c;Sprin…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码

严格按照三层架构来写的&#xff0c;Dao层的代码比较少&#xff0c;我直接把Emp和实现类的都放在这篇文章里面吧&#xff0c; IEmpDao.java接口&#xff1a; /** * Title: IEmpDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccm…

在idea 中添加和删除模块Module

在idea 中添加和删除模块Module ThinkPet 2018-12-22 10:12:50 4125 收藏 1 分类专栏&#xff1a; idea 版权 1.添加模块 2.删除模块 ———————————————— 版权声明&#xff1a;本文为CSDN博主「ThinkPet」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&am…

ASP.NET Core File Providers

ASP.NET Core通过对File Providers的使用实现了对文件系统访问的抽象。 查看或下载示例代码 File Provider 抽象 File Providers是文件系统之上的一层抽象。它的主要接口是IFileProvider。IFileProvider公开了相应方法用来获取文件信息&#xff08;IFileInfo&#xff09;&#…

java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

转载自 java并发编程&#xff08;二十一&#xff09;----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍 这一节我们来接着介绍JUC集合&#xff1a;CopyOnWriteArraySet和ConcurrentSkipListSet。从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOnWrit…

linux u32,如何在程序中使用u32这个类型啊。

如何在程序中使用u32这个类型啊。 我用的keil 4.5#include "stm32f10x.h"int main(void){GPIO_InitTypeDef GPIO_Init1;GPIO_Init1.GPIO_Pin GPIO_Pin_0;GPIO_Init1.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init1.GPIO_Mode GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPI…

虚拟机安装CentOS-7-x86_64-DVD-1708说明

https://blog.csdn.net/guanzhuwo/article/details/105903844 镜像已经下载了 使用IDM下载 http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso 虚拟机安装CentOS-7-x86_64-DVD-1708说明 guanzhuwo 2020-05-03 15:12:22 102 收藏 分类专栏&a…

struts+hibernate+oracle+easyui实现lazyout组件的简单案例——DeptDao层代码

下面来看看DeptDao 的事例吧&#xff1a; IDeptDao.java: /** * Title: IDeptDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-4-19 下午6:37:00 * version V1.0 */ package org.dao;impo…

IJ实现侧边栏单独搜索

第一步任意点击一个 第二步输入要搜索的单词

关于全局ID,雪花(snowflake)算法的说明

C#版本的国外朋友已经封装了&#xff0c;大家可以去看看&#xff1a;https://github.com/ccollie/snowflake-net 强大的网友出来个简化版本&#xff1a;http://blog.csdn.net/***/article/details/*** &#xff08;地址我就不贴了&#xff0c;对前辈需要最起码的尊敬&#xff0…

Java并发包:ConcurrentMap

转载自 Java并发包&#xff1a;ConcurrentMap 文章译自&#xff1a;http://tutorials.jenkov.com/java-util-concurrent/index.html 抽空翻译了一下这个教程的文章&#xff0c;后面会陆续放出&#xff0c;如有不妥&#xff0c;请批评指正。 转自请注明出处。 之前漏了一篇文…

SecureCRT的下载、安装( 过程非常详细!!值得查看)

我自己百度联通主号有存储了 可以下下来 有视频加这个文档 就可以了 https://blog.csdn.net/qq_39052513/article/details/100272502 SecureCRT的下载、安装&#xff08; 过程非常详细&#xff01;&#xff01;值得查看&#xff09; 置顶 超Ren专属 2020-06-02 21:29:33 1…