概述

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指令

  1. using Spire.Doc;
  2. using Spire.Doc.Documents;
  3. using Spire.Doc.Fields;
  4. using System.Drawing;

步骤 2 :创建文档

  1. //实例化一个Document类对象
  2. Document doc = new Document();
  3. //向文档中添加一个Section对象,并添加段落
  4. Section sec = doc.AddSection();
  5. Paragraph p = sec.AddParagraph();

步骤 3 :加载图片

  1. //实例化一个DocPicture类对象,加载图片
  2. DocPicture picture = new DocPicture(doc);
  3. Image image = Image.FromFile(@"chart1.png");
  4. picture.LoadImage(image);

步骤 4 :插入OLE

  1. //在文档中插入一个工作表, OleLinkType 枚举值控制该OLE是链接还是嵌入
  2. DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Link);
  3. //DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Embed);

步骤 5 :保存文档

  1. //保存并打开文档
  2. doc.SaveToFile("添加OLE.docx");
  3. System.Diagnostics.Process.Start("添加OLE.docx");

完成代码后,调试运行程序,生成文档。

测试结果,如下图所示:

全部代码:

  1. using Spire.Doc;
  2. using Spire.Doc.Documents;
  3. using Spire.Doc.Fields;
  4. using System.Drawing;
  5.  
  6. namespace InsertOLE_Doc
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. //实例化一个Document类对象
  13. Document doc = new Document();
  14. //向文档中添加一个Section对象,并添加段落
  15. Section sec = doc.AddSection();
  16. Paragraph p = sec.AddParagraph();
  17.  
  18. //实例化一个DocPicture类对象,加载图片
  19. DocPicture picture = new DocPicture(doc);
  20. Image image = Image.FromFile(@"chart1.png");
  21. picture.LoadImage(image);
  22.  
  23. //在文档中插入一个工作表, OleLinkType 枚举值控制该OLE是链接还是嵌入
  24. DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Link);
  25. //DocOleObject obj = p.AppendOleObject(@"testfile.xlsx", picture, OleLinkType.Embed);
  26.  
  27. //保存并打开文档
  28. doc.SaveToFile("添加OLE.docx");
  29. System.Diagnostics.Process.Start("添加OLE.docx");
  30. }
  31. }
  32. }

【示例2】编辑Word中的OLE

(这里以上文中生成的文档为测试文件)

步骤 1 :添加using指令

  1. using Spire.Doc;
  2. using Spire.Doc.Documents;
  3. using Spire.Doc.Fields;
  4. using System.Drawing;
  5. using System.IO;

步骤 2 :加载文档

  1. //实例化一个Document对象,加载含有OLE的Word文档
  2. Document doc = new Document();
  3. doc.LoadFromFile("test.docx");

步骤 3 :获取section中的所有OLE,根据需要来更改OLE的类型和链接对象

  1. //获取第一个Section
  2. Section sec = doc.Sections[];
  3.  
  4. //遍历这个Section中的所有子元素,找到段落下的OLE对象
  5. foreach (DocumentObject obj in sec.Body.ChildObjects)
  6. {
  7. if (obj is Paragraph)
  8. {
  9. Paragraph par = obj as Paragraph;
  10. foreach (DocumentObject paraObj in par.ChildObjects)
  11. {
  12. //找到OLE对象,根据类型来进行更改操作
  13. if (paraObj.DocumentObjectType == DocumentObjectType.OleObject)
  14. {
  15. DocOleObject Ole = paraObj as DocOleObject;
  16. //如果是链接, 修改对象的链接路径
  17. if (Ole.LinkType == OleLinkType.Link)
  18. {
  19. //同时还要手动去更改OLE的图片
  20. DocPicture pic = Ole.OlePicture;
  21. pic.LoadImage(Image.FromFile("Img.png"));
  22. Ole.LinkPath = @"sample.docx";
  23. }
  24. //如果是嵌入,更改数据即可
  25. byte[] bys = File.ReadAllBytes(@"sample.docx");
  26. if (Ole.LinkType == OleLinkType.Embed)
  27. {
  28. DocPicture pic = new DocPicture(doc);
  29. pic.LoadImage(Image.FromFile(@"Img.png"));
  30. Ole.ObjectType = "Word.Document.12";
  31. Ole.SetOlePicture(pic);
  32. Ole.SetNativeData(bys);
  33. }
  34. }
  35. }
  36. }
  37. }

步骤 4 :保存文档

  1. //保存修改后的文档,并打开
  2. doc.SaveToFile("修改OLE.docx", Spire.Doc.FileFormat.Docx2010);
  3. System.Diagnostics.Process.Start("修改OLE.docx");

调试运行程序后,生成文档。打开文档时,生成的文档中原有的插入OLE的图片和链接的文档都已经更改了,如下所示:

全部代码:

  1. using Spire.Doc;
  2. using Spire.Doc.Documents;
  3. using Spire.Doc.Fields;
  4. using System.Drawing;
  5. using System.IO;
  6.  
  7. namespace EditOLE_Doc
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. //实例化一个Document对象,加载含有OLE的Word文档
  14. Document doc = new Document();
  15. doc.LoadFromFile("test.docx");
  16.  
  17. //获取第一个Section
  18. Section sec = doc.Sections[];
  19.  
  20. //遍历这个Section中的所有子元素,找到段落下的OLE对象
  21. foreach (DocumentObject obj in sec.Body.ChildObjects)
  22. {
  23. if (obj is Paragraph)
  24. {
  25. Paragraph par = obj as Paragraph;
  26. foreach (DocumentObject paraObj in par.ChildObjects)
  27. {
  28. //找到OLE对象,根据类型来进行更改操作
  29. if (paraObj.DocumentObjectType == DocumentObjectType.OleObject)
  30. {
  31. DocOleObject Ole = paraObj as DocOleObject;
  32. //如果是链接, 修改对象的链接路径
  33. if (Ole.LinkType == OleLinkType.Link)
  34. {
  35. //同时还要手动去更改OLE的图片
  36. DocPicture pic = Ole.OlePicture;
  37. pic.LoadImage(Image.FromFile("Img.png"));
  38. Ole.LinkPath = @"sample.docx";
  39. }
  40. //如果是嵌入,更改数据即可
  41. byte[] bys = File.ReadAllBytes(@"sample.docx");
  42. if (Ole.LinkType == OleLinkType.Embed)
  43. {
  44. DocPicture pic = new DocPicture(doc);
  45. pic.LoadImage(Image.FromFile(@"Img.png"));
  46. Ole.ObjectType = "Word.Document.12";
  47. Ole.SetOlePicture(pic);
  48. Ole.SetNativeData(bys);
  49. }
  50. }
  51. }
  52. }
  53. }
  54. //保存修改后的文档,并打开
  55. doc.SaveToFile("修改OLE.docx", Spire.Doc.FileFormat.Docx2010);
  56. System.Diagnostics.Process.Start("修改OLE.docx");
  57. }
  58. }
  59. }

【示例3】读取Word中的OLE

步骤 1 :添加using指令

  1. using Spire.Doc;
  2. using Spire.Doc.Documents;
  3. using Spire.Doc.Fields;
  4. using System.IO;

步骤 2 :加载文件

  1. //实例化一个Document对象,加载一个有OLE对象的文档
  2. Document doc = new Document();
  3. doc.LoadFromFile(@"test.docx");

步骤 3 :遍历section,读取OLE

  1. //遍历文档所有Section
  2. foreach (Section sec in doc.Sections)
  3. {
  4. //遍历Section下面所有的子元素
  5. foreach (DocumentObject obj in sec.Body.ChildObjects)
  6. {
  7. if (obj is Paragraph)
  8. {
  9. Paragraph par = obj as Paragraph;
  10. //遍历这个section下面的段落
  11. foreach (DocumentObject o in par.ChildObjects)
  12. {
  13. //找到OLE对象,并根据类型提取
  14. if (o.DocumentObjectType == DocumentObjectType.OleObject)
  15. {
  16. DocOleObject Ole = o as DocOleObject;
  17. /*ObjectType属性可以获取ole对象的具体类型。
  18. 注意,如果是用Spire.Doc添加的ole对象的话,需要在AppendOleObject
  19. 的时候先声明OleObjectType,不然这里得不到具体的类型,只会得到Package*/
  20. string s = Ole.ObjectType;
  21. //"AcroExch.Document.11"是指PDF对象对应的ProgID
  22. if (s == "AcroExch.Document.11")
  23. {
  24. File.WriteAllBytes("Result.pdf", Ole.NativeData);
  25. }
  26. //"Excel.Sheet.12"是指 Excel03之后的工作表对应的ProgID
  27. else if (s == "Excel.Sheet.12")
  28. {
  29. File.WriteAllBytes("Result.xlsx", Ole.NativeData);
  30. }
  31. //"Word.Document.12"是指03之后的Word对应的ProgID
  32. else if (s == "Word.Document.12")
  33. {
  34. File.WriteAllBytes("Result.docx", Ole.NativeData);
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }

调试运行程序,生成文档,如下:

全部代码:

  1. using Spire.Doc;
  2. using Spire.Doc.Documents;
  3. using Spire.Doc.Fields;
  4. using System.IO;
  5.  
  6. namespace ReadOLE_Doc
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. //实例化一个Document对象,加载一个有OLE对象的文档
  13. Document doc = new Document();
  14. doc.LoadFromFile(@"test.docx");
  15.  
  16. //遍历文档所有Section
  17. foreach (Section sec in doc.Sections)
  18. {
  19. //遍历Section下面所有的子元素
  20. foreach (DocumentObject obj in sec.Body.ChildObjects)
  21. {
  22. if (obj is Paragraph)
  23. {
  24. Paragraph par = obj as Paragraph;
  25. //遍历这个section下面的段落
  26. foreach (DocumentObject o in par.ChildObjects)
  27. {
  28. //找到OLE对象,并根据类型提取
  29. if (o.DocumentObjectType == DocumentObjectType.OleObject)
  30. {
  31. DocOleObject Ole = o as DocOleObject;
  32. /*ObjectType属性可以获取ole对象的具体类型。
  33. 注意,如果是用Spire.Doc添加的ole对象的话,需要在AppendOleObject
  34. 的时候先声明OleObjectType,不然这里得不到具体的类型,只会得到Package*/
  35. string s = Ole.ObjectType;
  36. //"AcroExch.Document.11"是指PDF对象对应的ProgID
  37. if (s == "AcroExch.Document.11")
  38. {
  39. File.WriteAllBytes("Result.pdf", Ole.NativeData);
  40. }
  41. //"Excel.Sheet.12"是指 Excel03之后的工作表对应的ProgID
  42. else if (s == "Excel.Sheet.12")
  43. {
  44. File.WriteAllBytes("Result.xlsx", Ole.NativeData);
  45. }
  46. //"Word.Document.12"是指03之后的Word对应的ProgID
  47. else if (s == "Word.Document.12")
  48. {
  49. File.WriteAllBytes("Result.docx", Ole.NativeData);
  50. }
  51. }
  52. }
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }

以上是本次关于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. Excel大批量数据导出

    package com.tebon.ams.util; import lombok.extern.slf4j.Slf4j;import org.apache.poi.openxml4j.excepti ...

  2. python语法_模块_os_sys

    os模块:提供对此操作系统进行操作的接口 os.getcwd() 获取python运行的工作目录. os.chdir(r'C:\USERs') 修改当前工作目录. os.curdir 返回当前目录 ( ...

  3. Java作业七(2017-10-30)

    /*造人*/ public class Tman { public int id; public String name; public int age; public String city; pu ...

  4. Python科学计算基础包-Numpy

    一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能: 快速高效的多维数组对象ndarray. 用于对数组执行元素级计算以及直接对数 ...

  5. 多媒体文件格式(二):FLV 格式

    在网络的直播与点播场景中,FLV也是一种常见的格式,FLV是Adobe发布的一种可以作为直播也可以作为点播的封装格式,其封装格式非常简单,均以FLVTAG的形式存在,并且每一个TAG都是独立存在的,接 ...

  6. [Swift]LeetCode227. 基本计算器 II | Basic Calculator II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  7. [Swift]LeetCode743. 网络延迟时间 | Network Delay Time

    There are N network nodes, labelled 1 to N. Given times, a list of travel times as directededges tim ...

  8. [Swift]LeetCode842. 将数组拆分成斐波那契序列 | Split Array into Fibonacci Sequence

    Given a string S of digits, such as S = "123456579", we can split it into a Fibonacci-like ...

  9. Data - Tools

    数据工具汇总 史上最全的大数据分析和制作工具 全球100款大数据工具汇总 SQL 数据分析常用语句 01 - NumPy HomePage:http://www.numpy.org/ NumPy(数值 ...

  10. Go语言的一些使用心得

    序 起初一直使用的Python,到了18年下半年由于业务需求而接触了Golang,从开始学习到现在的快半年里,也用Golang写了些代码,公司产品和业余写的都有,今天就写点Golang相关的总结或者感 ...