概述 OLE,Object Linking and Embedding,即對象連接與嵌入。我們在設計程式時,OLE可以用來創建複合文檔,把文字、聲音、圖像、表格、應用程式等類型的信息組合在一起,在Word中,我們可以通過OLE來實現以上要素信息的組合。下麵的示例中將介紹如何通過C# 來操作Word中 ...
概述
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的類型和鏈接對象
//獲取第一個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的全部內容。示例方法供參考。
本文完。
如需轉載,請註明出處!