Java'da Sunumlarda Grafik Çalışma Sayfası Formüllerini Uygulama

Genel Bakış

PowerPoint grafiklerinin veri kaynağı genellikle gömülü bir çalışma sayfasında saklanır. Aspose.Slides for Java’da bu çalışma sayfasına grafik veri çalışma kitabı aracılığıyla erişebilir, giriş değerlerini yazabilir, hücrelere formül atayabilir, desteklenen formülleri hesaplayabilir ve hesaplanan hücreleri grafik verisi olarak kullanabilirsiniz.

Bu makale tam formül iş akışını açıklar: bir grafik oluşturma, çalışma sayfasını doldurma, A1‑stili veya R1C1‑stili formüller atama, yeniden hesaplatma, hesaplanan değerleri okuma, bu hücreleri bir grafik serisine bağlama ve sunumu kaydetme. Ayrıca desteklenen formül sözdizimi, yerleşik işlev alt kümesi, önbelleğe alınmış değerler, desteklenmeyen formüller ve elektronik tabloya özgü hatalar da açıklanır.

Grafik Çalışma Sayfaları ve Formüller

Bir grafik çalışma sayfası, bir grafik tarafından kullanılan kategorileri, seri adlarını ve değerleri içerir. PowerPoint’te grafik veri düzenleyicisini açarak çalışma sayfasını inceleyebilirsiniz:

PowerPoint chart with its embedded worksheet open, showing category and series data

Aspose.Slides’de çalışma sayfası IChartDataWorkbook arayüzü aracılığıyla sunulur. A1‑stili formüller için IChartDataCell.setFormula ve R1C1‑stili formüller için IChartDataCell.setR1C1Formula kullanın. Giriş hücreleri veya formüller değiştirildikten sonra, desteklenen formülleri yeniden hesaplamak ve ilgili hücre değerlerini güncellemek için IChartDataWorkbook.calculateFormulas çağırın.

Hesaplanmış bir hücre yine sonucunu IChartDataCell.getValue ile sunar. Bu, kod içinde bir formül sonucunu incelemeniz veya hücreyi bir grafik veri noktasına kullanmanız gerektiğinde önemlidir.

Bir Grafik Oluşturma ve Çalışma Sayfası Formüllerini Hesaplama

Aşağıdaki örnek uçtan uca bir iş akışını gösterir. Küme sütun grafiği oluşturur, örnek verileri temizler, çeyrek gelir ve gider değerlerini yazar, formüllerle karı hesaplar, sonuçları okur, hesaplanan hücreleri grafik değerleri olarak kullanır ve sunumu kaydeder.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 600, 350);
    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
    int worksheetIndex = 0;

    chart.getChartData().getSeries().clear();
    chart.getChartData().getCategories().clear();
    workbook.clear(worksheetIndex);

    IChartDataCell category1 = workbook.getCell(worksheetIndex, "A2", "Q1");
    IChartDataCell category2 = workbook.getCell(worksheetIndex, "A3", "Q2");
    IChartDataCell category3 = workbook.getCell(worksheetIndex, "A4", "Q3");

    workbook.getCell(worksheetIndex, "B1", "Revenue");
    workbook.getCell(worksheetIndex, "C1", "Expenses");
    workbook.getCell(worksheetIndex, "D1", "Profit");

    workbook.getCell(worksheetIndex, "B2").setValue(120.0);
    workbook.getCell(worksheetIndex, "C2").setValue(80.0);
    workbook.getCell(worksheetIndex, "B3").setValue(150.0);
    workbook.getCell(worksheetIndex, "C3").setValue(95.0);
    workbook.getCell(worksheetIndex, "B4").setValue(135.0);
    workbook.getCell(worksheetIndex, "C4").setValue(110.0);

    IChartDataCell profit1 = workbook.getCell(worksheetIndex, "D2");
    IChartDataCell profit2 = workbook.getCell(worksheetIndex, "D3");
    IChartDataCell profit3 = workbook.getCell(worksheetIndex, "D4");

    profit1.setFormula("B2-C2");
    profit2.setFormula("B3-C3");
    profit3.setFormula("B4-C4");

    workbook.calculateFormulas();

    double q1Profit = ((Number) profit1.getValue()).doubleValue(); // 40
    double q2Profit = ((Number) profit2.getValue()).doubleValue(); // 55
    double q3Profit = ((Number) profit3.getValue()).doubleValue(); // 25

    System.out.println("Q1 profit: " + q1Profit);
    System.out.println("Q2 profit: " + q2Profit);
    System.out.println("Q3 profit: " + q3Profit);

    chart.getChartData().getCategories().add(category1);
    chart.getChartData().getCategories().add(category2);
    chart.getChartData().getCategories().add(category3);

    IChartSeries profitSeries = chart.getChartData().getSeries().add(workbook.getCell(worksheetIndex, "D1"), chart.getType());
    profitSeries.getDataPoints().addDataPointForBarSeries(profit1);
    profitSeries.getDataPoints().addDataPointForBarSeries(profit2);
    profitSeries.getDataPoints().addDataPointForBarSeries(profit3);
    profitSeries.getLabels().getDefaultDataLabelFormat().setShowValue(true);

    presentation.save("chart-formulas.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Grafik veri noktaları D2:D4 aralığını referans alır, bu yüzden grafik hesaplanan kar değerlerini kullanır. Bu iş akışında ayrı bir grafik‑yenileme çağrısı yoktur: önce çalışma kitabını yeniden hesaplatın, ardından hesaplanan hücrelere işaret eden grafik verisini kullanın veya kaydedin.

A1‑Stili Formüller Kullanma

A1 notasyonu sütunları harflerle, satırları sayılarla tanımlar. A1‑stili ifadeleri IChartDataCell.setFormula aracılığıyla atayın.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 500, 300);
    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();

    workbook.getCell(0, "C3").setValue(10);
    workbook.getCell(0, "F2").setValue(2);
    workbook.getCell(0, "G2").setValue(3);
    workbook.getCell(0, "H2").setValue(4);

    IChartDataCell cell = workbook.getCell(0, "A2");
    cell.setFormula("C3+SUM(F2:H2)");

    workbook.calculateFormulas();

    Object value = cell.getValue(); // 19
} finally {
    presentation.dispose();
}

Yaygın A1 referans biçimleri şunlardır:

Referans Göreli Mutlak Karışık
Hücre A2 $A$2 A$2, $A2
Satır 2:2 $2:$2
Sütun A:A $A:$A
Aralık A2:C4 $A$2:$C$4 A$2:$C4, $A2:C$4

Göreli referanslar bir formül bir elektronik tablo uygulaması ile taşındığında veya kopyalandığında değişebilir. Mutlak referanslar her iki koordinatı da sabit tutar, karışık referanslar ise yalnızca bir satır ya da bir sütunu sabitler.

R1C1‑Stili Formüller Kullanma

R1C1 notasyonu hem satırları hem de sütunları sayısal olarak tanımlar. Göreli referanslar köşeli parantez içinde ofsetler kullanır. Bu sözdizimini IChartDataCell.setR1C1Formula ile atayın.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 500, 300);
    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();

    workbook.getCell(0, "B2").setValue(12);
    workbook.getCell(0, "C2").setValue(5);

    IChartDataCell cell = workbook.getCell(0, "D2");
    cell.setR1C1Formula("RC[-2]-RC[-1]");

    workbook.calculateFormulas();

    Object value = cell.getValue(); // 7
} finally {
    presentation.dispose();
}

Yaygın R1C1 referans biçimleri şunlardır:

Referans Göreli Mutlak Karışık
Hücre R[2]C[3] R2C3 R2C[3], R[2]C3
Satır R[2] R2
Sütun C[3] C3
Aralık R[2]C[3]:R[5]C[7] R2C3:R5C7 R2C3:R[5]C[7], R[2]C3:R5C[7]

Örneğin, D2 hücresinde RC[-2] aynı satırda iki sütun sola olan hücreyi (B2) ifade eder.

Formül Sabitleri ve Operatörler

Yerleşik formül çözücüsü mantıksal değerler, sayısal sabitler, dizeler, elektronik tablo hata değerleri, aritmetik operatörler ve karşılaştırma operatörlerini destekler.

Sabitler ve Literaller

Tür Örnekler Notlar
Mantıksal TRUE, FALSE A2=TRUE gibi mantıksal ifadelerde doğrudan kullanılabilir.
Sayısal 1, 0.5, .3, 1E-2 Ondalık ve bilimsel gösterimler desteklenir.
Dize "abc", "2/3/2020 12:00" Formül içinde çift tırnak içinde yer alır.
Hata sonucu #DIV/0!, #N/A, #REF! Geçerli bir formül normal bir sonuç yerine bir elektronik tablo hata değeri üretebilir.

Bu örnek birkaç sabit türünü kullanır:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 500, 300);
    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();

    workbook.getCell(0, "A2").setValue(false);
    workbook.getCell(0, "B2").setFormula("A2=TRUE");
    workbook.getCell(0, "C2").setFormula("1+0.5");
    workbook.getCell(0, "D2").setFormula(".3*1E-2");
    workbook.getCell(0, "E2").setFormula("\"abc\"");
    workbook.getCell(0, "F2").setFormula("2/0");

    workbook.calculateFormulas();

    Object logicalValue = workbook.getCell(0, "B2").getValue(); // yanlış
    Object numericValue = workbook.getCell(0, "C2").getValue(); // 1.5
    Object scientificValue = workbook.getCell(0, "D2").getValue(); // 0.003
    Object stringValue = workbook.getCell(0, "E2").getValue(); // abc
    Object errorValue = workbook.getCell(0, "F2").getValue(); // #DIV/0!
} finally {
    presentation.dispose();
}

Aritmetik Operatörler

Operatör Anlam Örnek
+ Toplama veya tek artı 2+3
- Çıkarma veya negatif 2-3, -3
* Çarpma 2*3
/ Bölme 2/3
% Yüzde 30%
^ Üs alma 2^3

Değerlendirme sırasını açıkça belirtmek için parantez kullanın, örneğin (A2+B2)*C2.

Karşılaştırma Operatörleri

Karşılaştırma ifadeleri mantıksal değer döndürür.

Operatör Anlam Örnek
= Eşittir A2=3
<> Eşit değildir A2<>3
> Büyüktür A2>3
>= Büyük veya eşittir A2>=3
< Küçüktür A2<3
<= Küçük veya eşittir A2<=3

Desteklenen Önceden Tanımlı İşlevler

Aspose.Slides grafik çalışma sayfaları için yerleşik bir formül çözücüsü içerir, ancak bu tam bir Excel hesaplama motoru değildir. Belgelendirilmiş işlev seti aşağıdaki ile sınırlıdır. IChartDataWorkbook.calculateFormulas aracılığıyla rastgele bir Excel işlevinin yeniden hesaplanabileceğini varsaymayın.

İşlev Amaç ya da desteklenen biçim Örnek
ABS Mutlak değer ABS(A2)
AVERAGE Aritmetik ortalama AVERAGE(B2:B5)
CEILING Sayıyı yukarı doğru bir katına yuvarla CEILING(A2,5)
CHOOSE İndexe göre değer seç CHOOSE(A2,"Low","High")
CONCAT Metin değerlerini birleştir CONCAT(A2,B2)
CONCATENATE Metin değerlerini birleştir CONCATENATE(A2," ",B2)
DATE 1900 tarih sistemiyle bir tarih değeri oluştur DATE(2026,8,19)
DAYS Tarihler arasındaki gün sayısını döndür DAYS(B2,A2)
FIND Bir metin değerini başka birinin içinde bul FIND("-",A2)
FINDB Bayt‑odaklı metin arama FINDB("a",A2)
IF Koşullu sonuç IF(A2>0,A2,0)
INDEX Referans biçimi INDEX(A2:C4,2,3)
LOOKUP Vektör biçimi LOOKUP(A2,B2:B5,C2:C5)
MATCH Vektör biçimi MATCH(A2,B2:B5,0)
MAX En büyük değer MAX(B2:B5)
SUM Değerleri toplar SUM(B2:B5)
VLOOKUP Dikey arama VLOOKUP(A2,B2:D10,3,FALSE)

Tablodaki kısıtlamalar önemlidir: INDEX referans biçiminde belgelenmiştir, LOOKUP ve MATCH ise vektör biçiminde belgelenir. DATE 1900 tarih sistemini kullanır. Burada listelenmeyen özellik ve işlevler, Aspose.Slides formül çözücüsü tarafından desteklenmiyor olarak kabul edilmelidir.

Tercih Edilen Kültürle Formülleri Hesaplama

Bazı grafik çalışma kitabı işlevleri metni kültüre özgü kurallara göre yorumlar. Bu, çift baytlı karakter setleri (DBCS) kullanan diller için özellikle önemlidir. Bu tür formülleri doğru hesaplamak için LoadOptions oluşturun, SpreadsheetOptions.setPreferredCulture ile tercih edilen kültürü ayarlayın, LoadOptions.setSpreadsheetOptions ile elektronik tablo seçeneklerini atayın ve ardından sunumu yükleyin.

Aşağıdaki örnek Japon kültürünü seçer, yapılandırılmış yükleme seçenekleriyle bir sunumu açar ve her grafik çalışma kitabı için IChartDataWorkbook.calculateFormulas çağırır:

import com.aspose.slides.*;
import java.util.Locale;

Locale japaneseCulture = Locale.forLanguageTag("ja-JP");

ISpreadsheetOptions spreadsheetOptions = new SpreadsheetOptions();
spreadsheetOptions.setPreferredCulture(japaneseCulture);

LoadOptions loadOptions = new LoadOptions();
loadOptions.setSpreadsheetOptions(spreadsheetOptions);

Presentation presentation = new Presentation("presentation.pptx", loadOptions);
try {
    for (ISlide slide : presentation.getSlides()) {
        for (IShape shape : slide.getShapes()) {
            if (shape instanceof IChart) {
                IChart chart = (IChart) shape;
                chart.getChartData().getChartDataWorkbook().calculateFormulas();
            }
        }
    }
} finally {
    presentation.dispose();
}

Tercih edilen kültür, sunum yükleme yapılandırmasının bir parçasıdır; bu yüzden Presentation örneği oluşturulmadan önce belirtilmelidir. Çalışma kitabı formüllerinin beklediği kültürü kullanın; örneğin Japon DBCS hesaplama kurallarını takip etmesi gereken formüller için ja-JP kullanın.

Yeniden Hesaplama ve Önbelleğe Alınmış Değerler

Elektronik tablo dosyaları genellikle bir formül ve son hesaplanmış değerini birlikte saklar. Aspose.Slides, bir sunum yüklendiğinde ve ilgili grafik verileri değiştirilmediğinde, IChartDataCell.getValue üzerinden önbelleğe alınmış bir değeri okuyabilir.

Giriş hücreleri veya formüller değiştirildikten sonra eski önbellek sonucuna güvenmeyin. Hesaplanmış değerleri okumadan veya onlara dayalı grafik verisini kaydetmeden önce IChartDataWorkbook.calculateFormulas çağırın.

Desteklenen alt kümenin dışındaki formüller için Aspose.Slides formülü ayrıştıramayabilir veya bağımlılıklarını belirleyemeyebilir. Çalışma kitabı değiştirilmişse, önceki önbellek değeri artık güvenilir kabul edilemez. Bu durumda, desteklenmeyen veri içeren bir hücrenin değeri okunurken CellUnsupportedDataException tetiklenebilir.

Grafiğiniz Aspose.Slides tarafından değerlendirilmeyen Excel işlevlerine bağımlıysa, bu formülleri destekleyen bir elektronik tablo motoru ile hesaplayıp elde edilen değerleri grafik çalışma kitabına yazın. Desteklenmeyen formülleri tahmini değerlerle değiştirmeyin.

Formül Hatalarını Ele Alma

İki farklı problem türü vardır.

Bir formül geçerli olabilir ancak #DIV/0!, #N/A, #NAME?, #NULL!, #NUM!, #REF! veya #VALUE! gibi bir elektronik tablo hata sonucu üretebilir. Bu durumda hata belirteci bir hücre sonucu olup IChartDataCell.getValue üzerinden döndürülebilir.

Bir formül ayrıca ayrıştırma, referans, bağımlılık veya desteklenen veri seviyesinde başarısız olabilir. Aspose.Slides bu durumlar için elektronik tabloya özgü istisnalar sağlar: CellInvalidFormulaException, CellInvalidReferenceException, CellCircularReferenceException ve CellUnsupportedDataException.

Formüller şablonlardan veya kullanıcı girdisinden geliyorsa, bu istisnaları yeniden hesaplama ve değer erişimi etrafında yakalayın:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 500, 300);
    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
    IChartDataCell cell = workbook.getCell(0, "A2");
    cell.setFormula("SUM(B2:B5)");

    try {
        workbook.calculateFormulas();
        System.out.println(cell.getValue());
    } catch (CellInvalidFormulaException ex) {
        System.err.println("Invalid formula: " + ex.getMessage());
    } catch (CellInvalidReferenceException ex) {
        System.err.println("Invalid cell reference: " + ex.getMessage());
    } catch (CellCircularReferenceException ex) {
        System.err.println("Circular reference: " + ex.getMessage());
    } catch (CellUnsupportedDataException ex) {
        System.err.println("Unsupported spreadsheet data: " + ex.getMessage());
    }
} finally {
    presentation.dispose();
}

Pratik Sınırlamalar

Grafik çalışma sayfalarındaki formül desteği, tam Excel uyumluluğu yerine tanımlı bir elektronik tablo hesaplama alt kümesi için tasarlanmıştır. Raporlama iş akışınızı tasarlarken bu kısıtlamaları aklınızda bulundurun:

  • Aspose.Slides’ın formülleri yeniden hesaplamasını istediğinizde yalnızca belgelenen sabitleri, operatörleri, referansları ve işlevleri kullanın.
  • Formül sonuçlarının bağımlı olduğu hücreler değiştirildikten sonra yeniden hesaplayın.
  • Yüklenen sunumlardan gelen önbelleğe alınmış değerleri anlık bir kesit olarak değerlendirin; düzenlemeler sonrası yeniden hesaplamanın yerini tutmaz.
  • Mevcut şablonlardaki formülleri, özellikle belgelenen listesinin dışındaki işlevler kullanıyorsa, hesaplanan değerlerine güvenmeden önce test edin.
  • Tam bir elektronik tablo hesaplama motoru gerektiren formüller için bunları dışarıda hesaplayın ve ardından grafik çalışma kitabını elde edilen değerlerle güncelleyin.

SSS

IChartDataCell.setFormula ve IChartDataCell.setR1C1Formula arasındaki fark nedir?

IChartDataCell.setFormula B2-C2 gibi bir A1‑stili ifadeyi depolar. IChartDataCell.setR1C1Formula RC[-2]-RC[-1] gibi bir R1C1‑stili ifadeyi depolar. Formülleri oluşturma veya kopyalama şeklinize en uygun notasyonu kullanın.

Hesaplamadan sonra hücreyi mi yoksa değerini mi okumam gerekir?

IChartDataWorkbook.getCell bir IChartDataCell döndürür. Hesaplanmış sonucu elde etmek için yeniden hesaplamadan sonra o hücrenin IChartDataCell.getValue yöntemini çağırın.

IChartDataWorkbook.calculateFormulas ne zaman çağırmalıyım?

Giriş değerleri veya formüller değiştirildikten sonra ve hesaplanmış sonuçlara ihtiyaç duymadan önce IChartDataWorkbook.calculateFormulas çağırın. Bu, yerleşik çözücünün desteklediği formüllerin değerlerini günceller.

Aspose.Slides her Excel işlevini destekliyor mu?

Hayır. Yerleşik çözücü belgelenen bir işlev alt kümesini destekler. Bu alt kümenin dışındaki işlevlerin doğru şekilde yeniden hesaplanacağını varsaymayın. Tam Excel formül uyumluluğu gerekiyorsa, uygun bir elektronik tablo motoru ile hesaplayıp sonuçları grafik çalışma kitabına yazın.

Yüklenmiş bir sunum desteklenmeyen bir formül içeriyorsa ne olur?

Grafik verileri değiştirilmemişse, çalışma kitabı hâlâ önceden hesaplanmış bir önbellek değerine sahip olabilir. İlgili veri değiştirildikten sonra bu önbellek değeri geçersiz olabilir. Formülü işlenemeyen bir hücreye erişmek CellUnsupportedDataException hatasına yol açabilir.

Formül hata değerleri Java istisnalarıyla aynı mı?

Hayır. #DIV/0! gibi bir sonuç, geçerli bir hesaplamanın ürettiği bir elektronik tablo değeridir. CellInvalidFormulaException veya CellCircularReferenceException gibi istisnalar, formülün normal şekilde işlenemediğini gösterir.

Bir formül hücresi değiştiğinde grafik otomatik olarak güncellenir mi?

Bir grafik serisi çalışma kitabı hücrelerine referans verebilir. Önce çalışma kitabını yeniden hesaplatın, ardından sunumu kaydedin veya render edin. Grafik veri noktaları hesaplanan hücrelere işaret ediyorsa, grafik bu güncel hücre değerlerini kullanır; bu iş akışı için ayrı bir grafik‑yenileme yöntemi gerekmez.

Grafikler harici bir Excel çalışma kitabı kullanabilir mi?

Evet, grafik verileri API aracılığıyla harici bir çalışma kitabı kullanacak şekilde yapılandırılabilir. Ancak bu makalede anlatılan formül hesaplama iş akışı, grafik veri çalışma kitabı ve Aspose.Slides tarafından değerlendirilen formül alt kümesiyle ilgilidir. IChartDataWorkbook.calculateFormulas metodunun harici bir XLSX dosyasındaki rastgele formüllerin tam yeniden hesaplamasını sağladığını varsaymayın.

Başka bir çalışma sayfasına veya çalışma kitabına referans veren formüller kullanabilir miyim?

Excel‑stili referanslar grafik çalışma kitaplarında bulunabilir, ancak formül değerlendirme desteklenen ayrıştırıcı ve işlev setiyle sınırlıdır. Çapraz‑sayfa veya harici bir referans kritik ise, tam formülünüzü hedef Aspose.Slides sürümünüzde doğrulayın. Geniş Excel referans uyumluluğu gerektiren iş akışları için çalışma kitabını dışarıda hesaplayıp elde edilen değerleri grafik verisine geri yazın.

Formül dizeleri = ile başlamalı mı?

Aspose.Slides API örnekleri B2-C2 veya SUM(B2:B5) gibi bir baştaki = olmadan ifadeler atar. Bu biçim, belgelenen API örnekleriyle tutarlılığı korur.