用于生成 Office 文件的 .NET 组件。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
8.2 KiB

<p align="center">
<a href="README.md">English</a> |
<span>中文</span>
</p>
# NPOI
[![NuGet](https://img.shields.io/nuget/v/DotNetCore.NPOI.svg)](https://www.nuget.org/packages/DotNetCore.NPOI)
[![Build status](https://ci.appveyor.com/api/projects/status/k774la3yfxf0yfv8?svg=true)](https://ci.appveyor.com/project/yuleyule66/npoi)
本项目由 .NET Core Community 迁移自上游项目 Tony Qu 的 [NPOI](https://github.com/tonyqus/npoi) 。
## 通告
NPOI 项目的最上游项目是 [tonyqus/NPOI](https://github.com/tonyqus/NPOI),该项目是 [Apache POI](https://github.com/apache/poi) 项目的 .NET 版本。[tonyqus/NPOI](https://github.com/tonyqus/NPOI) 是华语地区 [NUGET](https://www.nuget.org/packages/NPOI/) 包下载量最大的项目,为全体海内外开发者们所知,这种荣耀与贡献是谁也不可能抹杀的,就像 Linux 衍生出那么多版本,但又有谁会否认 Linus Torvalds 的贡献?
4 years ago
[dotnetcore/NPOI](https://github.com/dotnetcore/NPOI) 作为 [tonyqus/NPOI](https://github.com/tonyqus/NPOI) 项目的下游项目,在 2016 年至 2017 年社区急需 .NET Core 版本的 NPOI,且**明确**收到 tony qu 无意迁移和维护 .NET Core 版本的情况下诞生,它是 [tonyqus/NPOI](https://github.com/tonyqus/NPOI) 的迁移版本。tony qu 亦多次通过 @alexinea 询问 [dotnetcore/NPOI](https://github.com/dotnetcore/NPOI) 单元测试的进度。[dotnetcore/NPOI](https://github.com/dotnetcore/NPOI) 的迁移方式是杨晓东老师(我们对他的尊称,而不是他自称)一个文件一个文件地迁移的,两个项目的命名空间和文件目录都有不少变化。在第一次上传的自述文件(README.MD)中,杨晓东老师说明了此项目是 NPOI 的 Core 版本,NPOI 项目依然在 [tonyqus/NPOI](https://github.com/tonyqus/NPOI) 下。
```
This project is for NPOI Core. NPOI is still under at [https://github.com/tonyqus/npoi](https://github.com/tonyqus/npoi)
```
4 years ago
杨晓东老师无意维护 NFX 版本,而 tony qu 亦无意做 .NET Core 版本的迁移和维护,因此说明这只是 NPOI 的 Core 版本,原版本还是在 [tonyqus/NPOI](https://github.com/tonyqus/NPOI) 并无不妥。在后续的版本中,杨晓东老师在自述文件中也明确了这个版本是迁移自 [tonyqus/NPOI](https://github.com/tonyqus/NPOI)。因 **明确** 得知 tony qu 无意迁移和维护 .NET Core 版本,在 GitHub 的协助下,移除了 [dotnetcore/NPOI](https://github.com/dotnetcore/NPOI) 对 [tonyqus/NPOI](https://github.com/tonyqus/NPOI) 的 fork 关系,作为独立下游项目单独存在与发展,如同 Linux 下游分发项目。做开源的,每个人、每个时间段、每个场景都不可能做到那么完善和严谨,只要没有违反开源协议即无过错。杨晓东老师无意、NCC 无意抹杀 tony qu 的任何功劳。
4 years ago
我们认为,[dotnetcore/NPOI](https://github.com/dotnetcore/NPOI) 完成了她的历史使命,在社区最需要 .NET Core 版本 NPOI 的时候给出了一份选择。作为上游项目,tony qu 本无权力要求下游项目归档,可有人听过上游 Linux 可以要求下游的 Linux 归档的?他在发给 @alexinea 和杨晓东老师的邮件中指出 NCC「没有必要靠 NPOI 来撑台面」。经 NCC 内部讨论一致决定:不与其争论,并屏蔽了他。于是暴风雨来了,tony qu 联系劝说 NCC 成员项目离开 NCC 、联系微软要 DMCA dotnetcore(因为他觉得 github.com/dotnetcore 太正式)等,进而导致了一系列 QQ、微信群里的争论。但 NCC QQ 大群和微信群,反而没怎么讨论此事——因为大家都很明白,[dotnetcore/NPOI](https://github.com/dotnetcore/NPOI) 并未违反任何开源协议。
4 years ago
对于某些人在微信群、QQ 群截取图片传递给 tony qu 的做法,我们实在不敢恭维。Natasha 作者一开始就说过**要争论他可以直接拉群让 tony qu 来讨论**,不知道传话人可有把这句话带到给 tony qu 呢?更何况 Natasha 群也不是 NCC 的群,它只是 Natasha 技术学习群,却被 tony qu 认定为 NCC 的群,群内的发言也被 tony qu 到处散播,不知道是不知道还是真的不知道。
4 years ago
我们无意花更多的时间与 tony qu 纠缠,经 NCC PMC 讨论,现决定将 [dotnetcore/NPOI](https://github.com/dotnetcore/NPOI) 存档,以避免 NCC 社区陷入更大的纠纷。如无意外,今后我们也不会再针对这件事做出任何回应。我们感谢海内外开发者们的支持和理解,愿与包括各位在内的广大开发者和开源社区一道,为 .NET 技术和生态做出更多贡献。
---
## 什么是 NPOI?
NPOI 是 [Apache POI](https://github.com/poi) 项目的 .NET 版本。POI 是一个开源项目,能帮助你读/写 xls、doc、ppt 等文件。它具有广泛用途,如:
* 在服务器未安装 Microsoft Office 套件的情况下生成 Excel 报告,并且比在后台调用 Microsoft Excel ActiveX 效率更高;
* 从 Office 文档中提取文本,以帮助你实现全文索引功能(大多数情况下,此功能用于创建搜索引擎);
* 从 Office 文档中提取图像;
* 生成包含公式的 Excel 工作表。
## 安装 NuGet 包
```powershell
Install-Package DotNetCore.NPOI
```
## 如何在 Linux 上使用?
在 Linux 上,你需要安装 `libgdiplus`。从 1.2.0 开始,还需要 libdl。
- Ubuntu 16.04 及以上:
- apt-get install libgdiplus libc6-dev
- cd /usr/lib
- ln -s libgdiplus.so gdiplus.dll
- Fedora 23 及以上:
- dnf install libgdiplus
- cd /usr/lib64/
- ln -s libgdiplus.so.0 gdiplus.dll
- CentOS 7 及以上:
- yum install autoconf automake libtool
- yum install freetype-devel fontconfig libXft-devel
- yum install libjpeg-turbo-devel libpng-devel giflib-devel libtiff-devel libexif-devel
- yum install glib2-devel cairo-devel
- git clone <https://github.com/mono/libgdiplus>
- cd libgdiplus
- ./autogen.sh
- make
- make install
- cd /usr/lib64/
- ln -s /usr/local/lib/libgdiplus.so gdiplus.dll
- Docker
- Alpine
```
# base sdk-alpine/aspnetcore-runtime-alpine images
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk --update add libgdiplus
```
- Debian
```
FROM microsoft/dotnet:2.1-aspnetcore-runtime
RUN apt-get update && apt-get install -y libgdiplus libc6-dev && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
...
```
## 开始
### 导出 Excel
```csharp
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("this is content");
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);
workbook.Write(fs);
}
```
### 导出 Word
```csharp
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("This is title");
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("This is content, content content content content content content content content content");
doc.Write(fs);
}
```