ole(object linking and embedding,对象连接与嵌入)是一种面向对象的技术。ole分为两种形式,一种是嵌入,一种是链接。前者是将对象嵌入到文档中,不管外部对象怎么更改都是以嵌入操作当时的对象为准,之后不再改变。而后者是以链接形式来保存对象的,外部任何对该对象的更改都会影响文档。spire.doc支持word中的ole操作,包括添加,修改和提取ole对象,本文将对此做详细介绍。
添加ole
c#
//实例化一个document对象
document doc = new document();
//向文档中添加一个section对象
section sec = doc.addsection();
//在这个section上添加一个段落
paragraph p = sec.addparagraph();
//实例化一个docpicture对象
docpicture picture = new docpicture(doc);
//目前我们还没有实现自动扫描成图标的功能, 只能手动用图片去设置图标
//事实上,我们每个产品都支持将文档保存成图片,可以巧妙地加以利用。
//这里我加载的图片是通过spire.xls 的savetoimage方法得到的。
image image = image.fromfile(@"c:\users\administrator\desktop\ole.png");
picture.loadimage(image);
//在文档中插入一个工作表, olelinktype 枚举值控制该ole是链接还是嵌入
docoleobject obj = p.appendoleobject(@"jane.xlsx", picture, olelinktype.link);
//docoleobject obj = p.appendoleobject(@"jane.xlsx", picture, olelinktype.embed);
//保存文档
doc.savetofile("添加ole.docx");
vb.net
'实例化一个document对象
dim doc as new document()
'向文档中添加一个section对象
dim sec as section = doc.addsection()
'在这个section上添加一个段落
dim p as paragraph = sec.addparagraph()
'实例化一个docpicture对象
dim picture as new docpicture(doc)
'目前我们还没有实现自动扫描成图标的功能, 只能手动用图片去设置图标
'事实上,我们每个产品都支持将文档保存成图片,可以巧妙地加以利用。
'这里我加载的图片是通过spire.xls 的savetoimage方法得到的。
dim image as image = image.fromfile("c:\users\administrator\desktop\ole.png")
picture.loadimage(image)
'在文档中插入一个工作表, olelinktype 枚举值控制该ole是链接还是嵌入
dim obj as docoleobject = p.appendoleobject("jane.xlsx", picture, olelinktype.link)
'docoleobject obj = p.appendoleobject(@"jane.xlsx", picture, olelinktype.embed)
'保存文档
doc.savetofile("添加ole.docx")
向文档中顺利添加了一个excel工作表:
修改ole
c#
//实例化一个document对象
document doc = new document();
//加载一个有ole对象的文档
doc.loadfromfile(@"添加ole.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(@"wordole.png"));
ole.linkpath = @"替换的word文档.docx";
}
//如果是嵌入,更改数据即可
byte[] bys = file.readallbytes(@"替换的word文档.docx");
if (ole.linktype == olelinktype.embed)
{
docpicture pic = new docpicture(doc);
pic.loadimage(image.fromfile(@"wordole.png"));
ole.objecttype = "word.document.12";
ole.setolepicture(pic);
ole.setnativedata(bys);
}
}
}
}
}
doc.savetofile("修改ole.docx", spire.doc.fileformat.docx2013);
vb.net
'实例化一个document对象
dim doc as new document()
'加载一个有ole对象的文档
doc.loadfromfile("添加ole.docx")
'获取第一个section
dim sec as section = doc.sections(0)
'遍历这个section中的所有子元素,找到段落下的ole对象
for each obj as documentobject in sec.body.childobjects
if typeof obj is paragraph then
dim par as paragraph = trycast(obj, paragraph)
for each paraobj as documentobject in par.childobjects
'找到ole对象,根据类型来进行更改操作
if paraobj.documentobjecttype = documentobjecttype.oleobject then
dim ole as docoleobject = trycast(paraobj, docoleobject)
'如果是链接, 修改对象的链接路径
if ole.linktype = olelinktype.link then
'同时还要手动去更改ole的图片
dim pic as docpicture = ole.olepicture
pic.loadimage(image.fromfile("wordole.png"))
ole.linkpath = "替换的word文档.docx"
end if
'如果是嵌入,更改数据即可
dim bys as byte() = file.readallbytes("替换的word文档.docx")
if ole.linktype = olelinktype.embed then
dim pic as new docpicture(doc)
pic.loadimage(image.fromfile("wordole.png"))
ole.objecttype = "word.document.12"
ole.setolepicture(pic)
ole.setnativedata(bys)
end if
end if
next
end if
next
doc.savetofile("修改ole.docx", spire.doc.fileformat.docx2013)
将原来文档中的excel工作表替换成了word文档:
提取ole
c#
//实例化一个document对象
document doc = new document();
//加载一个有ole对象的文档
doc.loadfromfile(@"添加ole.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);
}
}
}
}
}
}
vb.net
'实例化一个document对象
dim doc as new document()
'加载一个有ole对象的文档
doc.loadfromfile("添加ole.docx ")
'遍历文档所有section
for each sec as section in doc.sections
'遍历section下面所有的子元素
for each obj as documentobject in sec.body.childobjects
if typeof obj is paragraph then
dim par as paragraph = trycast(obj, paragraph)
'遍历这个section下面的段落
for each o as documentobject in par.childobjects
'找到ole对象,并根据类型提取
if o.documentobjecttype = documentobjecttype.oleobject then
dim ole as docoleobject = trycast(o, docoleobject)
'objecttype属性可以获取ole对象的具体类型。
'注意,如果是用spire.doc添加的ole对象的话,需要在appendoleobject
'的时候先声明oleobjecttype,不然这里得不到具体的类型,只会得到package
dim s as string = ole.objecttype
'"acroexch.document.11"是指pdf对象对应的progid
if s = "acroexch.document.11" then
file.writeallbytes("result.pdf", ole.nativedata)
'"excel.sheet.12"是指 excel03之后的工作表对应的progid
elseif s = "excel.sheet.12" then
file.writeallbytes("result.xlsx", ole.nativedata)
'"word.document.12"是指03之后的word对应的progid
elseif s = "word.document.12" then
file.writeallbytes("result.docx", ole.nativedata)
end if
end if
next
end if
next
next
提取出来的excel工作表如下: