概述

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");
}
}
}

【示例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[]; //遍历这个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[]; //遍历这个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的全部内容。示例方法供参考。

本文完。

如需转载,请注明出处!

C# 操作Word 中的OLE——插入、编辑、读取 OLE的更多相关文章

  1. 使用 bibtex4word 实现在 office word 中管理并插入参考文献

    使用 bibtex4word 实现在 office word 中管理并插入参考文献, 简单的步骤流程如下: 1. 下载bibtex4word.zip  (无需安装): 下载地址: http://www ...

  2. Word中怎么用MathType编辑公式

    现如今,用电脑办公学习已经是一个不可阻挡的潮流.而与之相应的就是需要在这些办公软件进行相应的使用,最典型的一种就是要在Word编辑公式.其实在Word中编辑公式是一个很常见的事情,虽然它很常见,但是却 ...

  3. 《解决在Word中为汉子插入拼音及音标的问题》

    说明:本人使用的是Word2007版本.以下示例都是基于本人电脑操作.如有疑问,欢迎留言交流. [1]为word中的一些文字添加拼音及音标. [2]开始为文字添加拼音及音标. 选中要添加拼音及音标的文 ...

  4. 怎样将word中的图片插入到CSDN博客中

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  5. Python 读取word中表格数据、读取word修改并保存、替换word中词汇、读取word中每段内容,读取一段话中相同样式内容,理解Document中run

    from docx import Document path = r'D:\pywork\12' # word信息表所在文件夹 w = Document(path + '/' + 'word信息表.d ...

  6. Java 获取Word中的所有插入和删除修订

    在 Word 文档中启用跟踪更改功能后,会记录文档中的所有编辑行为,例如插入.删除.替换和格式更改.对插入或删除的内容,可通过本文中介绍的方法来获取. 引入Jar 方法1 手动引入:将 Free Sp ...

  7. 在word中优雅地插入代码

    PlanetB:带行号 http://www.planetb.ca/syntax-highlight-word   Pygments(推荐):不带行号,多种样式可选 http://pygments.o ...

  8. 如何在word中美观地插入编程代码

    零.缘起 在整理Java笔记时,想把代码直接贴到word文档中,原来一直截图很麻烦,所以找到以下方法. 思想:问题比答案更重要!你能想到问题,才知道去百度搜索. 一.打开网站 http://www.p ...

  9. Aspose.Word 操作word表格的行 插入行 添加行

    rows.insert或rows.add前row必须有单元格cell private void button3_Click(object sender, EventArgs e) {         ...

随机推荐

  1. 详解 vue-cli 的打包配置文件代码(给大家写写注释)

    一.前言 对于webpack基础不好,node指令不通的童鞋.估计对自己搭建Vue.react脚手架是相当头疼的,有种无从下手的感觉.然而,从头看这2块,耗时太长,而且说实话得练才行,不练练手看不明白 ...

  2. CentOS 5.9裸机编译安装搭建LAMP

    Linux系统:CentOS 5.9,查看CentOS版本,命令如下: [root@localhost /]# cat /etc/redhat-release CentOS release 5.9 ( ...

  3. es5中的for in 与es6中的for of的用法与区别

    for in 用与循环遍历对象中的属性键值 for of用于循环遍历出数组中的属性值 for in 也可以遍历数组,但是局限是他会把数组的其他属性键值也会遍历出,例如给数组添加一个属性arr.name ...

  4. MyEclipse 10 报错记录

    1. js文件:右键 >> MyEclipse >> Exclude From Validation 2. Servlet 警告:Window ==> Preferenc ...

  5. Three.js学习笔记02

    1.改变相机的位置,让物体移动 通过下面的代码改变相机的位置: camera.position.x =camera.position.x +1; 将相机不断的沿着x轴移动1个单位,也就是相机向右移动. ...

  6. mantisbt的配置与安装

    下载并安装wampserver; 安装时,提示SMTP服务器时,应正确填写邮箱的SMTP的服务器地址: 安装完成后,登录phpMyAdmin; 给原有的root用户创建密码,所有root用户: 创建一 ...

  7. 【逆元】HDU-1576

    逆元: 同余方程 ax≡1(mod n),gcd(a,n) = 1 时有解,这时称求出的 x 为 a 的对模n的乘法逆元.(注意:如果gcd(a,n)如果不等于1则无解),解法还是利用扩展欧几里得算法 ...

  8. Java设计模式之单例模式,笔记完整到不敢想象

    单例模式: 作用 保证一个类只有一个实例,并且提供一个访问该实例的全局访问入口 单例模式的常用 1.Windows的任务管理器2.Windows的回收站,也是一个单例应用3.项目中的读取配置文件的对象 ...

  9. [Swift]LeetCode1 .两数之和 | Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  10. Storm学习笔记 - Storm初识

    Storm学习笔记 - Storm初识 1. Strom是什么? Storm是一个开源免费的分布式计算框架,可以实时处理大量的数据流. 2. Storm的特点 高性能,低延迟. 分布式:可解决数据量大 ...