Пример #1
0
        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);
        }