博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 操作Word 中的OLE——插入、编辑、读取 OLE
阅读量:7202 次
发布时间:2019-06-29

本文共 10482 字,大约阅读时间需要 34 分钟。

概述

OLE,Object Linking and Embedding,即对象连接与嵌入。我们在设计程序时,OLE可以用来创建复合文档,把文字、声音、图像、表格、应用程序等类型的信息组合在一起,在Word中,我们可以通过OLE来实现以上要素信息的组合。下面的示例中将介绍如何通过C# 来操作Word中的OLE,示例内容包含以下要点:

  • 插入OLE到Word
  • 编辑Word中的OLE
  • 读取Word中的OLE

 

使用工具

  •  

:下载安装该类库,在编辑代码时,注意在程序中添加引用Spire.Doc.dll(dll文件可在安装路径下的Bin文件夹中获取)

示例代码(供参考)

【示例1】插入OLE到Word

步骤 1 :添加using指令

using Spire.Doc;using Spire.Doc.Documents;using Spire.Doc.Fields;using System.Drawing;

步骤 2 :创建文档

//实例化一个Document类对象Document doc = new Document();//向文档中添加一个Section对象,并添加段落Section sec = doc.AddSection();Paragraph p = sec.AddParagraph();

步骤 3 :加载图片

//实例化一个DocPicture类对象,加载图片DocPicture picture = new DocPicture(doc);Image image = Image.FromFile(@"chart1.png");picture.LoadImage(image);

步骤 4 :插入OLE

//在文档中插入一个工作表, OleLinkType 枚举值控制该OLE是链接还是嵌入DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Link);//DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Embed);

步骤 5 :保存文档

//保存并打开文档doc.SaveToFile("添加OLE.docx");System.Diagnostics.Process.Start("添加OLE.docx");

完成代码后,调试运行程序,生成文档。

测试结果,如下图所示:

全部代码:

using Spire.Doc;using Spire.Doc.Documents;using Spire.Doc.Fields;using System.Drawing;namespace InsertOLE_Doc{    class Program    {        static void Main(string[] args)        {            //实例化一个Document类对象            Document doc = new Document();            //向文档中添加一个Section对象,并添加段落            Section sec = doc.AddSection();            Paragraph p = sec.AddParagraph();            //实例化一个DocPicture类对象,加载图片            DocPicture picture = new DocPicture(doc);            Image image = Image.FromFile(@"chart1.png");            picture.LoadImage(image);            //在文档中插入一个工作表, OleLinkType 枚举值控制该OLE是链接还是嵌入                     DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Link);            //DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Embed);            //保存并打开文档            doc.SaveToFile("添加OLE.docx");            System.Diagnostics.Process.Start("添加OLE.docx");        }    }}
View Code

 

 

【示例2】编辑Word中的OLE

 (这里以上文中生成的文档为测试文件)

步骤 1 :添加using指令

using Spire.Doc;using Spire.Doc.Documents;using Spire.Doc.Fields;using System.Drawing;using System.IO;

步骤 2 :加载文档

//实例化一个Document对象,加载含有OLE的Word文档Document doc = new Document();doc.LoadFromFile("test.docx");

步骤 3 :获取section中的所有OLE,根据需要来更改OLE的类型和链接对象

//获取第一个SectionSection sec = doc.Sections[0];//遍历这个Section中的所有子元素,找到段落下的OLE对象foreach (DocumentObject obj in sec.Body.ChildObjects){    if (obj is Paragraph)    {        Paragraph par = obj as Paragraph;        foreach (DocumentObject paraObj in par.ChildObjects)        {            //找到OLE对象,根据类型来进行更改操作            if (paraObj.DocumentObjectType == DocumentObjectType.OleObject)            {                DocOleObject Ole = paraObj as DocOleObject;                //如果是链接, 修改对象的链接路径                if (Ole.LinkType == OleLinkType.Link)                {                    //同时还要手动去更改OLE的图片                    DocPicture pic = Ole.OlePicture;                    pic.LoadImage(Image.FromFile("Img.png"));                    Ole.LinkPath = @"sample.docx";                }                //如果是嵌入,更改数据即可                byte[] bys = File.ReadAllBytes(@"sample.docx");                if (Ole.LinkType == OleLinkType.Embed)                {                    DocPicture pic = new DocPicture(doc);                    pic.LoadImage(Image.FromFile(@"Img.png"));                    Ole.ObjectType = "Word.Document.12";                    Ole.SetOlePicture(pic);                    Ole.SetNativeData(bys);                }            }        }    }}

步骤 4 :保存文档

//保存修改后的文档,并打开 doc.SaveToFile("修改OLE.docx", Spire.Doc.FileFormat.Docx2010); System.Diagnostics.Process.Start("修改OLE.docx");

调试运行程序后,生成文档。打开文档时,生成的文档中原有的插入OLE的图片和链接的文档都已经更改了,如下所示:

 

全部代码:

using Spire.Doc;using Spire.Doc.Documents;using Spire.Doc.Fields;using System.Drawing;using System.IO;namespace EditOLE_Doc{    class Program    {        static void Main(string[] args)        {            //实例化一个Document对象,加载含有OLE的Word文档            Document doc = new Document();            doc.LoadFromFile("test.docx");            //获取第一个Section            Section sec = doc.Sections[0];            //遍历这个Section中的所有子元素,找到段落下的OLE对象            foreach (DocumentObject obj in sec.Body.ChildObjects)            {                if (obj is Paragraph)                {                    Paragraph par = obj as Paragraph;                    foreach (DocumentObject paraObj in par.ChildObjects)                    {                        //找到OLE对象,根据类型来进行更改操作                        if (paraObj.DocumentObjectType == DocumentObjectType.OleObject)                        {                            DocOleObject Ole = paraObj as DocOleObject;                            //如果是链接, 修改对象的链接路径                            if (Ole.LinkType == OleLinkType.Link)                            {                                //同时还要手动去更改OLE的图片                                DocPicture pic = Ole.OlePicture;                                pic.LoadImage(Image.FromFile("Img.png"));                                Ole.LinkPath = @"sample.docx";                            }                            //如果是嵌入,更改数据即可                            byte[] bys = File.ReadAllBytes(@"sample.docx");                            if (Ole.LinkType == OleLinkType.Embed)                            {                                DocPicture pic = new DocPicture(doc);                                pic.LoadImage(Image.FromFile(@"Img.png"));                                Ole.ObjectType = "Word.Document.12";                                Ole.SetOlePicture(pic);                                Ole.SetNativeData(bys);                            }                        }                    }                }            }            //保存修改后的文档,并打开            doc.SaveToFile("修改OLE.docx", Spire.Doc.FileFormat.Docx2010);            System.Diagnostics.Process.Start("修改OLE.docx");        }    }}
View Code

【示例3】读取Word中的OLE

 步骤 1 :添加using指令

using Spire.Doc;using Spire.Doc.Documents;using Spire.Doc.Fields;using System.IO;

步骤 2 :加载文件

//实例化一个Document对象,加载一个有OLE对象的文档Document doc = new Document();          doc.LoadFromFile(@"test.docx");

步骤 3 :遍历section,读取OLE

//遍历文档所有Section                      foreach (Section sec in doc.Sections)            {                //遍历Section下面所有的子元素                foreach (DocumentObject obj in sec.Body.ChildObjects)                {                    if (obj is Paragraph)                    {                        Paragraph par = obj as Paragraph;                        //遍历这个section下面的段落                        foreach (DocumentObject o in par.ChildObjects)                        {                            //找到OLE对象,并根据类型提取                            if (o.DocumentObjectType == DocumentObjectType.OleObject)                            {                                DocOleObject Ole = o as DocOleObject;                                /*ObjectType属性可以获取ole对象的具体类型。                                注意,如果是用Spire.Doc添加的ole对象的话,需要在AppendOleObject                                的时候先声明OleObjectType,不然这里得不到具体的类型,只会得到Package*/                                string s = Ole.ObjectType;                                //"AcroExch.Document.11"是指PDF对象对应的ProgID                                if (s == "AcroExch.Document.11")                                {                                    File.WriteAllBytes("Result.pdf", Ole.NativeData);                                }                                //"Excel.Sheet.12"是指 Excel03之后的工作表对应的ProgID                                else if (s == "Excel.Sheet.12")                                {                                    File.WriteAllBytes("Result.xlsx", Ole.NativeData);                                }                                //"Word.Document.12"是指03之后的Word对应的ProgID                                else if (s == "Word.Document.12")                                {                                    File.WriteAllBytes("Result.docx", Ole.NativeData);                                }                            }                        }                    }                }            }

调试运行程序,生成文档,如下:

 

全部代码:

using Spire.Doc;using Spire.Doc.Documents;using Spire.Doc.Fields;using System.IO;namespace ReadOLE_Doc{    class Program    {        static void Main(string[] args)        {            //实例化一个Document对象,加载一个有OLE对象的文档            Document doc = new Document();                      doc.LoadFromFile(@"test.docx");            //遍历文档所有Section                      foreach (Section sec in doc.Sections)            {                //遍历Section下面所有的子元素                foreach (DocumentObject obj in sec.Body.ChildObjects)                {                    if (obj is Paragraph)                    {                        Paragraph par = obj as Paragraph;                        //遍历这个section下面的段落                        foreach (DocumentObject o in par.ChildObjects)                        {                            //找到OLE对象,并根据类型提取                            if (o.DocumentObjectType == DocumentObjectType.OleObject)                            {                                DocOleObject Ole = o as DocOleObject;                                /*ObjectType属性可以获取ole对象的具体类型。                                注意,如果是用Spire.Doc添加的ole对象的话,需要在AppendOleObject                                的时候先声明OleObjectType,不然这里得不到具体的类型,只会得到Package*/                                string s = Ole.ObjectType;                                //"AcroExch.Document.11"是指PDF对象对应的ProgID                                if (s == "AcroExch.Document.11")                                {                                    File.WriteAllBytes("Result.pdf", Ole.NativeData);                                }                                //"Excel.Sheet.12"是指 Excel03之后的工作表对应的ProgID                                else if (s == "Excel.Sheet.12")                                {                                    File.WriteAllBytes("Result.xlsx", Ole.NativeData);                                }                                //"Word.Document.12"是指03之后的Word对应的ProgID                                else if (s == "Word.Document.12")                                {                                    File.WriteAllBytes("Result.docx", Ole.NativeData);                                }                            }                        }                    }                }            }        }    }}
View Code

以上是本次关于C# 操作word中的OLE的全部内容。示例方法供参考。

 

本文完。

如需转载,请注明出处!

你可能感兴趣的文章
我的第一篇markdown文档
查看>>
callback
查看>>
利用Guideline实现ConstraintLayout中控件居中
查看>>
【百度地图API】如何使用suggestion--下拉列表方式的搜索建议
查看>>
均匀随机排列数组
查看>>
do_fork()函数流程分析
查看>>
阿里云ECS Centos 7.x Docker安装
查看>>
红黑树
查看>>
比较全面的gdb调试命令
查看>>
acm 网站
查看>>
Linux centos yum安装LAMP环境
查看>>
爬虫到百度贴吧,爬取自己的小说
查看>>
Windows批处理BAT脚本查询PM2.5实时空气质量指数(AQI)
查看>>
excel 函数 vlookup
查看>>
基于keepalived实现LVS高可用以及Web服务高可用
查看>>
1-2-Active Directory 域服务准备概述
查看>>
怎样测试UDP端口
查看>>
Electron实现系统鼠标指针操作
查看>>
常用的查看华为设备运行状况及排错诊断时命令(一)
查看>>
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
查看>>