C# 操作Word 中的OLE——插入、编辑、读取 OLE
概述
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的更多相关文章
- 使用 bibtex4word 实现在 office word 中管理并插入参考文献
使用 bibtex4word 实现在 office word 中管理并插入参考文献, 简单的步骤流程如下: 1. 下载bibtex4word.zip (无需安装): 下载地址: http://www ...
- Word中怎么用MathType编辑公式
现如今,用电脑办公学习已经是一个不可阻挡的潮流.而与之相应的就是需要在这些办公软件进行相应的使用,最典型的一种就是要在Word编辑公式.其实在Word中编辑公式是一个很常见的事情,虽然它很常见,但是却 ...
- 《解决在Word中为汉子插入拼音及音标的问题》
说明:本人使用的是Word2007版本.以下示例都是基于本人电脑操作.如有疑问,欢迎留言交流. [1]为word中的一些文字添加拼音及音标. [2]开始为文字添加拼音及音标. 选中要添加拼音及音标的文 ...
- 怎样将word中的图片插入到CSDN博客中
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- Python 读取word中表格数据、读取word修改并保存、替换word中词汇、读取word中每段内容,读取一段话中相同样式内容,理解Document中run
from docx import Document path = r'D:\pywork\12' # word信息表所在文件夹 w = Document(path + '/' + 'word信息表.d ...
- Java 获取Word中的所有插入和删除修订
在 Word 文档中启用跟踪更改功能后,会记录文档中的所有编辑行为,例如插入.删除.替换和格式更改.对插入或删除的内容,可通过本文中介绍的方法来获取. 引入Jar 方法1 手动引入:将 Free Sp ...
- 在word中优雅地插入代码
PlanetB:带行号 http://www.planetb.ca/syntax-highlight-word Pygments(推荐):不带行号,多种样式可选 http://pygments.o ...
- 如何在word中美观地插入编程代码
零.缘起 在整理Java笔记时,想把代码直接贴到word文档中,原来一直截图很麻烦,所以找到以下方法. 思想:问题比答案更重要!你能想到问题,才知道去百度搜索. 一.打开网站 http://www.p ...
- Aspose.Word 操作word表格的行 插入行 添加行
rows.insert或rows.add前row必须有单元格cell private void button3_Click(object sender, EventArgs e) { ...
随机推荐
- Excel大批量数据导出
package com.tebon.ams.util; import lombok.extern.slf4j.Slf4j;import org.apache.poi.openxml4j.excepti ...
- python语法_模块_os_sys
os模块:提供对此操作系统进行操作的接口 os.getcwd() 获取python运行的工作目录. os.chdir(r'C:\USERs') 修改当前工作目录. os.curdir 返回当前目录 ( ...
- Java作业七(2017-10-30)
/*造人*/ public class Tman { public int id; public String name; public int age; public String city; pu ...
- Python科学计算基础包-Numpy
一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能: 快速高效的多维数组对象ndarray. 用于对数组执行元素级计算以及直接对数 ...
- 多媒体文件格式(二):FLV 格式
在网络的直播与点播场景中,FLV也是一种常见的格式,FLV是Adobe发布的一种可以作为直播也可以作为点播的封装格式,其封装格式非常简单,均以FLVTAG的形式存在,并且每一个TAG都是独立存在的,接 ...
- [Swift]LeetCode227. 基本计算器 II | Basic Calculator II
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- [Swift]LeetCode743. 网络延迟时间 | Network Delay Time
There are N network nodes, labelled 1 to N. Given times, a list of travel times as directededges tim ...
- [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 ...
- Data - Tools
数据工具汇总 史上最全的大数据分析和制作工具 全球100款大数据工具汇总 SQL 数据分析常用语句 01 - NumPy HomePage:http://www.numpy.org/ NumPy(数值 ...
- Go语言的一些使用心得
序 起初一直使用的Python,到了18年下半年由于业务需求而接触了Golang,从开始学习到现在的快半年里,也用Golang写了些代码,公司产品和业余写的都有,今天就写点Golang相关的总结或者感 ...