Exemplo n.º 1
0
 /// <summary>
 /// Fügt den Barcode den Zellen in der Range hinzu
 /// </summary>
 /// <param name="range">Die Zellen welche den Barcode erhalten sollen.</param>
 /// <param name="xlPlacement">Die Bindung des Bildes an die Zelle: free float, move or move and size</param>
 /// <param name="fitToCell">Bild an die Zellengröße anpassen</param>
 /// <param name="cellFitToPicture">Zelle an die Bildgröße anpassen</param>
 public void AddPictures(Excel.Range range, Excel.XlPlacement xlPlacement, bool fitToCell = false, bool cellFitToPicture = false)
 {
     try
     {
         workbookCache?.AddCellShape(this.Application.Workbooks[workbookName], range, xlPlacement, fitToCell, cellFitToPicture);
     }
     catch (Exception ex)
     {
         System.Windows.Forms.MessageBox.Show(
             ex.Message
             , "Error on creating barcode images"
             , System.Windows.Forms.MessageBoxButtons.OK
             , System.Windows.Forms.MessageBoxIcon.Error);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// Fügt diesem WorkbookCache ein CellShape hinzu. Dieser wird als Barcode auf dem Worksheet angezeigt.
        /// Erzeugt also einen Barcode im <paramref name="workbook"/> und der <paramref name="range"/>
        /// und passt diesen an die Zelle an <paramref name="fitToCell"/>.
        /// </summary>
        /// <param name="workbook">In diesem Workbook soll der Barcode hinzugefügt werden.</param>
        /// <param name="range">Ein Bereich an Zellen. Die Zellen sollten Inhalte besitzen.</param>
        /// <param name="xlPlacement">Wie soll der Barcode an die Zelle gebunden sein.</param>
        /// <param name="fitToCell">Soll der Barcode an die Größe der Zelle angepasst werden.</param>
        /// <param name="cellFitToPicture">Soll die Zelle an die Größe des Bildes angepasst werden.</param>
        internal void AddCellShape(Excel.Workbook workbook, Excel.Range range, Excel.XlPlacement xlPlacement = Excel.XlPlacement.xlMove, bool fitToCell = false, bool cellFitToPicture = false)
        {
            try
            {
                if (workbook?.Name.Equals(WorkbookName) == true && range != null)
                {
                    //Existiert bereits ein SheetCache zu dem Worksheet
                    if (!HasSheetCache(range.Worksheet))
                    {
                        //Nein existiert nicht
                        //Neuen SheetCache hinzufügen
                        var shCch = SheetCache.CreateSheetCache(range.Worksheet);
                        if (shCch != null)
                        {
                            AddSheetCache(shCch);
                        }
                    }

                    //Den SheetCache ermitteln
                    var shCache = GetSheetCache(range.Worksheet);

                    if (shCache != null)
                    {
                        //Durch alle Zellen in der range laufen
                        foreach (Excel.Range cell in range)
                        {
                            //Jetzt den CellShape in den SheetCache schreiben, dabei wird er auch auf der Mappe erzeugt
                            shCache.AddCellShape(CellShape.AddShape(cell, xlPlacement, fitToCell, cellFitToPicture));
                        }
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Erzeugt einen Barcodeshape an der Position der Zelle <paramref name="range"/> mit dem Inhalt
        /// der Zelle und passt die Größe an die Zelle an <paramref name="fitToCell"/>
        /// </summary>
        /// <param name="range">Die Zelle an der dieser Shape gebunden wird und an dessen stelle der Shape
        /// platziert wird</param>
        /// <param name="xlPlacement">Soll das Bild an "frei" beweglich sein oder an die "Zellposition" oder an "Zellposition und Größe" gebunden sein.</param>
        /// <param name="fitToCell">Soll das Shape an die Zellgröße angepasst werden.</param>
        /// <param name="cellFitToPicture">Soll die Zelle an die Bildgröße angepasst werden.</param>
        /// <returns></returns>
        internal static CellShape AddShape(Excel.Range range, Excel.XlPlacement xlPlacement = Excel.XlPlacement.xlMove, bool fitToCell = false, bool cellFitToPicture = false)
        {
            //Nur wenn der text nicht leer ist und die Zellen maximal 1 Zelle ist
            if (range?.Cells.Count == 1)
            {
                //Inhalt der Zelle prüfen
                var value = range.Value?.ToString();
                if (!string.IsNullOrEmpty(value))
                {
                    try
                    {
                        //Neuen DataMatrix Encoder erstellen
                        var dmtxImageEncoder        = new DmtxImageEncoder();
                        var dmtxImageEncoderOptions = new DmtxImageEncoderOptions
                        {
                            BackColor = System.Drawing.Color.White,
                            ForeColor = System.Drawing.Color.Black
                        };

                        //Encodierung einleiten
                        var img = dmtxImageEncoder.EncodeImage(value, dmtxImageEncoderOptions);

                        //Irgendwo in Temp eine Datei erzeugen, Name egal
                        var fName = System.IO.Path.GetTempFileName() + ".jpg";

                        //In diese TempDatei speichern
                        img.Save(fName);

                        //Position der Zelle
                        System.Drawing.Point point = GetPointOfCell(range);

                        //Neue Größe ermitteln
                        System.Drawing.Size size = GetPictureOrCellSize(fName, range, fitToCell);

                        /*
                         * Erstellt ein Bild und speichert es an der Position der Zelle.
                         * Dem Shape wird die Zelle angehangen, die für den Inhalt verantwortlich ist.
                         */
                        var shape = range.Worksheet.Shapes.AddPicture(
                            fName,
                            Office.MsoTriState.msoFalse,
                            Office.MsoTriState.msoCTrue,
                            point.X,
                            point.Y,
                            size.Width,
                            size.Height);

                        //Wenn die Zelle angepasst werden soll, dann passen wir hier die Zellengröße an
                        if (cellFitToPicture)
                        {
                            //Die Spaltenbreite ist etwas komplizierter, weil hier die Breite
                            //in Einheiten der Schriftbreite verwendet wird.
                            range.ColumnWidth = range.ColumnWidth / range.Width * size.Width;
                            range.RowHeight   = size.Height;
                        }

                        //Zellenbindung in Position und Größe
                        //Ist das Bild frei, an die Position oder an Position und Größe gebunden
                        shape.Placement = xlPlacement;

                        //Wir speichern den Namen des Shape in der Form Barcode($A$1), so können wir später
                        //aus jedem Tabellenblatt die Verlinkung des Barcodes zur Ursprungszelle wieder herleiten
                        shape.Name = $"Barcode({range.Address})";

                        //Das CellShape zurückgeben
                        return(new CellShape
                        {
                            Shape = shape,
                            Address = range.Address,
                            Value = value
                        });
                    }
                    catch (Exception ex)
                    {
                        System.Windows.Forms.MessageBox.Show(
                            $"An Error on the barcode creation was thrown, see the message below:\n\n{ex.Message}"
                            , "Error on creating barcode image in AddIn OBIforExcel"
                            , System.Windows.Forms.MessageBoxButtons.OK
                            , System.Windows.Forms.MessageBoxIcon.Error);
                    }
                }
            }
            return(null);
        }