相关文章推荐
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

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

  • 插入OLE到Word
  • 编辑Word中的OLE
  • 读取Word中的OLE
  • Spire.Doc for .NET

    :下载安装该类库,在编辑代码时,注意在程序中添加引用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的类型和链接对象

    //获取第一个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);
    

    步骤 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的全部内容。示例方法供参考。

    如需转载,请注明出处!

    在前面的文章C# 如何插入、修改、删除Word批注一文中介绍了如何操作Word批注的一些方法,在本篇文章中继续介绍操作Word批注的方法。分以下三种情况来介绍: 1. 插入图片到Word批注 2. 读取Word批注 eiceblue C# /VB.NET操作Word批注(一)—— 插入、修改、删除Word批注
    批注内容可以是对某段文字或内容的注释,也可以是对文段中心思想的概括提要,或者是对文章内容的评判、疑问,以及在阅读时给自己或他人起到提示作用。本篇文章中将介绍如何在C#中操作Word批注,主要包含以下要点: 插入Word批注 修改Word批注 删除Word批注 使用工具:Free Spire.
    eiceblue
  •  
    推荐文章