Spire.Office组件使用例子
用.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组件使用例子的更多相关文章
- 推荐一套.NET文档处理组件Spire.Office
原文:推荐一套.NET文档处理组件Spire.Office 以前的项目中用到一点Word简单处理的功能(文字替换和转PDF格式),当时使用的是一套COM组件,必须在服务器上安装office环境.最近考 ...
- Spire.Office for .NET(Word、Excel、PPT、PDF等)
使用Spire.Office for .NET(Word.Excel.PPT.PDF等)的初步感受 前言 本文大部分内容来自http://www.codeproject.com/Articles/71 ...
- 使用Spire.Office for .NET(Word、Excel、PPT、PDF等)的初步感受
前言 本文大部分内容来自http://www.codeproject.com/Articles/710747/First-thoughts-on-Spire-Doc-for-NET. 针对我个人来说, ...
- [.NET] 打造一个很简单的文档转换器 - 使用组件 Spire.Office
打造一个很简单的文档转换器 - 使用组件 Spire.Office [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6024827.html 序 之前,& ...
- 高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)
在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是”这个系统似乎就是专门操作文档的“.毕竟现在的很多办公中大都是在PC端操作文档等软件,在这些庞大而繁重的业务中,单 ...
- Office组件之Spire.XLS的DotNet操作
Overview 在项目中,我们经常需要将程序中获得的大量数据导出到Excel表格中,打印报表:进一步,还可能生成其折线图,对数据的变化趋势进行分析,从而更好地开展项目工作. 最近,我发现了一个对于D ...
- NET Office 组件Spire
高效而稳定的企业级.NET Office 组件Spire 在项目开发中,尤其是企业的业务系统中,对文档的操作是非常多的,有时几乎给人一种错觉的是"这个系统似乎就是专门操作文档的" ...
- Spire.Doc组件读取与写入Word
之前写了一篇开源组件DocX读写word的文章,当时时间比较匆忙选了这个组件,使用过程中还是有些不便,不能提前定义好模版,插入Form表单域进行替换.最近无意中发现Spire.Doc组件功能很强大,目 ...
- 使用Spire.Doc组件利用模板导出Word文档
以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...
随机推荐
- [原创]java WEB学习笔记104:Spring学习---AOP 前奏,通过一个问题引入动态代理
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Android 主题切换 小结
前言 我们用手机的时候经常看到 设置里面有夜间模式和白天模式来更换APP的主题,以前以为很简单,但是实际做起来还是有各种不完美,那么我们也要去了解各种解决方案来丰富我们的知识,现在我们就来看看各种优劣 ...
- Generate Ubuntu Install Media On Mac
Opps, my computer system was broken again... Let's repire it. Introduction The system of my PC is br ...
- workbench中safe update
1.在workbench中表格显示为readonly ,更新时提示Error Code: 1175. You are using safe update mode and you tried to u ...
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
C#反射中的MakeGenericType函数可以用来指定泛型方法和泛型类的具体类型,方法如下面代码所示这里就不多讲了,详情看下面代码一切就清楚了: using System; using Syste ...
- iOS8.3发布了Swift 1.2带来哪些新变化
苹果前几日在面向开发者推送iOS 8.3 Beta的同时,还发布了版本号为6D520o的Xcode 6.3 Beta,其中便包含了iOS 8.3 Beta和OS X v10.10 SDK,并进一步提升 ...
- >Python下使用subprocess中文乱码的解决方案
# -*- coding: CP936 -*- import subprocess cmd="cmd.exe" begin=101 end=110 while begin<e ...
- 《编写可维护的JavaScript》——JavaScript编码规范(二)
昨天是我偶像生日,现在整个人都还好兴奋啊O(∩_∩)O~ 闲话少说,让我先发篇随笔留念一下^_^ ////////////////////////////////正文分割线///////////// ...
- Python作业 1
用户有三次机会登录,登录成功,显示欢迎界面. 三次登录失败,账户被锁定,下次登录失败. 思路: 1:流程控制:for或者while循环,达到三次检测目的. 2:文件操作. 检测文档,一旦发现输入账户名 ...
- 20161014006 DataGridView Combobox 数据绑定与传值
//Combobox private void T_Form_CY_CBD_D_CurrentCellChanged(object sender, EventArgs e) ...