zoukankan      html  css  js  c++  java
  • 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组件的所有功能,当然文件大小也是很大的。

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

    image

    使用例子

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

    Install-Package Spire.Office

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

    image

    一、文本提取

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

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

    Spire.Doc

    Spire.Pdf

    demo界面

    image

    抽取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文档以及提取后纯文本内容

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

    抽取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文档以及提取后纯文本内容

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

    二、导出Excel数据

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

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

    image

    关键代码

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

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

    导出的文件效果

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

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

    image

    三、生成文档

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

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

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

    image

    关键代码

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

    创建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 = 0; 
                    return File(ms, "application/msword", model.FileName + ".docx"); 
                }
    CreateWord

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

    image

    创建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(20, 20); 
                    page.Canvas.DrawString(model.Title, font, brush, location);
    
                    foreach (var paragraph in model.Paragraphs) 
                    { 
                        location.Y += 10; 
                        page.Canvas.DrawString(paragraph, font, brush, location); 
                    }
    
                    var ms = new MemoryStream(); 
                    document.SaveToStream(ms, Spire.Pdf.FileFormat.PDF); 
                    ms.Position = 0; 
                    return File(ms, "application/pdf", model.FileName + ".pdf"); 
                }
    CreatePdf

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

    image

    完整代码下载

    小结

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

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

  • 相关阅读:
    java面向对象基础
    java重载方法、重写方法
    java数据类型
    Java简介
    随机读写,块读写
    Java基本常识

    循环双向链表
    双向链表(链表)
    循环单链表(链表)
  • 原文地址:https://www.cnblogs.com/shenba/p/5439198.html
Copyright © 2011-2022 走看看