用.NET开发程序通常要涉及到对Office文件读写操作,比较常见的操作比如提取文本,导出Excel格式数据,动态生成word文档,生成pdf文档等。

实现这些功能通常需要在服务端安装office软件,然后通过调用com组件或者oledb的方式访问数据,这是比较重的使用方式,毕竟需要在服务器上安装一个office软件。

相对比较轻量级的是使用OpenXML,需要遵循OpenXML文档规范,动态生成对应格式的xml文件。OpenXML相对比较基础,需要较深入的学习相关的API。

为了简化相关功能开发,最近了解到一款提供给开发人员使用的Office编程组件——Spire.Office,其API接口有点类似于OpenXML,同样也是不需要安装office软件,但是提供更加简便的实现方式。

这个组件涵盖了Office开发中涉及的大部分功能点,涵盖了对Word、Excel、PPT、PDF等文件的读写、编辑、查看功能,同时也提供了条形码生成和扫描的功能,整体功能比较完整,在office开发领域这块看起来无所不能。

官方网站提供了非常详细的文档说明以及使用Demo,难得看到这么详尽的API文档介绍,非常用心的一款产品,详情可点击查看http://www.e-iceblue.com/Tutorials.html

引入方式

引入该组件的方式可以通过下载完整安装包(http://www.e-iceblue.com/downloads/pack/spire.office_2.13.zip)或者通过nuget的方式引用。

个人比较偏向于使用nuget包,在nuget上搜索Spire会列出大概有22个结果,其中第一个package,Spire.Office for .NET是一个完整的组件包,包含了Spire.Office组件的所有功能,当然文件大小也是很大的。

后面的包是针对单个功能的,适用于只需要用到某个功能的情景。

使用例子

为了方便演示,这里直接引用了Spire.Office for .NET包,整体大小在88MB左右,下载packages有点慢

Install-Package Spire.Office

下面针对三个常用功能,学习如何使用Spire.Office组件。

一、文本提取

通常我们在做一些文档索引或者文档解析的时候,需要得到文档的纯文本内容,这样便于对不同格式的文档进行通用的处理。最常见的就是将文档内容作为索引提交的搜索引擎,从而实现对不同格式文档的搜索。

通过Spire.Office的Doc和Pdf组件能比较方便的抽取文档的文本,需要用到以下两个组件

Spire.Doc

Spire.Pdf

demo界面

抽取Word文档

以下代码是加载一个文件流,这个示例是读取上传的文件流,然后遍历文档的每个section,再遍历每个section下的Paragraph,读取里面的文本,得到最终的文档文本内容。

using (var document = new Document(fileStream))
{
// 提取每个段落的文本
var sb = new StringBuilder();
foreach (Section section in document.Sections)
{
foreach (Paragraph paragraph in section.Paragraphs)
{
sb.AppendLine(paragraph.Text);
}
}
return sb.ToString();
}

下图是用于提取的doc文档以及提取后纯文本内容

(word原文) (抽取后的原文)

抽取Pdf文档

类似于Word文档抽取,代码直观明了,加载文件流,然后遍历每一页,提取文本。

using (var document = new PdfDocument())
{
document.LoadFromStream(fileStream);
var sb = new StringBuilder();
foreach (PdfPageBase page in document.Pages)
{
sb.AppendLine(page.ExtractText());
}
return sb.ToString();
}

ExtractPdf

下图是用于提取的pdf文档以及提取后纯文本内容

(pdf原文)    (抽取后的文本)

二、导出Excel数据

导出Excel也是开发中经常遇到的烂大街功能,初期使用过response直接写csv文件,之后用上了专业的组件比如NPOI,现在用Spire.Xls组件来看看效果如何。

demo界面,为了方便演示,直接让用户提交数据库连接字符串和查询语句,然后导出Excel文件

关键代码

大概步骤就是,创建一个Workbook,然后将从数据库得到的DataTable插入到shee中,几行代码比较便捷的得到包含数据的Excel文件

using (var book = new Workbook())
{
var sheet = book.Worksheets[];
// 这里只是返回一个DataTable
DataTable dataTable = GetData(model.ConnectionString, model.SelectClause);
// 在第一行第一列插入数据表
sheet.InsertDataTable(dataTable, true, , );
sheet.Name = dataTable.TableName;
var ms = new MemoryStream();
book.SaveToStream(ms, FileFormat.Version97to2003);
ms.Position = ;
return File(ms, "application/vnd.ms-excel", sheet.Name + ".xls");
}

ExportExcel

导出的文件效果

导出Excel文档效果(基于[AdventureWorks2014].[Production].[Product]表)

由于用的是评估版,所以导出的Excel最后一个sheet是一些试用提示信息

三、生成文档

文档生成通常用于动态从数据库读取一些变化的数据,然后套用某个模板将数据填入,最终生成看起来一个有模有样的文档,通常是那种八股文。曾经做个简历导出,就是用的类似的方式,实现将同一份数据导出成不同的文档格式。

这里使用Spire.Doc和Spire.Pdf两大组件,实现创建word和pdf文档的功能

demo界面,通过输入文档标题,文档名,若干个文档段落生成文档

关键代码

实现过程有点类似于文本抽取的逆向操作

创建Word文档

依次设置标题以及各个段落的内容

using (var document = new Document())
{
Section section = document.AddSection(); var titleParagraph = section.AddParagraph();
titleParagraph.AppendText(model.Title);
titleParagraph.Format.HorizontalAlignment = HorizontalAlignment.Center; foreach (var paragraph in model.Paragraphs)
{
Paragraph para = section.AddParagraph();
para.AppendText(paragraph);
}
var ms = new MemoryStream();
document.SaveToStream(ms, Spire.Doc.FileFormat.Docx);
ms.Position = ;
return File(ms, "application/msword", model.FileName + ".docx");
}

CreateWord

生成文档效果,由于是评估版,还是被硬生生的插入了一段提示,并且生成的word文档不能编辑(付费后应该是可以编辑的)

创建Pdf文档

创建过程类似于使用canvas画板,生成一个简单文档还不算复杂

using (var document = new PdfDocument())
{
PdfPageBase page = document.Pages.Add();
var font = new PdfFont(PdfFontFamily.Helvetica, 13f);
var brush = PdfBrushes.Black;
var location = new PointF(, );
page.Canvas.DrawString(model.Title, font, brush, location); foreach (var paragraph in model.Paragraphs)
{
location.Y += ;
page.Canvas.DrawString(paragraph, font, brush, location);
} var ms = new MemoryStream();
document.SaveToStream(ms, Spire.Pdf.FileFormat.PDF);
ms.Position = ;
return File(ms, "application/pdf", model.FileName + ".pdf");
}

CreatePdf

生成文档效果,同样也是毫无违和感的被插入了评估版的提示。这里看到使用的是英文内容,因为目前测试评估版输入中文生成文档会显示为乱码,还没找到设置编码的方式

完整代码下载

小结

这个组件还是能覆盖到我们日常开发涉及到调用Office的功能,基于这个组件的API还能做更多高级的文档操作功能,实现对office文档进行一些深度的开发时不成问题的。

免费版的目前也就仅仅够体验一下,付费后的功能会强大很多,但是付费版的性价比不是很高,具体收费可以到官网查看

Spire.Office组件使用例子的更多相关文章

  1. 推荐一套.NET文档处理组件Spire.Office

    原文:推荐一套.NET文档处理组件Spire.Office 以前的项目中用到一点Word简单处理的功能(文字替换和转PDF格式),当时使用的是一套COM组件,必须在服务器上安装office环境.最近考 ...

  2. Spire.Office for .NET(Word、Excel、PPT、PDF等)

    使用Spire.Office for .NET(Word.Excel.PPT.PDF等)的初步感受 前言 本文大部分内容来自http://www.codeproject.com/Articles/71 ...

  3. 使用Spire.Office for .NET(Word、Excel、PPT、PDF等)的初步感受

    前言 本文大部分内容来自http://www.codeproject.com/Articles/710747/First-thoughts-on-Spire-Doc-for-NET. 针对我个人来说, ...

  4. [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office

    打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...

  5. 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

    在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...

  6. Office组件之Spire.XLS的DotNet操作

    Overview 在项目中,我们经常需要将程序中获得的大量数据导出到Excel表格中,打印报表:进一步,还可能生成其折线图,对数据的变化趋势进行分析,从而更好地开展项目工作. 最近,我发现了一个对于D ...

  7. NET Office 组件Spire

    高效而稳定的企业级.NET Office 组件Spire   在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是"这个系统似乎就是专门操作文档的" ...

  8. Spire.Doc组件读取与写入Word

    之前写了一篇开源组件DocX读写word的文章,当时时间比较匆忙选了这个组件,使用过程中还是有些不便,不能提前定义好模版,插入Form表单域进行替换.最近无意中发现Spire.Doc组件功能很强大,目 ...

  9. 使用Spire.Doc组件利用模板导出Word文档

    以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...

随机推荐

  1. cssSelector定位笔记1

    cssSelector定位方法:1.使用class属性定位元素:driver.findElement(By.cssSelector("input.login"));即可以先指定一个 ...

  2. android自定义拍照

    调用系统相机,然后在自己的surfaceview上预览,拍照,不废话,直接上源码 package com.example.customecamera; import java.io.File; imp ...

  3. Android--我的Butterknife黄油刀怎么找不到控件了!!!

    1,首先说一下Butterknife这个插件真的挺好用的,不过最近几天在写demo的时候发现总是出现绑定的view是空的,当时着急写代码,也没有深究一下,直接手工findViewbyid了,今天下午写 ...

  4. Buge's Fibonacci Number Problem

    Buge's Fibonacci Number Problem Description snowingsea is having Buge’s discrete mathematics lesson, ...

  5. nodejs cookie管理

    Cookie 管理 我们可以使用中间件向 Node.js 服务器发送 cookie 信息,以下代码输出了客户端发送的 cookie 信息: // express_cookie.js 文件 var ex ...

  6. The constructor BASE64Encoder() is not accessible due to restriction on required library

    在Eclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:Access restriction : T ...

  7. ExtJS6 TreePanel树节点合上展开显示不同图标

    TreePanel的节点如包含子节点,可在展开/合上时显示不同的图标,增强客户端效果,提高用户体验.非常简单,使用TreePanel的两个事件:beforeitemexpand和beforeitemc ...

  8. 异步记载数据时page是怎么计算的

    最近一直在完善基于Busybox做的ARM Linux的根文件系统,由于busybox是一个精简的指令集组成的简单文件系统,其优点就是极精简,满足了Linux基本的启动需求,由于它几乎没有什么后台服务 ...

  9. bzoj 1162 network

    树上的区间第k小数,以前写的主席树是一直MLE的,后来看到一种在初始化的时候的优化:直接DFS这颗树,得到每个点的主席树,然后更新的时候另外对DFS序建主席树,答案加上初始每个点的主席树,这样在初始化 ...

  10. Card Flip

    卡牌效果:O(∩_∩)O,只做了webkit浏览器的效果,请用chrome~ 1.首先呢,先用一个框框把卡牌包住,然后呢,搞两个子元素作为卡牌正反面.当然咯,反面是看不见滴~ <section ...