public void Apply(OleObject ole) { _writer.WriteStartElement("o", "OLEObject", OpenXmlNamespaces.Office); EmbeddedObjectPart.ObjectType type; if (ole.ClipboardFormat == "Biff8") { type = EmbeddedObjectPart.ObjectType.Excel; } else if (ole.ClipboardFormat == "MSWordDoc") { type = EmbeddedObjectPart.ObjectType.Word; } else if (ole.ClipboardFormat == "MSPresentation") { type = EmbeddedObjectPart.ObjectType.Powerpoint; } else { type = EmbeddedObjectPart.ObjectType.Other; } //type if (ole.fLinked) { Uri link = new Uri(ole.Link); ExternalRelationship rel = _targetPart.AddExternalRelationship(OpenXmlRelationshipTypes.OleObject, link); _writer.WriteAttributeString("r", "id", OpenXmlNamespaces.Relationships, rel.Id); _writer.WriteAttributeString("Type", "Link"); _writer.WriteAttributeString("UpdateMode", ole.UpdateMode.ToString()); } else { EmbeddedObjectPart part = _targetPart.AddEmbeddedObjectPart(type); _writer.WriteAttributeString("r", "id", OpenXmlNamespaces.Relationships, part.RelIdToString); _writer.WriteAttributeString("Type", "Embed"); //copy the object copyEmbeddedObject(ole, part); } //ProgID _writer.WriteAttributeString("ProgID", ole.Program); //ShapeId _writer.WriteAttributeString("ShapeID", _pict.ShapeContainer.GetHashCode().ToString()); //DrawAspect _writer.WriteAttributeString("DrawAspect", "Content"); //ObjectID _writer.WriteAttributeString("ObjectID", ole.ObjectId); _writer.WriteEndElement(); }
/// <summary> /// Appends an Embedded Object into the specified Main Document /// </summary> /// <param name="mainDocumentPart">The MainDocument Part of your OpenXml Word Doc</param> /// <param name="fileInfo">The FileInfo object associated with the file being embedded</param> /// <param name="displayAsIcon">Whether or not to display the embedded file as an Icon (Otherwise it will display a snapshot of the file)</param> public static void AppendEmbeddedObject(MainDocumentPart mainDocumentPart, FileInfo fileInfo, bool displayAsIcon) { OpenXmlEmbeddedObject openXmlEmbeddedObject = new OpenXmlEmbeddedObject(fileInfo, displayAsIcon); if (!String.IsNullOrEmpty(openXmlEmbeddedObject.OleObjectBinaryData)) { using (Stream dataStream = new MemoryStream(Convert.FromBase64String(openXmlEmbeddedObject.OleObjectBinaryData))) { if (!String.IsNullOrEmpty(openXmlEmbeddedObject.OleImageBinaryData)) { using (Stream emfStream = new MemoryStream(Convert.FromBase64String(openXmlEmbeddedObject.OleImageBinaryData))) { string imagePartId = OpenXmlWordHelper.GetUniqueXmlItemID(); ImagePart imagePart = mainDocumentPart.AddImagePart(ImagePartType.Emf, imagePartId); if (emfStream != null) { imagePart.FeedData(emfStream); } string embeddedPackagePartId = OpenXmlWordHelper.GetUniqueXmlItemID(); if (dataStream != null) { if (openXmlEmbeddedObject.ObjectIsOfficeDocument) { EmbeddedPackagePart embeddedObjectPart = mainDocumentPart.AddNewPart <EmbeddedPackagePart>( openXmlEmbeddedObject.FileContentType, embeddedPackagePartId); embeddedObjectPart.FeedData(dataStream); } else { EmbeddedObjectPart embeddedObjectPart = mainDocumentPart.AddNewPart <EmbeddedObjectPart>( openXmlEmbeddedObject.FileContentType, embeddedPackagePartId); embeddedObjectPart.FeedData(dataStream); } } if (!displayAsIcon && !openXmlEmbeddedObject.ObjectIsPicture) { Paragraph attachmentHeader = OpenXmlWordHelper.CreateParagraph(JustificationValues.Left, OpenXmlWordHelper.ParagraphSpacing.AfterMedium, null, true, false, String.Format("Attachment: {0} (Double-Click to Open)", fileInfo.Name)); mainDocumentPart.Document.Body.Append(attachmentHeader); } Paragraph embeddedObjectParagraph = GetEmbeededObjectParagraph(openXmlEmbeddedObject.FileType, imagePartId, openXmlEmbeddedObject.OleImageStyle, embeddedPackagePartId); mainDocumentPart.Document.Body.Append(embeddedObjectParagraph); } } } } }
/// <summary> /// Writes the embedded OLE object from the ObjectPool of the binary file to the OpenXml Package. /// </summary> /// <param name="ole"></param> private void copyEmbeddedObject(OleObject ole, EmbeddedObjectPart part) { //create a new storage StructuredStorageWriter writer = new StructuredStorageWriter(); // Word will not open embedded charts if a CLSID is set. if (ole.Program.StartsWith("Excel.Chart") == false) { writer.RootDirectoryEntry.setClsId(ole.ClassId); } //copy the OLE streams from the old storage to the new storage foreach (string oleStream in ole.Streams.Keys) { writer.RootDirectoryEntry.AddStreamDirectoryEntry(oleStream, ole.Streams[oleStream]); } //write the storage to the xml part writer.write(part.GetStream()); }
private static void ExtractFile(EmbeddedObjectPart part, string destinationFolderPath) { // Determine the file name and destination path of the binary, // structured storage file. string binaryFileName = Path.GetFileName(part.Uri.ToString()); string binaryFilePath = Path.Combine(destinationFolderPath, binaryFileName); // Ensure the destination directory exists. Directory.CreateDirectory(destinationFolderPath); // Copy part contents to structured storage file. using (Stream partStream = part.GetStream()) using (FileStream fileStream = File.Create(binaryFilePath)) { partStream.CopyTo(fileStream); } // Extract the embedded file from the structured storage file. Ole10Native.ExtractFile(binaryFilePath, destinationFolderPath); // Remove the structured storage file. File.Delete(binaryFilePath); }