Aspose.Words 实现在word文档中插入附件功能 使用InsertOleObject插入流对象 结果文档始终是一张图片 这个问题怎么解决?

Aspose.Words,实现在word文档中插入附件功能,使用InsertOleObject插入流对象,结果文档始终是一张图片,这个问题怎么解决?
1697208908159.png (786 字节)
1697208925759.png (14.0 KB)

@jumy, 请参考我们的文档:

如果您在我们的文档中找不到所需的信息,您可以附上显示预期结果的 Word 文档吗?

我希望像下面红框一样生成附件:
1697211952721.png (26.9 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)

@jumy, 你看到的就是预期的结果。 您似乎使用WPS Office,并且它使用不同的progID。 您可以共享包含嵌入文档的示例文档吗? 我将检查它使用的 progID。

嗯,我是使用的是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有哪些值?可以从哪查询到吗?

@jumy, 您可以从这篇 Microsoft 文章以及我们论坛的搜索结果中找到更多 progID:

你好,基于Aspose.Words.dll 23.9.0.0版本,使用ProgId为PowerPoint.Application或者PowerPoint.Application.15,为WORD文档嵌入ppt附件,基于微软WORD工具打开文档,双击附件时都报嵌入对象已损坏错误,请问这个怎么解决?

@jumy 您能否在此处附上您输入的 PowerPoint 文件以及用于将其插入 MS 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");