Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
Das exakte Anpassen eines Bildes an eine einzelne Zelle ist eine häufige Anforderung beim Entwerfen von Tabellenkalkulationen, die als visuelle Berichte, Produktkataloge, Mitarbeiterverzeichnisse, Dashboards oder Inventarlisten dienen. Anstatt ein Bild über viele Zellen zu spannen oder es lose auf einem Arbeitsblatt zu platzieren, möchten Sie möglicherweise ein sauberes, zellgebundenes Bild, das mit der ihm gehörenden Zelle ausgerichtet bleibt. Aspose.Cells unterstützt dieses Szenario auf zwei komplementäre Arten:
Picture hinzu, setzen Sie dessen setPlacement auf MOVE_AND_SIZE und passen Sie dessen Ankerzellen (setUpperLeftRow, setUpperLeftColumn, setLowerRightRow, setLowerRightColumn) so an, dass das Bild genau eine Zelle abdeckt.setEmbeddedImage der Zelle Bildbytes zu. Das Bild skaliert automatisch, um in den Anzeigebereich der Zelle zu passen, und wandert mit der Zelle mit.
Der Rest dieses Artikels führt durch beide Ansätze, erläutert die relevanten APIs und zeigt, wie sie im Code eingesetzt werden.Ein schwebendes Bild ist ein Picture-Objekt, das sich auf der Zeichnungsebene des Arbeitsblatts befindet. Obwohl es nicht Teil einer einzelnen Zelle ist, ist es an einen Zellbereich verankert. Die Ankerzellen des Bildes — seine obere linke und untere rechte Ecke — bestimmen seine visuelle Ausdehnung auf dem Arbeitsblatt. Standardmäßig erstreckt sich ein neu hinzugefügtes Bild über mehrere Zellen.
Damit ein schwebendes Bild genau eine Zelle abdeckt, müssen Sie:
Worksheet.getPictures().add(int row, int column, InputStream stream) hinzufügen, wodurch das neue Bild an der angegebenen Zelle verankert wird.Picture.setPlacement auf PlacementType.MOVE_AND_SIZE setzen, damit das Bild mit der darunterliegenden Zelle verschoben und in der Größe verändert wird, wenn der Benutzer die Spaltenbreite oder Zeilenhöhe ändert.Der Anker des Bildes wird durch vier nullbasierte Indexeigenschaften definiert:
setUpperLeftRow — der Zeilenindex der oberen Kante des Bildes.setUpperLeftColumn — der Spaltenindex der linken Kante des Bildes.setLowerRightRow — der Zeilenindex der unteren Kante des Bildes. Damit die untere Kante des Bildes am unteren Rand der Zeile r liegt, setzen Sie diesen Wert auf r + 1.setLowerRightColumn — der Spaltenindex der rechten Kante des Bildes. Damit die rechte Kante des Bildes am rechten Rand der Spalte c liegt, setzen Sie diesen Wert auf c + 1.Zeilen- und Spaltenindizes in Aspose.Cells sind nullbasiert. Zelle C6 hat den Zeilenindex 5 und den Spaltenindex 2. Off-by-One-Fehler beim unteren rechten Anker sind die häufigste Ursache für Bilder, die scheinbar in eine benachbarte Zelle hineinragen.
getPlacement ist eine Aufzählung vom Typ PlacementType, die steuert, wie sich das Bild verhält, wenn der Benutzer die darunterliegende Zeile oder Spalte in der Größe ändert. Der empfohlene Wert für ein Bild in einer einzelnen Zelle ist PlacementType.MOVE_AND_SIZE, wodurch das Bild zusammen mit seiner darunterliegenden Zelle verschoben und in der Größe verändert wird, sodass die exakte Anpassung erhalten bleibt.
Workbook (oder öffnen Sie eine vorhandene).Worksheet über workbook.getWorksheets().get(0) zu.InputStream (typischerweise ein FileInputStream), damit der Stream ordnungsgemäß geschlossen wird.worksheet.getPictures().add(5, 2, stream) auf, um ein an Zelle C6 verankertes Bild hinzuzufügen. Erfassen Sie die zurückgegebene Picture-Referenz.setUpperLeftRow(5), setUpperLeftColumn(2), setLowerRightRow(6), setLowerRightColumn(3).picture.setPlacement(PlacementType.MOVE_AND_SIZE), damit das Bild an C6 ausgerichtet bleibt, wenn die Spalte oder Zeile in der Größe verändert wird..xlsx-Datei auf der Festplatte.
Der folgende Code demonstriert den vollständigen Ansatz.import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, SaveFormat, PlacementType
workbook = Workbook()
worksheet = workbook.getWorksheets().get(0)
FileInputStream = jpype.JClass("java.io.FileInputStream")
fs = FileInputStream("logo.png")
try:
picIndex = worksheet.getPictures().add(5, 2, fs)
picture = worksheet.getPictures().get(picIndex)
picture.setUpperLeftRow(5)
picture.setUpperLeftColumn(2)
picture.setLowerRightRow(6)
picture.setLowerRightColumn(3)
picture.setPlacement(PlacementType.MoveAndSize)
finally:
fs.close()
workbook.save("output.xlsx", SaveFormat.Xlsx)
jpype.shutdownJVM()
Aspose.Cells stellt außerdem einen einfacheren Mechanismus für zellgebundene Bilder bereit: die Eigenschaft Cell.setEmbeddedImage. Durch Zuweisen von Bildbytes zu dieser Eigenschaft wird das Bild an die Zelle selbst angehängt, als wäre es Inline-Inhalt.
Cell.setEmbeddedImage zur knappsten Option, wenn Ihr Ziel einfach „ein Bild, das innerhalb dieser Zelle lebt" ist.Workbook (oder öffnen Sie eine vorhandene).Worksheet über workbook.getWorksheets().get(0) zu.byte[]-Array (zum Beispiel durch Verwendung eines Files.readAllBytes-Aufrufs aus java.nio.file.Files).worksheet.getCells().get("C6") oder worksheet.getCells().get(5, 2).setEmbeddedImage der Zelle zu..xlsx-Datei auf der Festplatte.
Der folgende Code demonstriert den vollständigen Ansatz.import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook, SaveFormat
workbook = Workbook()
worksheet = workbook.getWorksheets().get(0)
# Get the target cell C6
cell = worksheet.getCells().get("C6")
# Read the image file into a byte array
imageData = open("logo.png", "rb").read()
# Embed the image directly into the cell
cell.setEmbeddedImage(imageData)
# Optionally adjust row height and column width so the embedded image is more visible
worksheet.getCells().setColumnWidth(2, 30) # Column C (index 2)
worksheet.getCells().setRowHeight(5, 100) # Row 6 (index 5)
# Save the resulting workbook as an .xlsx file
workbook.save("output.xlsx", SaveFormat.Xlsx)
jpype.shutdownJVM()
Beide Ansätze erzeugen ein Bild, das in eine einzelne Zelle passt, unterscheiden sich jedoch darin, wie das Bild gespeichert wird und wie es sich verhält:
PictureCollection arbeitet.Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.