C# 操做Word 中的OLE——插入、編輯、讀取 OLE

概述

OLE,Object Linking and Embedding,即對象鏈接與嵌入。咱們在設計程序時,OLE能夠用來建立複合文檔,把文字、聲音、圖像、表格、應用程序等類型的信息組合在一塊兒,在Word中,咱們能夠經過OLE來實現以上要素信息的組合。下面的示例中將介紹如何經過C# 來操做Word中的OLE,示例內容包含如下要點:html

  • 插入OLE到Word
  • 編輯Word中的OLE
  • 讀取Word中的OLE

 

使用工具

:下載安裝該類庫,在編輯代碼時,注意在程序中添加引用Spire.Doc.dll(dll文件可在安裝路徑下的Bin文件夾中獲取)ide

示例代碼(供參考)

【示例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 :加載圖片spa

//實例化一個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");

完成代碼後,調試運行程序,生成文檔。code

測試結果,以下圖所示:orm

所有代碼:htm

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的所有內容。示例方法供參考。

 

本文完。

如需轉載,請註明出處!