Как вставить изображение заголовка в Excel, используя Open XML? - PullRequest
0 голосов
/ 14 января 2020

В настоящее время я использую Open XML и нашел несколько ссылок на то, как вставить изображение в файл Excel, но я хочу вставить изображение в виде водяного знака. В настоящее время я использую эти коды, но это просто прикрепление изображения к файлу Excel.

static void AddImage(WorksheetPart worksheetPart, Stream imageStream, string imgDesc, int colNumber, int rowNumber)
    {
        MemoryStream imageMemStream = new MemoryStream();

        imageStream.Position = 0;
        imageStream.CopyTo(imageMemStream);
        imageStream.Position = 0;

        var drawingsPart = worksheetPart.DrawingsPart;

        if (drawingsPart == null)
            drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();

        if (!worksheetPart.Worksheet.ChildElements.OfType<Drawing>().Any())
            worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });

        if (drawingsPart.WorksheetDrawing == null)
            drawingsPart.WorksheetDrawing = new Xdr.WorksheetDrawing();

        var worksheetDrawing = drawingsPart.WorksheetDrawing;

        Bitmap bm = new Bitmap(imageMemStream);
        var imagePart = drawingsPart.AddImagePart(GetImagePartTypeByBitmap(bm));

        imagePart.FeedData(imageStream);

        A.Extents extents = new A.Extents();
        var extentsCx = bm.Width * (long)(914400 / bm.HorizontalResolution);
        var extentsCy = bm.Height * (long)(914400 / bm.VerticalResolution);

        bm.Dispose();

        var colOffset = 0;
        var rowOffset = 0;
        var nvps = worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>();
        var nvpId = nvps.Count() > 0 ? (UInt32Value)worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>().Max(p => p.Id.Value) + 1 : 1U;
        var oneCellAnchor = new Xdr.OneCellAnchor(
                new Xdr.FromMarker
                {
                    ColumnId = new Xdr.ColumnId((colNumber - 1).ToString()),
                    RowId = new Xdr.RowId((rowNumber - 1).ToString()),
                    ColumnOffset = new Xdr.ColumnOffset(colOffset.ToString()),
                    RowOffset = new Xdr.RowOffset(rowOffset.ToString())
                },
                new Xdr.Extent { Cx = extentsCx, Cy = extentsCy },
                new Xdr.Picture(
                    new Xdr.NonVisualPictureProperties(
                        new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId },
                        new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = 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(oneCellAnchor);
    }

Я хочу, чтобы изображение было похоже на водяной знак для файла Excel. Я хотел бы разместить изображение сзади текстов.

...