Správa sešitů diagramů v prezentacích pomocí PHP

Přehled

Tento článek vysvětluje, jak pracovat s diagramy v sešitech v Aspose.Slides. Ukazuje, jak číst a zapisovat data diagramu prostřednictvím proudů sešitu, používat buňky sešitu jako popisky dat diagramu, přistupovat k kolekcím listů a určit typ zdroje dat pro hodnoty diagramu.

Také popisuje práci s externími sešity jako zdroji dat diagramu. Příklady ukazují, jak vytvořit a přiřadit externí sešit, získat cestu k externímu sešitu propojenému s diagramem a upravit data diagramu, když je sešit k dispozici.

Čtení a zápis dat diagramu ze sešitu

Aspose.Slides poskytuje metody readWorkbookStream a writeWorkbookStream, které umožňují číst a zapisovat sešity dat diagramu (obsahující data diagramu upravená pomocí Aspose.Cells). Poznámka: data diagramu musejí být uspořádána stejným způsobem nebo mít strukturu podobnou zdroji.

Tento PHP kód ukazuje vzorovou operaci:

  $pres = new Presentation("chart.pptx");
  try {
    $chart = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);
    $data = $chart->getChartData();
    $stream = $data->readWorkbookStream();
    $data->getSeries()->clear();
    $data->getCategories()->clear();
    $data->writeWorkbookStream($stream);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Ověření rozvržení diagramu po úpravě sešitu

Když nahradíte vložený sešit upraveným, diagram si zachová původní kolekce řad a kategorií. Tento nesoulad může způsobit, že Chart::validateChartLayout selže s chybou index‑out‑of‑range. Před zápisem aktualizovaného sešitu zpět do diagramu vymažte existující řady a kategorie.

// Po úpravě proudu sešitu (např. pomocí Aspose.Cells)
$updatedWorkbook = $chartData->readWorkbookStream();

// Vymazat existující odkazy na data.
$chartData->getSeries()->clear();
$chartData->getCategories()->clear();

$chartData->writeWorkbookStream($updatedWorkbook);

$chart->validateChartLayout();

Vyprázdnění kolekcí zajistí, že struktura dat diagramu bude konzistentní s novým sešitem, což umožní validateChartLayout dokončit běh bez chyb.

Nastavení buňky sešitu jako popisku dat diagramu

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na snímek pomocí jeho indexu.
  3. Přidejte bublinový diagram s nějakými daty.
  4. Přistupte k řadám diagramu.
  5. Nastavte buňku sešitu jako popisek dat.
  6. Uložte prezentaci.

Tento PHP kód ukazuje, jak nastavit buňku sešitu jako popisek dat diagramu:

  $lbl0 = "Label 0 cell value";
  $lbl1 = "Label 1 cell value";
  $lbl2 = "Label 2 cell value";
  # Vytvoří instanci třídy prezentace, která představuje soubor prezentace
  $pres = new Presentation("chart2.pptx");
  try {
    $slide = $pres->getSlides()->get_Item(0);
    $chart = $slide->getShapes()->addChart(ChartType::Bubble, 50, 50, 600, 400, true);
    $series = $chart->getChartData()->getSeries();
    $dataLabelCollection = $series->get_Item(0)->getLabels();
    $dataLabelCollection->getDefaultDataLabelFormat()->setShowLabelValueFromCell(true);
    $wb = $chart->getChartData()->getChartDataWorkbook();
    $dataLabelCollection->get_Item(0)->setValueFromCell($wb->getCell(0, "A10", $lbl0));
    $dataLabelCollection->get_Item(1)->setValueFromCell($wb->getCell(0, "A11", $lbl1));
    $dataLabelCollection->get_Item(2)->setValueFromCell($wb->getCell(0, "A12", $lbl2));
    $pres->save("resultchart.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Správa listů

Tento PHP kód demonstruje operaci, při které je použita metoda ChartDataWorkbook::getWorksheets k přístupu ke kolekci listů:

  $pres = new Presentation();
  try {
    $chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 500);
    $wb = $chart->getChartData()->getChartDataWorkbook();
    for($i = 0; $i < java_values($wb->getWorksheets()->size()) ; $i++) {
      echo($wb->getWorksheets()->get_Item($i)->getName());
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Určení typu zdroje dat

Tento PHP kód ukazuje, jak specifikovat typ pro zdroj dat:

  $pres = new Presentation();
  try {
    $chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Column3D, 50, 50, 600, 400, true);
    $val = $chart->getChartData()->getSeries()->get_Item(0)->getName();
    $val->setDataSourceType(DataSourceType::StringLiterals);
    $val->setData("LiteralString");
    $val = $chart->getChartData()->getSeries()->get_Item(1)->getName();
    $val->setData($chart->getChartData()->getChartDataWorkbook()->getCell(0, "B1", "NewCell"));
    $pres->save("pres.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Detekce nepodporovaných formátů vložených sešitů

Aspose.Slides nepodporuje binární formát Excelu (.xlsb), který lze vložit do některých diagramů. K detekci nepodporovaných formátů a jejich přeskočení můžete použít metodu getEmbeddedWorkbookType na ChartData spolu s výčtem WorkbookType.

$presentation = new Presentation("sample.pptx");
try {
  $slide = $presentation->getSlides()->get_Item(0);
  $shapes = $slide->getShapes();

  for ($shapeIndex = 0; $shapeIndex < java_values($shapes->size()); $shapeIndex++) {
    $shape = $shapes->get_Item($shapeIndex);

    if (!java_instanceof($shape, new JavaClass("com.aspose.slides.IChart"))) {
      continue;
    }

    $chart = $shape;
    $chartData = $chart->getChartData();

    if (java_values($chartData->getDataSourceType()) == ChartDataSourceType::InternalWorkbook &&
        java_values($chartData->getEmbeddedWorkbookType()) == WorkbookType::WorkbookBinaryMacro) {
      # Vložený sešit je ve formátu .xlsb, který není podporován.
      continue;
    }

    # Zde přečtěte nebo upravte data sešitu diagramu.
  }
} finally {
  $presentation->dispose();
}

Externí sešit

Aspose.Slides podporuje externí sešity jako zdroj dat pro diagramy.

Vytvoření externího sešitu

Pomocí metod readWorkbookStream a setExternalWorkbook můžete buď vytvořit externí sešit od nuly, nebo učinit interní sešit externím.

Tento PHP kód demonstruje proces vytvoření externího sešitu:

  $pres = new Presentation();
  $Array = new java_class("java.lang.reflect.Array");
  try {
    $workbookPath = "externalWorkbook1.xlsx";
    $chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600);
    $fileStream = new Java("java.io.FileOutputStream", $workbookPath);
    $Array = new java_class("java.lang.reflect.Array");
    try {
      $workbookData = $chart->getChartData()->readWorkbookStream();
      $fileStream->write($workbookData, 0, $Array->getLength($workbookData));
    } finally {
      if (!java_is_null($fileStream)) {
        $fileStream->close();
      }
    }
    $chart->getChartData()->setExternalWorkbook($workbookPath);
    $pres->save("externalWorkbook.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Nastavení externího sešitu

Pomocí metody setExternalWorkbook můžete přiřadit externí sešit k diagramu jako jeho zdroj dat. Tato metoda může být také použita k aktualizaci cesty k externímu sešitu (pokud byl přesunut).

I když není možné upravovat data v sešitech uložených na vzdálených místech nebo zdrojích, můžete takové sešity nadále používat jako externí zdroj dat. Pokud je zadána relativní cesta k externímu sešitu, automaticky se převede na úplnou cestu.

Tento PHP kód ukazuje, jak nastavit externí sešit:

  # Vytvoří instanci třídy Presentation
  $pres = new Presentation("chart.pptx");
  try {
    $chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600, false);
    $chartData = $chart->getChartData();
    $chartData->setExternalWorkbook("externalWorkbook.xlsx");
    $chartData->getSeries()->add($chartData->getChartDataWorkbook()->getCell(0, "B1"), ChartType::Pie);
    $chartData->getSeries()->get_Item(0)->getDataPoints()->addDataPointForPieSeries($chartData->getChartDataWorkbook()->getCell(0, "B2"));
    $chartData->getSeries()->get_Item(0)->getDataPoints()->addDataPointForPieSeries($chartData->getChartDataWorkbook()->getCell(0, "B3"));
    $chartData->getSeries()->get_Item(0)->getDataPoints()->addDataPointForPieSeries($chartData->getChartDataWorkbook()->getCell(0, "B4"));
    $chartData->getCategories()->add($chartData->getChartDataWorkbook()->getCell(0, "A2"));
    $chartData->getCategories()->add($chartData->getChartDataWorkbook()->getCell(0, "A3"));
    $chartData->getCategories()->add($chartData->getChartDataWorkbook()->getCell(0, "A4"));
    $pres->save("Presentation_with_externalWorkbook.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Parametr ChartData (u metody setExternalWorkbook) slouží k určení, zda bude Excel sešit načten nebo ne.

  • Když je hodnota ChartData nastavena na false, aktualizuje se pouze cesta k sešitu — data diagramu nebudou načtena ani aktualizována ze cílového sešitu. Toto nastavení je užitečné, když cílový sešit neexistuje nebo není dostupný.
  • Když je hodnota ChartData nastavena na true, data diagramu se aktualizují ze cílového sešitu.
  # Vytvoří instanci třídy Presentation
  $pres = new Presentation("chart.pptx");
  try {
    $chart = $pres->getSlides()->get_Item(0)->getShapes()->addChart(ChartType::Pie, 50, 50, 400, 600, true);
    $chartData = $chart->getChartData();
    $chartData->setExternalWorkbook("http://path/doesnt/exists", false);
    $pres->save("Presentation_with_externalWorkbookWithUpdateChartData.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Získání cesty k externímu zdroji dat sešitu diagramu

  1. Vytvořte instanci třídy Presentation.
  2. Získejte odkaz na snímek pomocí jeho indexu.
  3. Vytvořte objekt pro tvar diagramu.
  4. Vytvořte objekt pro typ zdroje (ChartDataSourceType), který představuje zdroj dat diagramu.
  5. Specifikujte příslušnou podmínku na základě toho, že typ zdroje je stejný jako typ externího zdroje dat sešitu.

Tento PHP kód demonstruje operaci:

  # Vytvoří instanci třídy Presentation
  $pres = new Presentation("chart.pptx");
  try {
    $slide = $pres->getSlides()->get_Item(1);
    $chart = $slide->getShapes()->get_Item(0);
    $sourceType = $chart->getChartData()->getDataSourceType();
    if ($sourceType == ChartDataSourceType::ExternalWorkbook) {
      $path = $chart->getChartData()->getExternalWorkbookPath();
    }
    # Uloží prezentaci
    $pres->save("result.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Úprava dat diagramu

Data v externích sešitech můžete upravovat stejným způsobem jako v interních sešitech. Když se externí sešit načíst nepodaří, je vyvolána výjimka.

Tento PHP kód je implementací popsaného postupu:

  # Vytvoří instanci třídy Presentation
  $pres = new Presentation("chart.pptx");
  try {
    $chart = $pres->getSlides()->get_Item(0)->getShapes()->get_Item(0);
    $chartData = $chart->getChartData();
    $chartData->getSeries()->get_Item(0)->getDataPoints()->get_Item(0)->getValue()->getAsCell()->setValue(100);
    $pres->save("presentation_out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Obnovení sešitu z vyrovnávací paměti diagramu

Pokud diagram používá externí sešit, který chybí nebo není dostupný, Aspose.Slides může obnovit sešit diagramu z dat uložených ve vyrovnávací paměti prezentace. Vytvořte LoadOptions, nakonfigurujte jej pomocí SpreadsheetOptions, a před otevřením prezentace zavolejte SpreadsheetOptions::setRecoverWorkbookFromChartCache s true.

Následující PHP příklad otevírá prezentaci, jejíž diagram odkazuje na nedostupný externí sešit, a přistupuje k obnoveným datům přes Chart::getChartData a ChartData::getChartDataWorkbook:

$spreadsheetOptions = new SpreadsheetOptions();
$spreadsheetOptions->setRecoverWorkbookFromChartCache(true);

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

$presentation = new Presentation("presentation.pptx", $loadOptions);
try {
    $chart = $presentation->getSlides()->get_Item(0)->getShapes()->get_Item(0);
    $recoveredWorkbook = $chart->getChartData()->getChartDataWorkbook();

    # Zde přečtěte nebo upravte data obnoveného sešitu.
} finally {
    $presentation->dispose();
}

Pokud je externí sešit nedostupný a obnovení je zakázáno, Aspose.Slides vyhodí výjimku. Obnovení povolte pouze tehdy, když je použití dat z vyrovnávací paměti přijatelnou záložní možností, protože vyrovnávací paměť nemusí obsahovat změny provedené v externím sešitu po poslední aktualizaci prezentace.

Často kladené otázky

Mohu zjistit, zda je konkrétní diagram propojen s externím nebo vloženým sešitem?

Ano. Diagram má typ zdroje dat a cestu k externímu sešitu; pokud je zdroj externí sešit, můžete přečíst úplnou cestu a ověřit, že je použita externí soubor.

Jsou podporovány relativní cesty k externím sešitům a jak jsou ukládány?

Ano. Pokud zadáte relativní cestu, automaticky se převede na absolutní cestu. To je výhodné pro přenositelnost projektu; buďte však vědomi, že prezentace uloží absolutní cestu v souboru PPTX.

Mohu používat sešity umístěné na síťových zdrojích/sdílených složkách?

Ano, takové sešity lze použít jako externí zdroj dat. Přímé úpravy vzdálených sešitů z Aspose.Slides však nejsou podporovány — lze je jen použít jako zdroj.

Přepisuje Aspose.Slides externí XLSX při ukládání prezentace?

Ne. Prezentace uloží odkaz na externí soubor a používá jej k čtení dat. Externí soubor samotný není při ukládání prezentace změněn.

Co mám dělat, když je externí soubor chráněn heslem?

Aspose.Slides nepřijímá heslo při vytváření odkazu. Běžný postup je odstranit ochranu předem nebo připravit dešifrovanou kopii (například pomocí Aspose.Cells) a odkazovat na tuto kopii.

Mohou více diagramů odkazovat na stejný externí sešit?

Ano. Každý diagram uchovává svůj vlastní odkaz. Pokud všechny ukazují na stejný soubor, jeho aktualizace se projeví v každém diagramu při dalším načtení dat.