Hantera diagramarbetsböcker i presentationer med PHP
Översikt
Den här artikeln förklarar hur man arbetar med diagramarbetsböcker i Aspose.Slides. Den visar hur man läser och skriver diagramdata via arbetsbokströmmar, använder arbetsboksceller som diagramdatamärkningar, får åtkomst till kalkylbladssamlingar och anger datakälltyp för diagramvärden.
Den täcker även hur man arbetar med externa arbetsböcker som diagramdatakällor. Exemplen demonstrerar hur man skapar och tilldelar en extern arbetsbok, hämtar sökvägen till en extern arbetsbok som är länkad till ett diagram och redigerar diagramdata när arbetsboken är tillgänglig.
Läsa och skriva diagramdata från en arbetsbok
Aspose.Slides tillhandahåller metoderna readWorkbookStream och writeWorkbookStream som låter dig läsa och skriva diagramdataarbetsböcker (innehållande diagramdata redigerad med Aspose.Cells). Obs att diagramdata måste vara organiserad på samma sätt eller ha en struktur som liknar källan.
Denna PHP‑kod demonstrerar ett exempel:
$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();
}
}
Validera diagramlayout efter arbetsboksändring
När du ersätter en inbäddad arbetsbok med en modifierad behåller diagrammet sina ursprungliga serie‑ och kategorisamlingar. Denna avvikelse kan leda till att Chart::validateChartLayout misslyckas med ett index‑out‑of‑range‑fel. Rensa befintliga serier och kategorier innan du skriver tillbaka den uppdaterade arbetsboken till diagrammet.
// Efter att ha ändrat arbetsboksströmmen (t.ex. med Aspose.Cells)
$updatedWorkbook = $chartData->readWorkbookStream();
// Rensa befintliga datreferenser.
$chartData->getSeries()->clear();
$chartData->getCategories()->clear();
$chartData->writeWorkbookStream($updatedWorkbook);
$chart->validateChartLayout();
Att rensa samlingarna säkerställer att diagramdatastrukturen är konsekvent med den nya arbetsboken, vilket gör att validateChartLayout kan slutföras utan fel.
Ange en arbetsboks cell som diagramdatamärkning
- Skapa en instans av klassen Presentation .
- Hämta en bilds referens via dess index.
- Lägg till ett bubbeldiagram med någon data.
- Kom åt diagramserierna.
- Ange arbetsboks‑cellen som en datamärkning.
- Spara presentationen.
Denna PHP‑kod visar hur du anger en arbetsboks cell som en diagramdatamärkning:
$lbl0 = "Label 0 cell value";
$lbl1 = "Label 1 cell value";
$lbl2 = "Label 2 cell value";
# Instansierar en presentationsklass som representerar en presentationsfil
$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();
}
}
Hantera kalkylblad
Denna PHP‑kod demonstrerar en operation där metoden ChartDataWorkbook::getWorksheets används för att komma åt en kalkylbladssamling:
$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();
}
}
Ange datakälltyp
Denna PHP‑kod visar hur du anger en typ för en datakälla:
$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();
}
}
Upptäck osupporterade inbäddade arbetsboksformat
Aspose.Slides stöder inte Excel‑binärarbetsboken (.xlsb) som kan vara inbäddad i vissa diagram. Du kan använda metoden getEmbeddedWorkbookType på ChartData tillsammans med uppräkningen WorkbookType för att upptäcka osupporterade format och hoppa över de diagrammen.
$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) {
# Inbäddad arbetsbok är i .xlsb-format, vilket inte stöds.
continue;
}
# Läs eller ändra diagramarbokens data här.
}
} finally {
$presentation->dispose();
}
Extern arbetsbok
Aspose.Slides stöder externa arbetsböcker som datakälla för diagram.
Skapa en extern arbetsbok
Med metoderna readWorkbookStream och setExternalWorkbook kan du antingen skapa en extern arbetsbok från början eller göra en intern arbetsbok extern.
Denna PHP‑kod demonstrerar processen för att skapa en extern arbetsbok:
$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();
}
}
Ange en extern arbetsbok
Med metoden setExternalWorkbook kan du tilldela en extern arbetsbok till ett diagram som dess datakälla. Metoden kan också användas för att uppdatera sökvägen till den externa arbetsboken (om den senare har flyttats).
Du kan inte redigera data i arbetsböcker som lagras på fjärrplatser eller resurser, men du kan ändå använda sådana arbetsböcker som en extern datakälla. Om en relativ sökväg för en extern arbetsbok anges, konverteras den automatiskt till en fullständig sökväg.
Denna PHP‑kod visar hur du anger en extern arbetsbok:
# Skapar en instans av Presentation-klassen
$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();
}
}
Parametern ChartData (under metoden setExternalWorkbook) används för att ange om en Excel‑arbetsbok ska laddas eller inte.
- När
ChartData‑värdet ärfalseuppdateras endast arbetsbokens sökväg – diagramdata laddas inte och uppdateras inte från mål‑arbetsboken. Detta kan vara lämpligt när mål‑arbetsboken saknas eller är otillgänglig. - När
ChartData‑värdet ärtrueuppdateras diagramdata från mål‑arbetsboken.
# Skapar en instans av Presentation-klassen
$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();
}
}
Hämta den externa datakällans arbetsboks‑sökväg för ett diagram
- Skapa en instans av klassen Presentation .
- Hämta en bilds referens via dess index.
- Skapa ett objekt för diagramformen.
- Skapa ett objekt för källtypen (
ChartDataSourceType) som representerar diagrammets datakälla. - Ange det relevanta villkoret baserat på att källtypen är densamma som den externa arbetsboksdatakälltypen.
Denna PHP‑kod demonstrerar operationen:
# Skapar en instans av Presentation-klassen
$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();
}
# Sparar presentationen
$pres->save("result.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Redigera diagramdata
Du kan redigera data i externa arbetsböcker på samma sätt som du ändrar innehållet i interna arbetsböcker. När en extern arbetsbok inte kan laddas kastas ett undantag.
Denna PHP‑kod är en implementation av den beskrivna processen:
# Skapar en instans av Presentation-klassen
$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();
}
}
Återställ en arbetsbok från diagramcachen
Om ett diagram använder en extern arbetsbok som saknas eller är otillgänglig kan Aspose.Slides rekonstruera diagramarbetsboken från de data som cachas i presentationen. Skapa LoadOptions, konfigurera den med SpreadsheetOptions, och anropa SpreadsheetOptions::setRecoverWorkbookFromChartCache med true innan presentationen öppnas.
Följande PHP‑exempel öppnar en presentation vars diagram refererar till en otillgänglig extern arbetsbok och får åtkomst till de återställda data via Chart::getChartData och 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();
# Läs eller ändra den återställda arbetsbokens data här.
} finally {
$presentation->dispose();
}
Om den externa arbetsboken är otillgänglig och återställning är inaktiverad kastar Aspose.Slides ett undantag. Aktivera återställning endast när användning av cachad diagramdata är ett acceptabelt fallback‑alternativ, eftersom cachen kanske inte innehåller ändringar som gjorts i den externa arbetsboken efter att presentationen senast uppdaterades.
FAQ
Kan jag avgöra om ett specifikt diagram är länkat till en extern eller en inbäddad arbetsbok?
Ja. Ett diagram har en datakälltyp och en sökväg till en extern arbetsbok; om källan är en extern arbetsbok kan du läsa den fullständiga sökvägen för att säkerställa att en extern fil används.
Stöds relativa sökvägar till externa arbetsböcker, och hur lagras de?
Ja. Om du anger en relativ sökväg konverteras den automatiskt till en absolut sökväg. Detta underlättar projektportabilitet; observera dock att presentationen lagrar den absoluta sökvägen i PPTX‑filen.
Kan jag använda arbetsböcker som finns på nätverksresurser/delade mappar?
Ja, sådana arbetsböcker kan användas som en extern datakälla. Direkt redigering av fjärrarbetsböcker från Aspose.Slides stöds däremot inte – de kan endast användas som källa.
Skriver Aspose.Slides över den externa XLSX‑filen när presentationen sparas?
Nej. Presentationen lagrar en länk till den externa filen och använder den för att läsa data. Den externa filen modifieras inte när presentationen sparas.
Vad ska jag göra om den externa filen är lösenordsskyddad?
Aspose.Slides accepterar inte ett lösenord vid länkningsprocessen. En vanlig lösning är att ta bort skyddet i förväg eller förbereda en avkrypterad kopia (t.ex. med Aspose.Cells) och länka till den kopian.
Kan flera diagram referera till samma externa arbetsbok?
Ja. Varje diagram lagrar sin egen länk. Om alla pekar på samma fil kommer en uppdatering av den filen att återspeglas i varje diagram nästa gång data läses.