本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
OLE,Object Linking and Embedding,即对象连接与嵌入。我们在设计程序时,OLE可以用来创建复合文档,把文字、声音、图像、表格、应用程序等类型的信息组合在一起,在Word中,我们可以通过OLE来实现以上要素信息的组合。下面的示例中将介绍如何通过C# 来操作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