public Drawing BuildDrawing(WorksheetPart worksheetPart, List <ExcelImage> excelImages) { var drawingsPart = worksheetPart.AddNewPart <DrawingsPart>(); var worksheetDrawing = new WorksheetDrawing(); var oneCellAnchors = new List <OneCellAnchor>(); foreach (var excelImage in excelImages) { var imagePart = drawingsPart.AddImagePart(excelImage.Type); using (var stream = new MemoryStream(excelImage.ImageBytes)) { imagePart.FeedData(stream); } long extentsCx, extentsCy; using (var stream = new MemoryStream(excelImage.ImageBytes)) { var bm = new Bitmap(stream); extentsCx = (long)bm.Width * (long)((float)914400 / bm.HorizontalResolution); extentsCy = (long)bm.Height * (long)((float)914400 / bm.VerticalResolution); bm.Dispose(); } const int colOffset = 0; const int rowOffset = 0; var nvps = worksheetDrawing.Descendants <NonVisualDrawingProperties>(); var nvpId = nvps.Any() ? (UInt32Value)worksheetDrawing.Descendants <NonVisualDrawingProperties>().Max(p => p.Id.Value) + 1 : 1U; var oneCellAnchor = new OneCellAnchor( new DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker { ColumnId = new ColumnId((excelImage.ColNumber - 1).ToString()), RowId = new RowId((excelImage.RowNumber - 1).ToString()), ColumnOffset = new ColumnOffset(colOffset.ToString()), RowOffset = new RowOffset(rowOffset.ToString()) }, new Extent { Cx = extentsCx, Cy = extentsCy }, new DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture( new NonVisualPictureProperties( new NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId }, new NonVisualPictureDrawingProperties(new DocumentFormat.OpenXml.Drawing.PictureLocks { NoChangeAspect = true }) ), new BlipFill( new DocumentFormat.OpenXml.Drawing.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = DocumentFormat.OpenXml.Drawing.BlipCompressionValues.Print }, new DocumentFormat.OpenXml.Drawing.Stretch(new DocumentFormat.OpenXml.Drawing.FillRectangle()) ), new ShapeProperties( new DocumentFormat.OpenXml.Drawing.Transform2D( new DocumentFormat.OpenXml.Drawing.Offset { X = 0, Y = 0 }, new DocumentFormat.OpenXml.Drawing.Extents { Cx = extentsCx, Cy = extentsCy } ), new DocumentFormat.OpenXml.Drawing.PresetGeometry { Preset = DocumentFormat.OpenXml.Drawing.ShapeTypeValues.Rectangle } ) ), new ClientData() ); oneCellAnchors.Add(oneCellAnchor); } using (var drawingsPartWriter = OpenXmlWriter.Create(drawingsPart)) { drawingsPartWriter.WriteStartElement(worksheetDrawing); foreach (var oneCellAnchor in oneCellAnchors) { drawingsPartWriter.WriteElement(oneCellAnchor); } drawingsPartWriter.WriteEndElement(); drawingsPartWriter.Close(); } return(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) }); }
private static void AddImage(Func <FileStream> fileStreamFunc, WorksheetPart worksheetPart) { if (fileStreamFunc == null) { return; } DrawingsPart drawingsPart; ImagePart imagePart; Extents extents; using (var fileStream = fileStreamFunc()) { if (fileStream == null) { return; } drawingsPart = worksheetPart.AddNewPart <DrawingsPart>(); imagePart = drawingsPart.AddImagePart(ImagePartType.Png, worksheetPart.GetIdOfPart(drawingsPart)); imagePart.FeedData(fileStream); Image image = Image.FromStream(fileStream); //http://en.wikipedia.org/wiki/English_Metric_Unit#DrawingML //http://stackoverflow.com/questions/1341930/pixel-to-centimeter //http://stackoverflow.com/questions/139655/how-to-convert-pixels-to-points-px-to-pt-in-net-c extents = new Extents { Cx = (long)image.Width * (long)((float)914400 / image.HorizontalResolution), Cy = (long)image.Height * (long)((float)914400 / image.VerticalResolution) }; image.Dispose(); } NonVisualPictureProperties pictureNonVisualPictureProperties = new NonVisualPictureProperties { NonVisualDrawingProperties = new NonVisualDrawingProperties { Id = 1025, Name = "Picture 1", Description = "eventtree" }, NonVisualPictureDrawingProperties = new NonVisualPictureDrawingProperties { PictureLocks = new PictureLocks { NoChangeAspect = true, NoChangeArrowheads = true } } }; Stretch stretch = new Stretch { FillRectangle = new FillRectangle() }; BlipFill blipFill = new BlipFill { Blip = new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, SourceRectangle = new SourceRectangle() }; blipFill.Append(stretch); ShapeProperties shapeProperties = new ShapeProperties { BlackWhiteMode = BlackWhiteModeValues.Auto, Transform2D = new Transform2D { Offset = new Offset { X = 0, Y = 0 }, Extents = extents } }; PresetGeometry prstGeom = new PresetGeometry { Preset = ShapeTypeValues.Rectangle, AdjustValueList = new AdjustValueList() }; shapeProperties.Append(prstGeom); shapeProperties.Append(new SolidFill { RgbColorModelHex = new RgbColorModelHex { Val = Color.White.ToSimpleHexValue() } }); DocumentFormat.OpenXml.Drawing.Outline outline = new DocumentFormat.OpenXml.Drawing.Outline { Width = 25400, }; var solidFill1 = new SolidFill { RgbColorModelHex = new RgbColorModelHex { Val = StyleSheetLibrary.BorderColor.ToSimpleHexValue() } }; outline.Append(solidFill1); shapeProperties.Append(outline); DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture picture = new DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture { NonVisualPictureProperties = pictureNonVisualPictureProperties, BlipFill = blipFill, ShapeProperties = shapeProperties }; var iColumnId = 11; var iRowId = 1; var lColumnOffset = 0; var lRowOffset = 0; OneCellAnchor ocanchor = new OneCellAnchor { FromMarker = new DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker { ColumnId = new ColumnId { Text = iColumnId.ToString(CultureInfo.InvariantCulture) }, ColumnOffset = new ColumnOffset { Text = lColumnOffset.ToString(CultureInfo.InvariantCulture) }, RowId = new RowId { Text = iRowId.ToString(CultureInfo.InvariantCulture) }, RowOffset = new RowOffset { Text = lRowOffset.ToString(CultureInfo.InvariantCulture) } }, Extent = new Extent { Cx = extents.Cx, Cy = extents.Cy } }; ocanchor.Append(picture); ocanchor.Append(new ClientData()); WorksheetDrawing worksheetDrawing = new WorksheetDrawing(); worksheetDrawing.Append(ocanchor); Drawing drawing = new Drawing { Id = drawingsPart.GetIdOfPart(imagePart) }; worksheetDrawing.Save(drawingsPart); worksheetPart.Worksheet.Append(drawing); }