diff --git a/ClosedXML/Excel/Drawings/IXLPicture.cs b/ClosedXML/Excel/Drawings/IXLPicture.cs index 96a9eb6..15d6b2a 100644 --- a/ClosedXML/Excel/Drawings/IXLPicture.cs +++ b/ClosedXML/Excel/Drawings/IXLPicture.cs @@ -17,10 +17,11 @@ long MaxWidth { get; set; } long Width { get; set; } long Height { get; set; } - long PaddingX { get; set; } - long PaddingY { get; set; } - long EMUOffsetX { get; set; } - long EMUOffsetY { get; set; } + long OffsetX { get; set; } + long OffsetY { get; set; } + long RawOffsetX { get; set; } + long RawOffsetY { get; set; } + bool IsAbsolute { get; set; } String Name { get; set; } } diff --git a/ClosedXML/Excel/Drawings/XLMarker.cs b/ClosedXML/Excel/Drawings/XLMarker.cs index a523677..1ee61ff 100644 --- a/ClosedXML/Excel/Drawings/XLMarker.cs +++ b/ClosedXML/Excel/Drawings/XLMarker.cs @@ -20,7 +20,7 @@ } get { - return this.colId - 1; + return this.colId; } } @@ -32,7 +32,7 @@ } get { - return this.rowId - 1; + return this.rowId; } } diff --git a/ClosedXML/Excel/Drawings/XLPicture.cs b/ClosedXML/Excel/Drawings/XLPicture.cs index 2419568..ea5943a 100644 --- a/ClosedXML/Excel/Drawings/XLPicture.cs +++ b/ClosedXML/Excel/Drawings/XLPicture.cs @@ -11,9 +11,7 @@ private MemoryStream imgStream; private List Markers; private String name; - public bool NoChangeAspect; - public bool NoMove; - public bool NoResize; + private bool isAbsolute; private long iMaxWidth = 500; private long iMaxHeight = 500; @@ -104,18 +102,18 @@ get { return (long)iWidth; } } - public long PaddingX + public long OffsetX { get { return ConvertToEmu(iOffsetX, iHorizontalResolution); } set { iOffsetX = value; } } - public long PaddingY + public long OffsetY { get { return ConvertToEmu(iOffsetY, iVerticalResolution); } set { iOffsetY = value; } } - public long EMUOffsetX + public long RawOffsetX { get { @@ -127,7 +125,7 @@ } } - public long EMUOffsetY + public long RawOffsetY { get { @@ -177,7 +175,7 @@ public List GetMarkers() { - return Markers; + return Markers != null ? Markers : new List(); } public void AddMarker(IXLMarker marker) { @@ -199,5 +197,17 @@ name = value; } } + + public bool IsAbsolute + { + get + { + return isAbsolute; + } + set + { + isAbsolute = value; + } + } } } diff --git a/ClosedXML/Excel/IXLWorksheet.cs b/ClosedXML/Excel/IXLWorksheet.cs index 897e694..cf5b21b 100644 --- a/ClosedXML/Excel/IXLWorksheet.cs +++ b/ClosedXML/Excel/IXLWorksheet.cs @@ -372,6 +372,10 @@ List Pictures(); + /// + /// Adds image to worksheet + /// + /// XLPicture object to be added. void AddPicture(Drawings.XLPicture pic); } } diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 2e62631..d86e097 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -2514,7 +2514,7 @@ var worksheetDrawing = drawingsPart.WorksheetDrawing; - var imagePart = drawingsPart.AddImagePart(ImagePartType.Jpeg); + var imagePart = drawingsPart.AddImagePart(ImagePartType.Png); using (Stream stream = new MemoryStream()) { @@ -2530,70 +2530,131 @@ var nvpId = nvps.Count() > 0 ? (UInt32Value)worksheetDrawing.Descendants().Max(p => p.Id.Value) + 1 : 1U; - var markers = picture.GetMarkers(); - Xdr.TwoCellAnchor twoCellAnchor; - Xdr.FromMarker fMark; - Xdr.ToMarker tMark; - - if (markers.Count == 2) + if (picture.IsAbsolute) { - fMark = new Xdr.FromMarker - { - ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()), - RowId = new Xdr.RowId(markers[0].RowId.ToString()), - ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.PaddingX).ToString()), - RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.PaddingY).ToString()) - }; - tMark = new Xdr.ToMarker - { - ColumnId = new Xdr.ColumnId(markers[1].ColumnId.ToString()), - RowId = new Xdr.RowId(markers[1].RowId.ToString()), - ColumnOffset = new Xdr.ColumnOffset((markers[1].ColumnOffset + picture.PaddingX).ToString()), - RowOffset = new Xdr.RowOffset((markers[1].RowOffset + picture.PaddingY).ToString()) - }; + Xdr.AbsoluteAnchor absoluteAnchor; + absoluteAnchor = new Xdr.AbsoluteAnchor( + new Xdr.Position + { + X = picture.OffsetX, + Y = picture.OffsetY + }, + new Xdr.Extent + { + Cx = extentsCx, + Cy = extentsCy + }, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name }, + new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true }) + ), + new Xdr.BlipFill( + new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print }, + new A.Stretch(new A.FillRectangle()) + ), + new Xdr.ShapeProperties( + new A.Transform2D( + new A.Offset { X = 0, Y = 0 }, + new A.Extents { Cx = extentsCx, Cy = extentsCy } + ), + new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(absoluteAnchor); } else { - fMark = new Xdr.FromMarker + var markers = picture.GetMarkers(); + Xdr.FromMarker fMark; + Xdr.ToMarker tMark; + if (markers.Count == 2) { - ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()), - RowId = new Xdr.RowId(markers[0].RowId.ToString()), - ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.PaddingX).ToString()), - RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.PaddingY).ToString()) - }; + fMark = new Xdr.FromMarker + { + ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()), + RowId = new Xdr.RowId(markers[0].RowId.ToString()), + ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.OffsetX).ToString()), + RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.OffsetY).ToString()) + }; + tMark = new Xdr.ToMarker + { + ColumnId = new Xdr.ColumnId(markers[1].ColumnId.ToString()), + RowId = new Xdr.RowId(markers[1].RowId.ToString()), + ColumnOffset = new Xdr.ColumnOffset((markers[1].ColumnOffset + picture.OffsetX).ToString()), + RowOffset = new Xdr.RowOffset((markers[1].RowOffset + picture.OffsetY).ToString()) + }; - tMark = new Xdr.ToMarker - { - ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()), - RowId = new Xdr.RowId(markers[0].RowId.ToString()), - ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + extentsCx + picture.PaddingX).ToString()), - RowOffset = new Xdr.RowOffset((markers[0].RowOffset + extentsCy + picture.PaddingY).ToString()) - }; - } - - twoCellAnchor = new Xdr.TwoCellAnchor( - fMark, tMark, - new Xdr.Picture( - new Xdr.NonVisualPictureProperties( - new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name }, - new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true }) - ), - new Xdr.BlipFill( - new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print }, - new A.Stretch(new A.FillRectangle()) - ), - new Xdr.ShapeProperties( - new A.Transform2D( - new A.Offset { X = 0, Y = 0 }, - new A.Extents { Cx = extentsCx, Cy = extentsCy } + Xdr.TwoCellAnchor cellAnchor; + cellAnchor = new Xdr.TwoCellAnchor( + fMark, + tMark, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name }, + new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true }) + ), + new Xdr.BlipFill( + new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print }, + new A.Stretch(new A.FillRectangle()) + ), + new Xdr.ShapeProperties( + new A.Transform2D( + new A.Offset { X = 0, Y = 0 }, + new A.Extents { Cx = extentsCx, Cy = extentsCy } + ), + new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle } + ) ), - new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle } - ) - ), - new Xdr.ClientData() - ); + new Xdr.ClientData() + ); - worksheetDrawing.Append(twoCellAnchor); + worksheetDrawing.Append(cellAnchor); + } + else if (markers.Count == 1) + { + fMark = new Xdr.FromMarker + { + ColumnId = new Xdr.ColumnId(markers[0].ColumnId.ToString()), + RowId = new Xdr.RowId(markers[0].RowId.ToString()), + ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.OffsetX).ToString()), + RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.OffsetY).ToString()) + }; + + Xdr.OneCellAnchor cellAnchor; + cellAnchor = new Xdr.OneCellAnchor( + fMark, + new Xdr.Extent + { + Cx = extentsCx, + Cy = extentsCy + }, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name }, + new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true }) + ), + new Xdr.BlipFill( + new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print }, + new A.Stretch(new A.FillRectangle()) + ), + new Xdr.ShapeProperties( + new A.Transform2D( + new A.Offset { X = 0, Y = 0 }, + new A.Extents { Cx = extentsCx, Cy = extentsCy } + ), + new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(cellAnchor); + } + } } private static Vml.TextBox GetTextBox(IXLDrawingStyle ds) @@ -4680,15 +4741,6 @@ #region Drawings - //worksheetPart.Worksheet.RemoveAllChildren(); - //{ - // OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.Drawing); - // worksheetPart.Worksheet.InsertAfter(new Drawing() { Id = String.Format("rId{0}", 1) }, previousElement); - //} - - //Drawing drawing = worksheetPart.Worksheet.Elements().First(); - //cm.SetElement(XLWSContentManager.XLWSContents.Drawing, drawing); - var pics = xlWorksheet.Pictures(); if (pics != null) { @@ -4703,7 +4755,6 @@ Drawing worksheetDrawing = new Drawing { Id = worksheetPart.GetIdOfPart(worksheetPart.DrawingsPart) }; worksheetDrawing.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); worksheetPart.Worksheet.InsertBefore(worksheetDrawing, tableParts); - //worksheetPart.Worksheet.Append(worksheetDrawing); } #endregion