Bir Hücreye Görüntü Ekleme
Giriş
Bir resmi tam olarak tek bir hücreye sığdırmak, görsel raporlar, ürün katalogları, çalışan dizinleri, panolar veya envanter listeleri olarak işlev gören elektronik tablolar tasarlanırken sık karşılaşılan bir gereksinimdir. Görüntüyü birçok hücreye yaymak veya çalışma sayfasına gevşek bir şekilde yerleştirmek yerine, sahibi olan hücreyle hizalı kalan, temiz ve hücreye bağlı bir görüntü isteyebilirsiniz.
Aspose.Cells bu senaryoyu iki tamamlayıcı şekilde destekler:
- Yaklaşım 1 — Hücrenin üzerine kayan bir resim yerleştirin. Çalışma sayfasına bir
Pictureekleyin,setPlacementözelliğiniMOVE_AND_SIZEolarak ayarlayın ve resmin tam olarak bir hücreyi kaplaması için bağlantı hücrelerini (setUpperLeftRow,setUpperLeftColumn,setLowerRightRow,setLowerRightColumn) ayarlayın. - Yaklaşım 2 — Görüntüyü doğrudan bir hücreye gömün. Görüntü baytlarını hücrenin
setEmbeddedImageözelliğine atayın. Görüntü, hücrenin görüntüleme alanına sığacak şekilde otomatik olarak ölçeklenir ve hücreyle birlikte taşınır.
Bu makalenin geri kalanı her iki yaklaşımı da adım adım açıklar, ilgili API’leri anlatır ve bunların kodda nasıl kullanılacağını gösterir.
Yaklaşım 1: Hücrenin Üzerine Bir Resim Yerleştirme
Kayan resim, çalışma sayfası çizim katmanında bulunan bir Picture nesnesidir. Herhangi bir tek hücrenin parçası olmasa da bir hücre aralığına bağlanır. Resmin bağlantı hücreleri — sol üst ve sağ alt köşeleri — çalışma sayfasındaki görsel kapsamını belirler. Varsayılan olarak, yeni eklenen bir resim birkaç hücreye yayılır.
Kayan bir resmin tam olarak bir hücreyi kaplamasını sağlamak için şunları yapmanız gerekir:
- Resmi
Worksheet.getPictures().add(int row, int column, InputStream stream)kullanarak ekleyin; bu, yeni resmi verilen hücreye bağlar. - Resmin sınırlayıcı dikdörtgeni hedef hücreyle çakışacak şekilde dört bağlantı özelliğini ayarlayın.
- Kullanıcı sütun genişliğini veya satır yüksekliğini değiştirdiğinde resmin alttaki hücreyle birlikte taşınması ve yeniden boyutlandırılması için
Picture.setPlacementözelliğiniPlacementType.MOVE_AND_SIZEolarak ayarlayın.
Resmi Tek Bir Hücreye Bağlama
Resmin bağlantısı, sıfır tabanlı dört dizin özelliği tarafından tanımlanır:
setUpperLeftRow— resmin üst kenarının satır dizini.setUpperLeftColumn— resmin sol kenarının sütun dizini.setLowerRightRow— resmin alt kenarının satır dizini. Resmin alt kenarınırsatırının altına yerleştirmek için bunur + 1olarak ayarlayın.setLowerRightColumn— resmin sağ kenarının sütun dizini. Resmin sağ kenarınıcsütununun sağına yerleştirmek için bunuc + 1olarak ayarlayın.
Örneğin, resmi tam olarak C6 hücresine (satır dizini 5, sütun dizini 2) sığdırmak için setUpperLeftRow(5), setUpperLeftColumn(2), setLowerRightRow(6) ve setLowerRightColumn(3) ayarlayın.
Yerleştirme Davranışını Kontrol Etme
getPlacement, kullanıcı alttaki satırı veya sütunu yeniden boyutlandırdığında resmin nasıl davranacağını kontrol eden PlacementType türünde bir numaralandırmadır. Tek hücreli resim için önerilen değer PlacementType.MOVE_AND_SIZE‘dır; bu, resmin alttaki hücreyle birlikte taşınmasına ve yeniden boyutlandırılmasına neden olarak tam sığdırmayı korur.
Adım Adım Talimatlar
- Yeni bir
Workbookoluşturun (veya mevcut birini açın). workbook.getWorksheets().get(0)üzerinden hedefWorksheet‘e erişin.- Görüntü dosyasını disk üzerinden bir
InputStream‘e açın (genellikle akışın düzgün şekilde kapatılması için birFileInputStream). - Resmi C6 hücresine bağlı olarak eklemek için
worksheet.getPictures().add(5, 2, stream)çağırın. DöndürülenPicturereferansını yakalayın. - Resmin yalnızca C6 hücresini kaplaması için dört bağlantı koordinatını ayarlayın:
setUpperLeftRow(5),setUpperLeftColumn(2),setLowerRightRow(6),setLowerRightColumn(3). - Sütun veya satır yeniden boyutlandırıldığında resmin C6 ile hizalı kalmasını sağlamak için
picture.setPlacement(PlacementType.MOVE_AND_SIZE)ayarlayın. - İsteğe bağlı olarak, yalnızca C6 hücresinin resmi içerdiğini göstermek için çevreleyen hücrelere örnek metin ekleyin.
- Çalışma kitabını diske
.xlsxdosyası olarak kaydedin.
Aşağıdaki kod, yaklaşımın tamamını göstermektedir.
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()
Yaklaşım 2: Görüntüyü Doğrudan Bir Hücreye Gömme
Aspose.Cells ayrıca hücreye bağlı görüntüler için daha basit bir mekanizma sunar: Cell.setEmbeddedImage özelliği. Görüntü baytlarını bu özelliğe atamak, görüntüyü hücrenin kendisine satır içi içerikmiş gibi ekler.
Gömülü Görüntüler Nasıl Çalışır
- Görüntü, çizim katmanındaki bir şekil olarak değil, hücre içeriğinin bir parçası olarak saklanır.
- Görüntü, hücrenin işlenmiş sınırları içine sığacak şekilde otomatik olarak ölçeklenir. Bağlantı koordinatları veya yerleştirme ayarları gerekmez.
- Hücre, formüller tarafından başvurulabilen, bir satırın parçası olarak sıralanabilen veya diğer hücre düzeyinde işlemlerde kullanılabilen gerçek bir adrese sahip gerçek bir hücre olarak kalır.
Bu, amacınız yalnızca “bu hücrenin içinde yaşayan bir görüntü” olduğunda Cell.setEmbeddedImage‘ı en kısa seçenek haline getirir.
Adım Adım Talimatlar
- Yeni bir
Workbookoluşturun (veya mevcut birini açın). workbook.getWorksheets().get(0)üzerinden hedefWorksheet‘e erişin.- Görüntü dosyasını diskten bir
byte[]dizisine okuyun (örneğin,java.nio.file.Filesüzerinden birFiles.readAllBytesçağrısı kullanarak). - Hedef hücreye bir referans alın —
worksheet.getCells().get("C6")veyaworksheet.getCells().get(5, 2)aracılığıyla. - Bayt dizisini hücrenin
setEmbeddedImageözelliğine atayın. - İsteğe bağlı olarak, gömülü görüntüye daha belirgin bir görünüm kazandırmak için hedef satır ve sütunun satır yüksekliğini ve sütun genişliğini ayarlayın.
- Çalışma kitabını diske
.xlsxdosyası olarak kaydedin.
Aşağıdaki kod, yaklaşımın tamamını göstermektedir.
import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, Worksheet, Cells, Range, SaveFormat
# buraya taşınan kod
workbook = Workbook()
worksheet = workbook.getWorksheets().get(0)
# Hedef hücre C6'yı al
cell = worksheet.getCells().get("C6")
# Görüntü dosyasını bir bayt dizisine oku
imageData = open("logo.png", "rb").read()
# Görüntüyü doğrudan hücreye göm
cell.setEmbeddedImage(imageData)
# İsteğe bağlı olarak satır yüksekliğini ve sütun genişliğini ayarla, böylece gömülü görüntü daha görünür olur
worksheet.getCells().setColumnWidth(2, 30) # Sütun C (indeks 2)
worksheet.getCells().setRowHeight(5, 100) # Satır 6 (indeks 5)
# Ortaya çıkan çalışma kitabını .xlsx dosyası olarak kaydet
workbook.save("output.xlsx", SaveFormat.Xlsx)
jpype.shutdownJVM()
Doğru Yaklaşımı Seçme
Her iki yaklaşım da tek bir hücrenin içine sığan bir resim üretir, ancak resmin nasıl saklandığı ve nasıl davrandığı konusunda farklılık gösterir:
-
Şu durumlarda kayan resim kullanın (Yaklaşım 1):
- Yerleştirme, katmanlama veya diğer çizim nesneleriyle hizalama üzerinde daha ayrıntılı bir kontrole ihtiyacınız olduğunda.
- Resmin diğer şekillerle birlikte seçilebilen, yeniden sıralanabilen veya gruplanabilen bir şekil gibi davranmasını istediğinizde.
- Zaten
PictureCollectionile çalışan kodla eski uyumluluk gerektirdiğinizde. - Çalışma sayfası düzenine dayalı olarak bağlantı koordinatlarını dinamik olarak hesaplamanız gerektiğinde.
-
Şu durumlarda gömülü görüntü kullanın (Yaklaşım 2):
- Bir hücreye görüntü eklemenin en basit olası yolunu istediğinizde.
- Görüntünün diğer hücre içerikleri gibi hücreyle birlikte taşınması gerektiğinde.
- Görüntüyü bir şekil olarak işleme ihtiyacınız olmadığında.