/// <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); } }
/// <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; } }
/// <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); }