概述
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
(這裡以上文中生成的文檔為測試檔案)
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");
}
}
}
【示例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);
}
}
}
}
}
}
}
}
}
以上是本次關于C# 操作word中的OLE的全部内容。示例方法供參考。
本文完。
如需轉載,請注明出處!