C# 操作Word 中的OLE——插入、编辑、读取 OLE

概述

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;
 Spire.Doc.Documents;
 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 =  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",OleLinkType.Embed);

步骤 5 :保存文档

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

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

测试结果,如下图所示:

全部代码:

 System.Drawing;

namespace InsertOLE_Doc
{
    class Program
    {
        static void Main(string[] args)
        {
            实例化一个Document类对象
            Document doc =  Document();
             doc.AddSection();
            Paragraph p = sec.AddParagraph();

             DocPicture(doc);
            Image image = Image.FromFile();
            picture.LoadImage(image);

            保存并打开文档
            doc.SaveToFile();
            System.Diagnostics.Process.Start();
        }
    }
}
View Code

 

 

【示例2】编辑Word中的OLE

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

步骤 1 :添加using指令

 System.Drawing;
using System.IO;

步骤 2 :加载文档

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

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

获取第一个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  par.ChildObjects)
        {
            找到OLE对象,根据类型来进行更改操作
            if (paraObj.DocumentObjectType == DocumentObjectType.OleObject)
            {
                DocOleObject Ole = paraObj  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();
                 OleLinkType.Embed)
                {
                    DocPicture pic =  DocPicture(doc);
                    pic.LoadImage(Image.FromFile());
                    Ole.ObjectType = Word.Document.12;
                    Ole.SetOlePicture(pic);
                    Ole.SetNativeData(bys);
                }
            }
        }
    }
}

步骤 4 :保存文档

 保存修改后的文档,并打开
 doc.SaveToFile(修改OLE.docx");

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

 

全部代码:

 System.IO;

 EditOLE_Doc
{
     Document();
            doc.LoadFromFile();

            获取第一个Section
            Section sec = doc.Sections[];

            遍历这个Section中的所有子元素,找到段落下的OLE对象
             sec.Body.ChildObjects)
            {
                 Paragraph)
                {
                    Paragraph par = obj  Paragraph;
                     par.ChildObjects)
                    {
                        找到OLE对象,根据类型来进行更改操作
                         DocumentObjectType.OleObject)
                        {
                            DocOleObject Ole = paraObj  DocOleObject;
                            如果是链接, 修改对象的链接路径
                             OleLinkType.Link)
                            {
                                同时还要手动去更改OLE的图片
                                DocPicture pic = Ole.OlePicture;
                                pic.LoadImage(Image.FromFile());
                                Ole.LinkPath = ;
                            }
                            如果是嵌入,更改数据即可
                            );
                             OleLinkType.Embed)
                            {
                                DocPicture pic =  DocPicture(doc);
                                pic.LoadImage(Image.FromFile());
                                Ole.ObjectType = ;
                                Ole.SetOlePicture(pic);
                                Ole.SetNativeData(bys);
                            }
                        }
                    }
                }
            }
            保存修改后的文档,并打开
            doc.SaveToFile();
        }
    }
}
View Code

【示例3】读取Word中的OLE

 步骤 1 :添加using指令

using System.IO;

步骤 2 :加载文件

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

步骤 3 :遍历section,读取OLE

遍历文档所有Section          
            foreach (Section sec  doc.Sections)
            {
                遍历Section下面所有的子元素
                 sec.Body.ChildObjects)
                {
                     Paragraph)
                    {
                        Paragraph par = obj  Paragraph;
                        遍历这个section下面的段落
                        foreach (DocumentObject o  par.ChildObjects)
                        {
                            找到OLE对象,并根据类型提取
                            if (o.DocumentObjectType == DocumentObjectType.OleObject)
                            {
                                DocOleObject Ole = o  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"Excel.Sheet.12"是指 Excel03之后的工作表对应的ProgID
                                else Excel.Sheet.12Result.xlsx"Word.Document.12"是指03之后的Word对应的ProgID
                                Result.docx

全部代码:

 ReadOLE_Doc
{
    实例化一个Document对象,加载一个有OLE对象的文档
            Document doc =  Document();          
            doc.LoadFromFile(View Code

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

 

本文完。

如需转载,请注明出处!

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...