diff --git a/ClosedXML/Excel/Drawings/IXLMarker.cs b/ClosedXML/Excel/Drawings/IXLMarker.cs deleted file mode 100644 index d5c2ef4..0000000 --- a/ClosedXML/Excel/Drawings/IXLMarker.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Drawing; - -namespace ClosedXML.Excel.Drawings -{ - internal interface IXLMarker - { - IXLAddress Address { get; set; } - Point Offset { get; set; } - } -} diff --git a/ClosedXML/Excel/Drawings/IXLPicture.cs b/ClosedXML/Excel/Drawings/IXLPicture.cs index cf2245d..2036470 100644 --- a/ClosedXML/Excel/Drawings/IXLPicture.cs +++ b/ClosedXML/Excel/Drawings/IXLPicture.cs @@ -1,3 +1,4 @@ +// Keep this file CodeMaid organised and cleaned using System; using System.Drawing; using System.IO; @@ -6,20 +7,7 @@ { public interface IXLPicture : IDisposable { - IXLAddress BottomRightCellAddress { get; } - - /// - /// Create a copy of the picture on a different worksheet. - /// - /// The worksheet to which the picture will be copied. - /// A created copy of the picture. - IXLPicture CopyTo(IXLWorksheet targetSheet); - - /// - /// Create a copy of the picture on the same worksheet. - /// - /// A created copy of the picture. - IXLPicture Duplicate(); + IXLCell BottomRightCell { get; } /// /// Type of image. The supported formats are defined by OpenXML's ImagePartType. @@ -45,32 +33,45 @@ Int32 Top { get; set; } - IXLAddress TopLeftCellAddress { get; } + IXLCell TopLeftCell { get; } Int32 Width { get; set; } IXLWorksheet Worksheet { get; } /// + /// Create a copy of the picture on a different worksheet. + /// + /// The worksheet to which the picture will be copied. + /// A created copy of the picture. + IXLPicture CopyTo(IXLWorksheet targetSheet); + + /// /// Deletes this picture. /// void Delete(); + /// + /// Create a copy of the picture on the same worksheet. + /// + /// A created copy of the picture. + IXLPicture Duplicate(); + Point GetOffset(XLMarkerPosition position); IXLPicture MoveTo(Int32 left, Int32 top); - IXLPicture MoveTo(IXLAddress cell); + IXLPicture MoveTo(IXLCell cell); - IXLPicture MoveTo(IXLAddress cell, Int32 xOffset, Int32 yOffset); + IXLPicture MoveTo(IXLCell cell, Int32 xOffset, Int32 yOffset); - IXLPicture MoveTo(IXLAddress cell, Point offset); + IXLPicture MoveTo(IXLCell cell, Point offset); - IXLPicture MoveTo(IXLAddress fromCell, IXLAddress toCell); + IXLPicture MoveTo(IXLCell fromCell, IXLCell toCell); - IXLPicture MoveTo(IXLAddress fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLAddress toCell, Int32 toCellXOffset, Int32 toCellYOffset); + IXLPicture MoveTo(IXLCell fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLCell toCell, Int32 toCellXOffset, Int32 toCellYOffset); - IXLPicture MoveTo(IXLAddress fromCell, Point fromOffset, IXLAddress toCell, Point toOffset); + IXLPicture MoveTo(IXLCell fromCell, Point fromOffset, IXLCell toCell, Point toOffset); IXLPicture Scale(Double factor, Boolean relativeToOriginal = false); diff --git a/ClosedXML/Excel/Drawings/XLMarker.cs b/ClosedXML/Excel/Drawings/XLMarker.cs index f48bf5c..57d496a 100644 --- a/ClosedXML/Excel/Drawings/XLMarker.cs +++ b/ClosedXML/Excel/Drawings/XLMarker.cs @@ -1,23 +1,37 @@ +// Keep this file CodeMaid organised and cleaned +using System; using System.Diagnostics; using System.Drawing; namespace ClosedXML.Excel.Drawings { [DebuggerDisplay("{Address} {Offset}")] - internal class XLMarker : IXLMarker + internal class XLMarker { - internal XLMarker(IXLAddress address) - : this(address, new Point(0, 0)) + // Using a range to store the location so that it gets added to the range repository + // and hence will be adjusted when there are insertions / deletions + private readonly IXLRange rangeCell; + + internal XLMarker(IXLCell cell) + : this(cell.AsRange(), new Point(0, 0)) { } - internal XLMarker(IXLAddress address, Point offset) + internal XLMarker(IXLCell cell, Point offset) + : this(cell.AsRange(), offset) + { } + + private XLMarker(IXLRange rangeCell, Point offset) { - this.Address = address; + if (rangeCell.RowCount() != 1 || rangeCell.ColumnCount() != 1) + throw new ArgumentException("Range should contain only one cell.", nameof(rangeCell)); + + this.rangeCell = rangeCell; this.Offset = offset; } - public IXLAddress Address { get; set; } - + public IXLCell Cell { get => rangeCell.FirstCell(); } + public Int32 ColumnNumber { get => rangeCell.RangeAddress.FirstAddress.ColumnNumber; } public Point Offset { get; set; } + public Int32 RowNumber { get => rangeCell.RangeAddress.FirstAddress.RowNumber; } } } diff --git a/ClosedXML/Excel/Drawings/XLPicture.cs b/ClosedXML/Excel/Drawings/XLPicture.cs index 4ec84de..3a766e3 100644 --- a/ClosedXML/Excel/Drawings/XLPicture.cs +++ b/ClosedXML/Excel/Drawings/XLPicture.cs @@ -1,3 +1,4 @@ +// Keep this file CodeMaid organised and cleaned using System; using System.Collections.Generic; using System.Diagnostics; @@ -96,7 +97,7 @@ { this.Worksheet = worksheet ?? throw new ArgumentNullException(nameof(worksheet)); this.Placement = XLPicturePlacement.MoveAndSize; - this.Markers = new Dictionary() + this.Markers = new Dictionary() { [XLMarkerPosition.TopLeft] = null, [XLMarkerPosition.BottomRight] = null @@ -110,17 +111,18 @@ this.id = 1; } - public IXLAddress BottomRightCellAddress + public IXLCell BottomRightCell { get { - return Markers[XLMarkerPosition.BottomRight].Address; + return Markers[XLMarkerPosition.BottomRight].Cell; } private set { if (!value.Worksheet.Equals(this.Worksheet)) - throw new ArgumentOutOfRangeException(nameof(value.Worksheet)); + throw new InvalidOperationException("A picture and its anchor cells must be on the same worksheet"); + this.Markers[XLMarkerPosition.BottomRight] = new XLMarker(value); } } @@ -160,7 +162,7 @@ if (this.Placement != XLPicturePlacement.FreeFloating) throw new ArgumentException("To set the left-hand offset, the placement should be FreeFloating"); - Markers[XLMarkerPosition.TopLeft] = new XLMarker(Worksheet.Cell(1, 1).Address, new Point(value, this.Top)); + Markers[XLMarkerPosition.TopLeft] = new XLMarker(Worksheet.Cell(1, 1), new Point(value, this.Top)); } } @@ -192,21 +194,21 @@ if (this.Placement != XLPicturePlacement.FreeFloating) throw new ArgumentException("To set the top offset, the placement should be FreeFloating"); - Markers[XLMarkerPosition.TopLeft] = new XLMarker(Worksheet.Cell(1, 1).Address, new Point(this.Left, value)); + Markers[XLMarkerPosition.TopLeft] = new XLMarker(Worksheet.Cell(1, 1), new Point(this.Left, value)); } } - public IXLAddress TopLeftCellAddress + public IXLCell TopLeftCell { get { - return Markers[XLMarkerPosition.TopLeft].Address; + return Markers[XLMarkerPosition.TopLeft].Cell; } private set { if (!value.Worksheet.Equals(this.Worksheet)) - throw new ArgumentOutOfRangeException(nameof(value.Worksheet)); + throw new InvalidOperationException("A picture and its anchor cells must be on the same worksheet"); this.Markers[XLMarkerPosition.TopLeft] = new XLMarker(value); } @@ -225,10 +227,20 @@ public IXLWorksheet Worksheet { get; } - internal IDictionary Markers { get; private set; } + internal IDictionary Markers { get; private set; } internal String RelId { get; set; } + /// + /// Create a copy of the picture on a different worksheet. + /// + /// The worksheet to which the picture will be copied. + /// A created copy of the picture. + public IXLPicture CopyTo(IXLWorksheet targetSheet) + { + return CopyTo((XLWorksheet)targetSheet); + } + public void Delete() { Worksheet.Pictures.Delete(this.Name); @@ -239,6 +251,15 @@ this.ImageStream.Dispose(); } + /// + /// Create a copy of the picture on the same worksheet. + /// + /// A created copy of the picture. + public IXLPicture Duplicate() + { + return CopyTo(Worksheet); + } + public Point GetOffset(XLMarkerPosition position) { return Markers[position].Offset; @@ -252,45 +273,45 @@ return this; } - public IXLPicture MoveTo(IXLAddress cell) + public IXLPicture MoveTo(IXLCell cell) { return MoveTo(cell, 0, 0); } - public IXLPicture MoveTo(IXLAddress cell, Int32 xOffset, Int32 yOffset) + public IXLPicture MoveTo(IXLCell cell, Int32 xOffset, Int32 yOffset) { return MoveTo(cell, new Point(xOffset, yOffset)); } - public IXLPicture MoveTo(IXLAddress cell, Point offset) + public IXLPicture MoveTo(IXLCell cell, Point offset) { if (cell == null) throw new ArgumentNullException(nameof(cell)); this.Placement = XLPicturePlacement.Move; - this.TopLeftCellAddress = cell; + this.TopLeftCell = cell; this.Markers[XLMarkerPosition.TopLeft].Offset = offset; return this; } - public IXLPicture MoveTo(IXLAddress fromCell, IXLAddress toCell) + public IXLPicture MoveTo(IXLCell fromCell, IXLCell toCell) { return MoveTo(fromCell, 0, 0, toCell, 0, 0); } - public IXLPicture MoveTo(IXLAddress fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLAddress toCell, Int32 toCellXOffset, Int32 toCellYOffset) + public IXLPicture MoveTo(IXLCell fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLCell toCell, Int32 toCellXOffset, Int32 toCellYOffset) { return MoveTo(fromCell, new Point(fromCellXOffset, fromCellYOffset), toCell, new Point(toCellXOffset, toCellYOffset)); } - public IXLPicture MoveTo(IXLAddress fromCell, Point fromOffset, IXLAddress toCell, Point toOffset) + public IXLPicture MoveTo(IXLCell fromCell, Point fromOffset, IXLCell toCell, Point toOffset) { if (fromCell == null) throw new ArgumentNullException(nameof(fromCell)); if (toCell == null) throw new ArgumentNullException(nameof(toCell)); this.Placement = XLPicturePlacement.MoveAndSize; - this.TopLeftCellAddress = fromCell; + this.TopLeftCell = fromCell; this.Markers[XLMarkerPosition.TopLeft].Offset = fromOffset; - this.BottomRightCellAddress = toCell; + this.BottomRightCell = toCell; this.Markers[XLMarkerPosition.BottomRight].Offset = toOffset; return this; @@ -326,25 +347,6 @@ return this; } - /// - /// Create a copy of the picture on a different worksheet. - /// - /// The worksheet to which the picture will be copied. - /// A created copy of the picture. - public IXLPicture CopyTo(IXLWorksheet targetSheet) - { - return CopyTo((XLWorksheet) targetSheet); - } - - /// - /// Create a copy of the picture on the same worksheet. - /// - /// A created copy of the picture. - public IXLPicture Duplicate() - { - return CopyTo(Worksheet); - } - internal IXLPicture CopyTo(XLWorksheet targetSheet) { if (targetSheet == null) @@ -368,18 +370,11 @@ break; case XLPicturePlacement.Move: - var newAddress = new XLAddress(targetSheet, TopLeftCellAddress.RowNumber, - TopLeftCellAddress.ColumnNumber, false, false); - newPicture.MoveTo(newAddress, GetOffset(XLMarkerPosition.TopLeft)); + newPicture.MoveTo(targetSheet.Cell(TopLeftCell.Address), GetOffset(XLMarkerPosition.TopLeft)); break; case XLPicturePlacement.MoveAndSize: - var newFromAddress = new XLAddress(targetSheet, TopLeftCellAddress.RowNumber, - TopLeftCellAddress.ColumnNumber, false, false); - var newToAddress = new XLAddress(targetSheet, BottomRightCellAddress.RowNumber, - BottomRightCellAddress.ColumnNumber, false, false); - - newPicture.MoveTo(newFromAddress, GetOffset(XLMarkerPosition.TopLeft), newToAddress, + newPicture.MoveTo(targetSheet.Cell(TopLeftCell.Address), GetOffset(XLMarkerPosition.TopLeft), targetSheet.Cell(BottomRightCell.Address), GetOffset(XLMarkerPosition.BottomRight)); break; } diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index dbd5e51..2357cb7 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -907,7 +907,7 @@ { var oneCellAnchor = anchor as Xdr.OneCellAnchor; var from = LoadMarker(ws, oneCellAnchor.FromMarker); - picture.MoveTo(from.Address, from.Offset); + picture.MoveTo(from.Cell, from.Offset); } else if (anchor is Xdr.TwoCellAnchor) { @@ -917,7 +917,7 @@ if (twoCellAnchor.EditAs == null || !twoCellAnchor.EditAs.HasValue || twoCellAnchor.EditAs.Value == Xdr.EditAsValues.TwoCell) { - picture.MoveTo(from.Address, from.Offset, to.Address, to.Offset); + picture.MoveTo(from.Cell, from.Offset, to.Cell, to.Offset); } else if (twoCellAnchor.EditAs.Value == Xdr.EditAsValues.Absolute) { @@ -932,7 +932,7 @@ } else if (twoCellAnchor.EditAs.Value == Xdr.EditAsValues.OneCell) { - picture.MoveTo(from.Address, from.Offset); + picture.MoveTo(from.Cell, from.Offset); } } } @@ -945,12 +945,12 @@ return Convert.ToInt32(emu * resolution / 914400); } - private static IXLMarker LoadMarker(IXLWorksheet ws, Xdr.MarkerType marker) + private static XLMarker LoadMarker(IXLWorksheet ws, Xdr.MarkerType marker) { var row = Math.Min(XLHelper.MaxRowNumber, Math.Max(1, Convert.ToInt32(marker.RowId.InnerText) + 1)); var column = Math.Min(XLHelper.MaxColumnNumber, Math.Max(1, Convert.ToInt32(marker.ColumnId.InnerText) + 1)); return new XLMarker( - ws.Cell(row, column).Address, + ws.Cell(row, column), new Point( ConvertFromEnglishMetricUnits(Convert.ToInt32(marker.ColumnOffset.InnerText), GraphicsUtils.Graphics.DpiX), ConvertFromEnglishMetricUnits(Convert.ToInt32(marker.RowOffset.InnerText), GraphicsUtils.Graphics.DpiY) diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 8f654fe..3d839de 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -3077,21 +3077,21 @@ case Drawings.XLPicturePlacement.MoveAndSize: var moveAndSizeFromMarker = pic.Markers[Drawings.XLMarkerPosition.TopLeft]; - if (moveAndSizeFromMarker == null) moveAndSizeFromMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1").Address); + if (moveAndSizeFromMarker == null) moveAndSizeFromMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1")); fMark = new Xdr.FromMarker { - ColumnId = new Xdr.ColumnId((moveAndSizeFromMarker.Address.ColumnNumber - 1).ToInvariantString()), - RowId = new Xdr.RowId((moveAndSizeFromMarker.Address.RowNumber - 1).ToInvariantString()), + ColumnId = new Xdr.ColumnId((moveAndSizeFromMarker.ColumnNumber - 1).ToInvariantString()), + RowId = new Xdr.RowId((moveAndSizeFromMarker.RowNumber - 1).ToInvariantString()), ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveAndSizeFromMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToInvariantString()), RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveAndSizeFromMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToInvariantString()) }; var moveAndSizeToMarker = pic.Markers[Drawings.XLMarkerPosition.BottomRight]; - if (moveAndSizeToMarker == null) moveAndSizeToMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1").Address, new System.Drawing.Point(picture.Width, picture.Height)); + if (moveAndSizeToMarker == null) moveAndSizeToMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1"), new System.Drawing.Point(picture.Width, picture.Height)); tMark = new Xdr.ToMarker { - ColumnId = new Xdr.ColumnId((moveAndSizeToMarker.Address.ColumnNumber - 1).ToInvariantString()), - RowId = new Xdr.RowId((moveAndSizeToMarker.Address.RowNumber - 1).ToInvariantString()), + ColumnId = new Xdr.ColumnId((moveAndSizeToMarker.ColumnNumber - 1).ToInvariantString()), + RowId = new Xdr.RowId((moveAndSizeToMarker.RowNumber - 1).ToInvariantString()), ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveAndSizeToMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToInvariantString()), RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveAndSizeToMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToInvariantString()) }; @@ -3124,11 +3124,11 @@ case Drawings.XLPicturePlacement.Move: var moveFromMarker = pic.Markers[Drawings.XLMarkerPosition.TopLeft]; - if (moveFromMarker == null) moveFromMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1").Address); + if (moveFromMarker == null) moveFromMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1")); fMark = new Xdr.FromMarker { - ColumnId = new Xdr.ColumnId((moveFromMarker.Address.ColumnNumber - 1).ToInvariantString()), - RowId = new Xdr.RowId((moveFromMarker.Address.RowNumber - 1).ToInvariantString()), + ColumnId = new Xdr.ColumnId((moveFromMarker.ColumnNumber - 1).ToInvariantString()), + RowId = new Xdr.RowId((moveFromMarker.RowNumber - 1).ToInvariantString()), ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveFromMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToInvariantString()), RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveFromMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToInvariantString()) }; diff --git a/ClosedXML_Examples/ImageHandling/ImageAnchors.cs b/ClosedXML_Examples/ImageHandling/ImageAnchors.cs index b20b42d..2285c15 100644 --- a/ClosedXML_Examples/ImageHandling/ImageAnchors.cs +++ b/ClosedXML_Examples/ImageHandling/ImageAnchors.cs @@ -28,7 +28,7 @@ fs.Position = 0; ws.AddPicture(fs, XLPictureFormat.Png, "Image11") - .MoveTo(ws.Cell(1, 1).Address); + .MoveTo(ws.Cell(1, 1)); #endregion OneCellAnchor @@ -38,7 +38,7 @@ fs.Position = 0; ws.AddPicture(fs, XLPictureFormat.Png, "Image20") - .MoveTo(ws.Cell(6, 5).Address, ws.Cell(9, 7).Address); + .MoveTo(ws.Cell(6, 5), ws.Cell(9, 7)); #endregion TwoCellAnchor } @@ -49,17 +49,17 @@ ws = wb.Worksheets.Add("Images3"); ws.AddPicture(fs, XLPictureFormat.Jpeg) - .MoveTo(ws.Cell(2, 2).Address, 20, 5, ws.Cell(5, 5).Address, 30, 10) - .MoveTo(ws.Cell(2, 2).Address, ws.Cell(5, 5).Address); + .MoveTo(ws.Cell(2, 2), 20, 5, ws.Cell(5, 5), 30, 10) + .MoveTo(ws.Cell(2, 2), ws.Cell(5, 5)); ws.AddPicture(fs, XLPictureFormat.Jpeg) - .MoveTo(ws.Cell(6, 2).Address, 2, 2, ws.Cell(9, 5).Address, 2, 2) - .MoveTo(ws.Cell(6, 2).Address, 20, 5, ws.Cell(9, 5).Address, 30, 10); + .MoveTo(ws.Cell(6, 2), 2, 2, ws.Cell(9, 5), 2, 2) + .MoveTo(ws.Cell(6, 2), 20, 5, ws.Cell(9, 5), 30, 10); ws.AddPicture(fs, XLPictureFormat.Jpeg) - .MoveTo(ws.Cell(10, 2).Address, 20, 5) + .MoveTo(ws.Cell(10, 2), 20, 5) .Scale(0.2, true) - .MoveTo(ws.Cell(10, 1).Address); + .MoveTo(ws.Cell(10, 1)); } using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) diff --git a/ClosedXML_Examples/ImageHandling/ImageFormats.cs b/ClosedXML_Examples/ImageHandling/ImageFormats.cs index 1f21297..eaad0f8 100644 --- a/ClosedXML_Examples/ImageHandling/ImageFormats.cs +++ b/ClosedXML_Examples/ImageHandling/ImageFormats.cs @@ -18,7 +18,7 @@ ws = wb.Worksheets.Add("Jpg"); ws.AddPicture(fs, XLPictureFormat.Jpeg, "JpegImage") - .MoveTo(ws.Cell(1, 1).Address); + .MoveTo(ws.Cell(1, 1)); #endregion Jpeg } @@ -29,7 +29,7 @@ ws = wb.Worksheets.Add("Png"); ws.AddPicture(fs, XLPictureFormat.Png, "PngImage") - .MoveTo(ws.Cell(1, 1).Address); + .MoveTo(ws.Cell(1, 1)); #endregion Png diff --git a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs index c071eb8..931b263 100644 --- a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs +++ b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs @@ -197,10 +197,10 @@ public void XLMarkerTests() { IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - XLMarker firstMarker = new XLMarker(ws.Cell(1, 10).Address, new Point(100, 0)); + XLMarker firstMarker = new XLMarker(ws.Cell(1, 10), new Point(100, 0)); - Assert.AreEqual("J", firstMarker.Address.ColumnLetter); - Assert.AreEqual(1, firstMarker.Address.RowNumber); + Assert.AreEqual(10, firstMarker.ColumnNumber); + Assert.AreEqual(1, firstMarker.RowNumber); Assert.AreEqual(100, firstMarker.Offset.X); Assert.AreEqual(0, firstMarker.Offset.Y); } @@ -352,7 +352,7 @@ Assert.AreEqual(original.Format, copy.Format); Assert.AreEqual(original.Height, copy.Height); Assert.AreEqual(original.Placement, copy.Placement); - Assert.AreEqual(original.TopLeftCellAddress.ToString(), copy.TopLeftCellAddress.ToString()); + Assert.AreEqual(original.TopLeftCell.ToString(), copy.TopLeftCell.ToString()); Assert.AreEqual(original.Width, copy.Width); Assert.AreEqual(original.ImageStream.ToArray(), copy.ImageStream.ToArray(), "Image streams differ"); @@ -373,7 +373,6 @@ original = (ws1 as XLWorksheet).AddPicture(stream, "Picture 1", 2) .WithPlacement(XLPicturePlacement.FreeFloating) .MoveTo(220, 155) as XLPicture; - } var ws2 = wb.Worksheets.Add("Sheet2"); @@ -390,11 +389,28 @@ Assert.AreEqual(original.Name, copy.Name); Assert.AreEqual(original.Placement, copy.Placement); Assert.AreEqual(original.Top, copy.Top); - Assert.AreEqual(original.TopLeftCellAddress.ToString(), copy.TopLeftCellAddress.ToString()); + Assert.AreEqual(original.TopLeftCell.ToString(), copy.TopLeftCell.ToString()); Assert.AreEqual(original.Width, copy.Width); Assert.AreEqual(original.ImageStream.ToArray(), copy.ImageStream.ToArray(), "Image streams differ"); Assert.AreNotEqual(original.Id, copy.Id); } + + [Test] + public void PictureShiftsWhenInsertingRows() + { + using (var wb = new XLWorkbook()) + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + var ws = wb.Worksheets.Add("ImageShift"); + var picture = ws.AddPicture(stream, XLPictureFormat.Png, "PngImage") + .MoveTo(ws.Cell(5, 2)) + .WithPlacement(XLPicturePlacement.Move); + + ws.Row(2).InsertRowsBelow(20); + + Assert.AreEqual(25, picture.TopLeftCell.Address.RowNumber); + } + } } } diff --git a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs index c280c16..b847362 100644 --- a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs +++ b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs @@ -683,7 +683,7 @@ Assert.AreEqual(original.Name, copy.Name); Assert.AreEqual(original.Placement, copy.Placement); Assert.AreEqual(original.Top, copy.Top); - Assert.AreEqual(original.TopLeftCellAddress.ToString(), copy.TopLeftCellAddress.ToString()); + Assert.AreEqual(original.TopLeftCell.Address.ToString(), copy.TopLeftCell.Address.ToString()); Assert.AreEqual(original.Width, copy.Width); Assert.AreEqual(original.ImageStream.ToArray(), copy.ImageStream.ToArray(), "Image streams differ"); }