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[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"); } } }
【示例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的全部内容。示例方法供参考。
本文完。
如需转载,请注明出处!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
数据科学领域,你该选 Python 还是 R ?
为了那些希望知道在数据科学方面选择 Python 还是 R 编程语言的人,我发布了这篇指导文章。你可能在数据科学方面是个新手,或者你需要在一个项目中选出一个语言,这篇文章可能会帮助到你。 非免责声明:在最大的数据科学家雇主之一(Deloitte)中,我是一个数据科学家的管理者。我也对 R 和 Python 有几十年的了解。我是个语言不可知论者,但是参与到 Python 社区已经有15年左右了。 还会有第三种选择 Hadley Wickham, RStudio 的首席数据科学家,已经给出了答复“使用‘and’替代‘vs’”。由此,同时使用Python/R 是我将提到的第三种选择。这个选项引起了我的好奇心,而且我会在本文末尾介绍这一点。 如何比较 R 和 Python 下面是这两种语言之间一些值得比较的因素,这并不是一个完全的列表。 历史:R 和 Python 具有明显不同的历史,有时候会交叉。社区:通过实际调查发现的很多复杂的社会人类学因素。性能:详尽的比较以及为什么比较起来这么难。第三方支持:模块,代码库,可视化,存储库,组织和开发环境。用例:有些任务和工作类型适合其中一种或者另一种。...
- 下一篇
蚂蚁金服的一次面试经历(一面、二面)
一次有把握的面试,需要经过长时间的准备 电话一面 1、自我介绍、自己做的项目和技术领域 2、项目中的监控:那个监控指标常见的有哪些? 3、微服务涉及到的技术以及需要注意的问题有哪些? 4、注册中心你了解了哪些? 5、consul 的可靠性你了解吗? 6、consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过? 7、项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理 8、Spring Boot除了自动配置,相比传统的 Spring 有什么其他的区别? 9、Spring Cloud 有了解多少? 10、Spring Bean 的生命周期 11、HashMap 和 hashTable 区别? 12、Object 的 hashcode 方法重写了,equals 方法要不要改? 13、Hashmap 线程不安全的出现场景 14、线上服务 CPU 很高该怎么做?有哪些措施可以找到问题 15、JDK 中有哪几个线程池?顺带把线程池讲了个遍 16、SQL 优化的常见方法有哪些 17、SQL 索引的顺序,字段的顺序 18、查看 SQL 是不是使用了索...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路