Aspose.Words,实现在word文档中插入附件功能,使用InsertOleObject插入流对象,结果文档始终是一张图片,这个问题怎么解决?
1697208908159.png (786 字节)
1697208925759.png (14.0 KB)
@jumy, 您需要为附件指定正确的 progID 参数。 对于 Word 文档, progID 是 Word.Document.12 。 对于 Excel 文档,progID 为 Excel.Sheet.12 .
例如:
Document doc = new Document();
DocumentBuilder b = new DocumentBuilder(doc);
b.insertOleObject("embedded.docx", "Word.Document.12", false, true, null);
doc.save("out.docx");
我参考你的方式处理的,但是生成的文档中,附件只是一张图片。
代码:
1697342151853.png (1.1 KB)
生成效果(双击那个附件只是一张图片):
1697342189670.png (3.5 KB)
嗯,我是使用的是WPS Office。我现在做的事情是根据文档模板(wps类型doc文档),生成目标文档,目标文档中需要嵌入文档(也是wps类型doc文档)。这个嵌入的文档来自于数据库(先前通过FileStream读取文件并转为字节数组通过Base64编码存储到数据库中),我会先读取出来并包装为流再嵌入到模板中。因为无法达到预期效果,所以上次答复你选择了你所指明的方式作测试的,也是无法达到效果的。示例代码如下:
FileStream filestream = new FileStream(“附件.doc”, FileMode.Create);
filestream.Write(byOfficeData, 0, (int)byOfficeData.Length); //byOfficeData为数据库中查询出来的,这一步是能够在运行目录下生成“附件.doc”文件的,您做测试的时候也可以直接读本地文件
m_documentbuilderDestination.MoveToDocumentEnd();
m_documentbuilderDestination.InsertOleObject(filestream, “Word.Document.12”, true, null);
@jumy , 如果我理解正确的话,主要问题是嵌入文档显示的图标不是 WPS Office 的图标。 Aspose.Words 将 Microsoft Word 文档的图标存储为资源,但 Aspose.Words 不存储 WPS Office 的图标。 因此,当将 Word.Document.12 指定为 prodID 时,Aspose.Words 使用 Microsoft Word 文档的图标。
WPS Office 还使用 Word.Document.12 作为嵌入 DOC 文档的 progID,但 WPS Office 使用另一个图标。
您可以自己为WPS Office创建图标,然后在InsertOleObjectAsIcon方法中指定它。 例如,我手动从您的图像中剪切图标并将其转换为ICO文件。 之后运行下面的代码会产生以下结果:
Document doc = new Document();
DocumentBuilder b = new DocumentBuilder(doc);
String filename = "embedded.docx";
FileStream embeddedDocumentStream = File.OpenRead(filename);
String oleObjectCaption = filename;
b.InsertOleObjectAsIcon(embeddedDocumentStream, "Word.Document.12", "WpsDocumentIcon.ico", oleObjectCaption);
doc.Save(@"out.docx");
files.zip (28.7 KB)
我使用的是Aspose.Words 19.6.0.0版本类集,关于插入流的接口只有一个,且没有InsertOleObjectAsIcon相关接口:
public Shape InsertOleObject (Stream stream, string progId, bool asIcon, Image presentation);
我代码与你代码差异就只剩InsertOleObjectAsIcon调用这一行了,我是这么调用的(但是目标文档中仍然是一张图片):
Image image = Image.FromFile(“WpsDocumentIcon.ico”);
m_documentbuilderDestination.InsertOleObject(filestream, “Word.Document.12”, true, image);
@jumy , 使用 19.6 和下面所示的代码,可以生成具有 WPS Office 图标的文档,但您无法指定附加文档的标题。
String filename = "embedded.docx";
FileStream embeddedDocumentStream = File.OpenRead(filename);
Document doc = new Document();
DocumentBuilder b = new DocumentBuilder(doc);
Image image = Image.FromFile("WpsDocumentIcon.ico");
b.InsertOleObject(embeddedDocumentStream, "Word.Document.12", true, image);
doc.Save(@"out.19.6.docx");
out.19.6.docx (17.0 KB)
我之前的示例是在 Aspose.Words for .NET 23.9 上运行的。 所以如果你需要这样的结果,你需要升级到这个版本。
嗯,我换成微软的WORD文档工具进行测试,是能够生成附件文档的,且我这个版本确实不能生成附件文档的标题。目前大环境下很多企业都会用WPS,Aspose.Words不支持WPS文档生成附件吗?还是说我们用法有问题?WPS文档进行测试且用WPS工具打开结果文档,附件文档显示是一张图片,双击也是图片的效果,并不能打开附件文档。
我换成23.9版本后,用WPS工具打开结果文档,也能打开里面的附件文档,应该还是旧类集可能功能上不支持。非常感谢您!!!
另外可否问下,ProgId有哪些值?可以从哪查询到吗?
你好,基于Aspose.Words.dll 23.9.0.0版本,使用ProgId为PowerPoint.Application或者PowerPoint.Application.15,为WORD文档嵌入ppt附件,基于微软WORD工具打开文档,双击附件时都报嵌入对象已损坏错误,请问这个怎么解决?
测试代码:
Aspose.Words.Document doc = new Aspose.Words.Document();
Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);
System.IO.FileStream fs = System.IO.File.OpenRead("test.pptx");
builder.InsertOleObjectAsIcon(fs,"PowerPoint.Application.15","PowerPoint.ico","embedded.pptx");
fs.Close();
doc.Save(@"out.docx");
这是用的图片和文档:
Demo.zip (2.3 KB)
@jumy 出现此问题的原因是“test.pptx”是一个空的零字节文件。 请尝试使用有效的 PPTX 演示文稿和 PowerPoint.Show.12
ProgId:
builder.InsertOleObjectAsIcon(fs, "PowerPoint.Show.12", @"C:\Temp\PowerPoint.ico", "embedded.pptx");