PowerPoint sunumlarında PHP ile 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 PHP via Java’da bu çalışma sayfasına grafik veri çalışma kitabı aracılığıyla erişebilir, giriş değerlerini yazabilir, hücrelere formüller atayabilir, desteklenen formülleri hesaplayabilir ve hesaplanmış 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 hesaplama, hesaplanmış 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’ta çalışma sayfası, ChartDataWorkbook sınıfı aracılığıyla sunulur. A1‑stili formüller için ChartDataCell::setFormula, R1C1‑stili formüller için ise ChartDataCell::setR1C1Formula kullanın. Giriş hücrelerini veya formülleri değiştirdikten sonra, desteklenen formülleri yeniden hesaplamak ve ilgili hücre değerlerini güncellemek için ChartDataWorkbook::calculateFormulas yöntemini çağırın.

Hesaplanmış bir hücre, sonucunu hâlâ ChartDataCell::getValue aracılığıyla ortaya çıkarır. Bu, kod içinde bir formül sonucunu incelemeniz gerektiğinde veya hücreyi bir grafik veri noktası olarak 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, hesaplanmış hücreleri grafik değerleri olarak kullanır ve sunumu kaydeder.

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 600, 350);
    $workbook = $chart->getChartData()->getChartDataWorkbook();
    $worksheetIndex = 0;

    $chart->getChartData()->getSeries()->clear();
    $chart->getChartData()->getCategories()->clear();
    $workbook->clear($worksheetIndex);

    $category1 = $workbook->getCell($worksheetIndex, "A2", "Q1");
    $category2 = $workbook->getCell($worksheetIndex, "A3", "Q2");
    $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);

    $profit1 = $workbook->getCell($worksheetIndex, "D2");
    $profit2 = $workbook->getCell($worksheetIndex, "D3");
    $profit3 = $workbook->getCell($worksheetIndex, "D4");

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

    $workbook->calculateFormulas();

    $q1Profit = java_values($profit1->getValue()); // 40
    $q2Profit = java_values($profit2->getValue()); // 55
    $q3Profit = java_values($profit3->getValue()); // 25

    echo "Q1 profit: " . $q1Profit . PHP_EOL;
    echo "Q2 profit: " . $q2Profit . PHP_EOL;
    echo "Q3 profit: " . $q3Profit . PHP_EOL;

    $chart->getChartData()->getCategories()->add($category1);
    $chart->getChartData()->getCategories()->add($category2);
    $chart->getChartData()->getCategories()->add($category3);

    $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, böylece grafik hesaplanmış kar değerlerini kullanır. Bu iş akışında ayrı bir grafik‑yenileme çağrısı yoktur: önce çalışma kitabını yeniden hesaplayın, ardından hesaplanan hücrelere işaret eden grafik verisini kullanın veya kaydedin.

A1‑Stili Formüller Kullanma

A1 gösterimi sütunları harflerle, satırları sayılarla tanımlar. A1‑stili ifadeleri ChartDataCell::setFormula aracılığıyla atayın.

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 300);
    $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);

    $cell = $workbook->getCell(0, "A2");
    $cell->setFormula("C3+SUM(F2:H2)");

    $workbook->calculateFormulas();

    $value = java_values($cell->getValue()); // 19
} finally {
    $presentation->dispose();
}

Yaygın A1 referans biçimleri:

Referans Göreceli Mutlak Karma
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öreceli referanslar, bir formül bir elektronik tablo uygulaması tarafından taşındığında veya kopyalandığında değişebilir. Mutlak referanslar her iki koordinatı da sabit tutar, karma referanslar ise yalnızca bir satırı veya bir sütunu sabitler.

R1C1‑Stili Formüller Kullanma

R1C1 gösterimi hem satırları hem de sütunları sayısal olarak tanımlar. Göreceli referanslar köşeli parantez içinde offset kullanır. Bu sözdizimini ChartDataCell::setR1C1Formula aracılığıyla atayın.

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 300);
    $workbook = $chart->getChartData()->getChartDataWorkbook();

    $workbook->getCell(0, "B2")->setValue(12);
    $workbook->getCell(0, "C2")->setValue(5);

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

    $workbook->calculateFormulas();

    $value = java_values($cell->getValue()); // 7
} finally {
    $presentation->dispose();
}

Yaygın R1C1 referans biçimleri:

Referans Göreceli Mutlak Karma
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 değerlendirme motoru mantıksal değerler, sayısal sabitler, metinler, elektronik tablo hata değerleri, aritmetik operatörler ve karşılaştırma operatörlerini destekler.

Sabitler ve Sabit Değerler

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 Kesirli ve bilimsel gösterimler desteklenir.
Metin "abc", "2/3/2020 12:00" Metin sabitleri formül içinde çift tırnak içinde yazılır.
Hata sonucu #DIV/0!, #N/A, #REF! Geçerli bir formül, normal bir sonuç yerine bir elektronik tablo hata değeri döndürebilir.

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

$presentation = new Presentation();
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 300);
    $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();

    $logicalValue = java_values($workbook->getCell(0, "B2")->getValue()); // false
    $numericValue = java_values($workbook->getCell(0, "C2")->getValue()); // 1.5
    $scientificValue = java_values($workbook->getCell(0, "D2")->getValue()); // 0.003
    $stringValue = java_values($workbook->getCell(0, "E2")->getValue()); // abc
    $errorValue = java_values($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 eksi 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 değerlendirme motoru içerir, ancak bu bir tam Excel hesaplama motoru değildir. Belgelenen işlev kümesi aşağıdaki ile sınırlıdır. ChartDataWorkbook::calculateFormulas tarafından rastgele bir Excel işlevinin yeniden hesaplanabileceğini varsaymayın.

İşlev Açıklama veya 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 İndekse 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 sistemini kullanarak tarih değeri oluştur DATE(2026,8,19)
DAYS İki tarih arasındaki gün sayısını döndür DAYS(B2,A2)
FIND Bir metin içinde başka bir metni bul FIND("-",A2)
FINDB Bayt‑temelli 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 topla SUM(B2:B5)
VLOOKUP Dikey arama VLOOKUP(A2,B2:D10,3,FALSE)

Tablodaki kısıtlamalar önemlidir: INDEX referans biçiminde, LOOKUP ve MATCH vektör biçiminde belgelenir. DATE 1900 tarih sistemini kullanır. Burada listelenmeyen işlevler, Aspose.Slides formül değerlendirme motoru 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‑bayt karakter seti (DBCS) kullanan diller için özellikle önemlidir. Bu formülleri doğru şekilde hesaplamak için bir LoadOptions oluşturun, tercih edilen kültürü SpreadsheetOptions::setPreferredCulture ile ayarlayın, elektronik tablo seçeneklerini LoadOptions::setSpreadsheetOptions ile 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 sunum açar ve her grafik çalışma kitabı için ChartDataWorkbook::calculateFormulas yöntemini çağırır:

use aspose\slides\LoadOptions;
use aspose\slides\Presentation;
use aspose\slides\SpreadsheetOptions;

$japaneseCulture = new Java("java.util.Locale", "ja", "JP");

$spreadsheetOptions = new SpreadsheetOptions();
$spreadsheetOptions->setPreferredCulture($japaneseCulture);

$loadOptions = new LoadOptions();
$loadOptions->setSpreadsheetOptions($spreadsheetOptions);

$chartClass = new JavaClass("com.aspose.slides.IChart");
$presentation = new Presentation("presentation.pptx", $loadOptions);
try {
    $slideCount = java_values($presentation->getSlides()->size());
    for ($slideIndex = 0; $slideIndex < $slideCount; $slideIndex++) {
        $slide = $presentation->getSlides()->get_Item($slideIndex);
        $shapeCount = java_values($slide->getShapes()->size());
        for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
            $shape = $slide->getShapes()->get_Item($shapeIndex);
            if (java_instanceof($shape, $chartClass)) {
                $shape->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ğini oluşturmadan önce ayarlayın. Çalışma kitabı formüllerinin beklediği kültürü kullanın; örneğin Japon DBCS hesaplama kurallarına uyması 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 onun son hesaplanmış değerini saklar. Aspose.Slides, bir sunum yüklendiğinde ve ilgili grafik verisi değiştirilmediğinde, ChartDataCell::getValue üzerinden önbelleğe alınmış bir değeri okuyabilir.

Giriş hücrelerini veya formülleri değiştirdikten sonra eski bir önbellek sonucuna güvenmeyin. Hesaplanmış değerleri okumadan veya bunlara bağımlı grafik verisini kaydetmeden önce ChartDataWorkbook::calculateFormulas yöntemini ç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 olmayabilir. Bu durumda, desteklenmeyen veri içeren bir hücreyi okumak CellUnsupportedDataException hatasına yol açabilir.

Grafiğiniz Aspose.Slides’ın değerlendirmediği Excel işlevlerine dayanıyorsa, bu formülleri destekleyen bir elektronik tablo motoru ile hesaplayın ve oluşan değerleri grafik çalışma kitabına geri yazın. Desteklenmeyen formülleri tahmini değerlerle değiştirmeyin.

Formül Hatalarını Ele Alma

İki farklı sorun 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 ChartDataCell::getValue üzerinden döndürülebilir.

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

PHP via Java’da, Java istisnaları JavaException aracılığıyla ortaya çıkar. Formüller şablonlardan veya kullanıcı girişinden geldiğinde, yeniden hesaplama ve değer erişimi etrafında bu istisnaları yakalayın. Yığın izinde bildirilen Java istisnası, belirli elektronik tablo hatasını tanımlar:

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

    try {
        $workbook->calculateFormulas();
        echo java_values($cell->getValue()) . PHP_EOL;
    } catch (JavaException $ex) {
        $ex->printStackTrace();
    }
} finally {
    $presentation->dispose();
}

Pratik Sınırlamalar

Grafik çalışma sayfalarındaki formül desteği, tam Excel uyumluluğu olmayan tanımlı bir elektronik tablo hesaplama alt kümesi içindir. Raporlama iş akışınızı tasarlarken şu 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ğlı olduğu hücreleri değiştirdikten sonra yeniden hesaplayın.
  • Yüklenen sunumlardan gelen önbelleğe alınmış değerleri anlık bir fotoğraf olarak düşünün; düzenlemeler sonrası yeniden hesaplamanın yerine geçmesin.
  • Mevcut şablonlardaki formülleri, belgelenen işlev listesi dışındaki işlevleri içeriyorsa, hesaplanmış 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

ChartDataCell::setFormula ve ChartDataCell::setR1C1Formula arasındaki fark nedir?

ChartDataCell::setFormula B2-C2 gibi bir A1‑stili ifade saklar. ChartDataCell::setR1C1Formula ise RC[-2]-RC[-1] gibi bir R1C1‑stili ifade saklar. Formülleri nasıl oluşturduğunuza veya kopyaladığınıza en uygun gösterimi kullanın.

Hesaplamadan sonra hücreyi mi yoksa değerini mi okumalıyım?

ChartDataWorkbook::getCell bir ChartDataCell döndürür. Hesaplanmış sonucu elde etmek için, yeniden hesaplamadan sonra bu hücrenin ChartDataCell::getValue yöntemini çağırın.

ChartDataWorkbook::calculateFormulas ne zaman çağırılmalı?

Giriş değerlerini veya formülleri değiştirdikten ve hesaplanmış sonuçlara ihtiyaç duymadan önce ChartDataWorkbook::calculateFormulas yöntemini çağırın. Bu, yerleşik değerlendiricinin desteklediği formüllerin değerlerini günceller.

Aspose.Slides her Excel işlevini destekliyor mu?

Hayır. Yerleşik değerlendirici 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, hesaplamayı uygun bir elektronik tablo motoru ile yapın ve son değerleri grafik çalışma kitabına yazın.

Yüklenmiş bir sunumda desteklenmeyen bir formül varsa ne olur?

Grafik verisi değişmemişse, çalışma kitabı hâlâ önceki hesaplanmış önbellek değerini içerebilir. İlgili veri değiştirildiğinde bu önbellek değeri geçerli olmayabilir. Formülü işlenemeyen bir hücreye erişmek CellUnsupportedDataException hatasına yol açabilir.

Formül hata değerleri PHP istisnalarıyla aynı şey midir?

Hayır. #DIV/0! gibi bir sonuç, geçerli bir hesaplamanın ürettiği bir elektronik tablo değeridir. CellInvalidFormulaException veya CellCircularReferenceException gibi spreadsheet‑işleme hataları Java istisnalarıdır ve JavaException aracılığıyla PHP’ye yansıtılır.

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 hesaplayın, ardından sunumu kaydedin veya render edin. Grafik veri noktaları hesaplanmış hücrelere işaret ediyorsa, grafik bu güncellenmiş 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 verisi harici bir çalışma kitabı kullanacak şekilde yapılandırılabilir. Ancak bu makalede açıklanan formül hesaplama iş akışı, grafik veri çalışma kitabı ve Aspose.Slides tarafından değerlendirilen formül alt kümesiyle sınırlıdır. ChartDataWorkbook::calculateFormulas yönteminin harici bir XLSX dosyasındaki rastgele formülleri tam olarak yeniden hesaplayacağını varsaymayın.

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

Excel‑stili referanslar grafik çalışma kitaplarında bulunabilir, ancak formül değerlendirmesi desteklenen ayrıştırıcı ve işlev kümesiyle sınırlıdır. Çapraz‑sayfa veya harici bir referans kritikse, hedef Aspose.Slides sürümünüzde tam formülü doğrulayın. Geniş Excel referans uyumluluğu gerektiren iş akışları için çalışma kitabını dışarıda hesaplayın ve çözülen 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 ön ek = olmadan ifadeler atar. Bu biçimi kullanmak, oluşturulan formüllerin belgelenen API örnekleriyle tutarlı olmasını sağlar.