Hantera diagramarbetsböcker i presentationer i .NET

Översikt

Denna artikel förklarar hur du arbetar med diagramarbetsböcker i Aspose.Slides. Den visar hur du läser och skriver diagramdata via arbetsbokströmmar, använder arbetsboksceller som diagramdatatagg, kommer åt samlingar av kalkylblad och anger datakälltyp för diagramvärden.

Den behandlar också arbete med externa arbetsböcker som diagramdatakällor. Exemplen demonstrerar hur du 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.

För arbetsboksceller som representerar saknade data, se Styr visning av tomma celler för skillnaden mellan en tom cell och noll, samt en linjediagramjämförelse av de tillgängliga visningslägena.

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 (som innehåller diagramdata redigerad med Aspose.Cells). Obs att diagramdata måste vara organiserade på samma sätt eller ha en struktur som liknar källan.

using Aspose.Slides;
using Aspose.Slides.Charts;

using (Presentation pres = new Presentation("chart.pptx"))
{
    Chart chart = (Chart) pres.Slides[0].Shapes[0];
    IChartData data = chart.ChartData;

    MemoryStream stream = data.ReadWorkbookStream();

    data.Series.Clear();
    data.Categories.Clear();

    stream.Position = 0;
    data.WriteWorkbookStream(stream);
}

Validera diagramlayout efter ändring av arbetsbok

När du ersätter en inbäddad arbetsbok med en modifierad behåller diagrammet sina ursprungliga serie‑ och kategorisamlingar. Detta mismatch kan leda till att IChart.ValidateChartLayout misslyckas med ett index‑out‑of‑range‑fel. Rensa befintliga serier och kategorier innan du skriver den uppdaterade arbetsboken tillbaka till diagrammet.

// Efter att ha modifierat arbetsbokströmmen (t.ex. med Aspose.Cells)
using var updatedWorkbook = chartData.ReadWorkbookStream();

// Rensa befintliga datareferenser.
chartData.Series.Clear();
chartData.Categories.Clear();

updatedWorkbook.Position = 0;
chartData.WriteWorkbookStream(updatedWorkbook);

chart.ValidateChartLayout();

Att rensa samlingarna säkerställer att diagramdatans struktur är konsekvent med den nya arbetsboken, vilket gör att ValidateChartLayout kan slutföras utan fel.

Ange en arbetsboks cell som diagramdatatagg

  1. Skapa en instans av klassen Presentation.
  2. Hämta en bildspelsreferens via dess index.
  3. Lägg till ett bubbeldiagram med någon data.
  4. Kom åt diagramserierna.
  5. Ange arbetsbokscellen som en datatagg.
  6. Spara presentationen.
using Aspose.Slides;
using Aspose.Slides.Charts;

string lbl0 = "Label 0 cell value";
string lbl1 = "Label 1 cell value";
string lbl2 = "Label 2 cell value";

// Instansierar en presentationsklass som representerar en presentationsfil 
using (Presentation pres = new Presentation("chart2.pptx"))
{
    ISlide slide = pres.Slides[0];


    IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Bubble, 50, 50, 600, 400, true);

    IChartSeriesCollection series = chart.ChartData.Series;

    series[0].Labels.DefaultDataLabelFormat.ShowLabelValueFromCell = true;

    IChartDataWorkbook wb = chart.ChartData.ChartDataWorkbook;

    series[0].Labels[0].ValueFromCell = wb.GetCell(0, "A10", lbl0);
    series[0].Labels[1].ValueFromCell = wb.GetCell(0, "A11", lbl1);
    series[0].Labels[2].ValueFromCell = wb.GetCell(0, "A12", lbl2);

    pres.Save("resultchart.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
}

Hantera arbetsblad

Denna C#‑kod demonstrerar en operation där egenskapen IChartDataWorkbook.Worksheets används för att komma åt en samling av arbetsblad:

using Aspose.Slides;
using Aspose.Slides.Charts;

using (Presentation pres = new Presentation())
{
   IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 500);
   IChartDataWorkbook wb =  chart.ChartData.ChartDataWorkbook;
   for (int i = 0; i < wb.Worksheets.Count; i++)
      Console.WriteLine(wb.Worksheets[i].Name);
}

Specificera datakälltyp

Denna C#‑kod visar hur du specificerar en typ för en datakälla:

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using (Presentation pres = new Presentation())
{
    IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Column3D, 50, 50, 600, 400, true);
    IStringChartValue val = chart.ChartData.Series[0].Name;
    
    val.DataSourceType = DataSourceType.StringLiterals;
    val.Data = "LiteralString";

    val = chart.ChartData.Series[1].Name;
    val.Data = chart.ChartData.ChartDataWorkbook.GetCell(0, "B1", "NewCell");

    pres.Save("pres.pptx", SaveFormat.Pptx);
}

Detektera icke‑stödda inbäddade arbetsboksformat

Aspose.Slides stöder inte Excel‑binärarbetsboken (.xlsb) som kan vara inbäddad i vissa diagram. Du kan använda egenskapen EmbeddedWorkbookType på IChartData tillsammans med uppräkningen WorkbookType för att identifiera icke‑stödda format och hoppa över de diagrammen.

using Aspose.Slides;
using Aspose.Slides.Charts;

using (var presentation = new Presentation("sample.pptx"))
{
    var slide = presentation.Slides[0];

    foreach (var shape in slide.Shapes)
    {
        if (shape is not IChart chart) continue;

        var chartData = chart.ChartData;

        if (chartData.DataSourceType == ChartDataSourceType.InternalWorkbook &&
            chartData.EmbeddedWorkbookType == WorkbookType.WorkbookBinaryMacro)
        {
            // Inbäddad arbetsbok är i .xlsb-format, vilket inte stöds.
            continue;
        }

        // Läs eller ändra diagramarbokens data här.
    }
}

Extern arbetsbok

Aspose.Slides stöder att använda externa arbetsböcker som datakälla för diagram.

Skapa en extern arbetsbok

Med hjälp av metoderna ReadWorkbookStream och SetExternalWorkbook kan du antingen skapa en extern arbetsbok från grunden eller göra en intern arbetsbok extern.

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using (Presentation pres = new Presentation())
{
    const string workbookPath = "externalWorkbook1.xlsx";

    IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 600);
    using (FileStream fileStream = new FileStream(workbookPath, FileMode.Create))
    {
        byte[] workbookData = chart.ChartData.ReadWorkbookStream().ToArray();
        fileStream.Write(workbookData, 0, workbookData.Length);
    }
    
    chart.ChartData.SetExternalWorkbook(Path.GetFullPath(workbookPath));

    pres.Save("externalWorkbook.pptx", SaveFormat.Pptx);
}

Ange en extern arbetsbok

Med metoden SetExternalWorkbook kan du tilldela en extern arbetsbok till ett diagram som dess datakälla. Metoden kan även användas för att uppdatera sökvägen till den externa arbetsboken (om den senare har flyttats).

Även om du inte kan redigera data i arbetsböcker som lagras på fjärrplatser eller resurser, kan sådana arbetsböcker fortfarande användas 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.

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

// Sökvägen till dokumentkatalogen.
using (Presentation pres = new Presentation())
{
    IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 600, false);
    IChartData chartData = chart.ChartData;
                    
    chartData.SetExternalWorkbook(Path.GetFullPath("externalWorkbook.xlsx"));
                  

    chartData.Series.Add(chartData.ChartDataWorkbook.GetCell(0, "B1"), ChartType.Pie);
    chartData.Series[0].DataPoints.AddDataPointForPieSeries(chartData.ChartDataWorkbook.GetCell(0, "B2"));
    chartData.Series[0].DataPoints.AddDataPointForPieSeries(chartData.ChartDataWorkbook.GetCell(0, "B3"));
    chartData.Series[0].DataPoints.AddDataPointForPieSeries(chartData.ChartDataWorkbook.GetCell(0, "B4"));

    chartData.Categories.Add(chartData.ChartDataWorkbook.GetCell(0, "A2"));
    chartData.Categories.Add(chartData.ChartDataWorkbook.GetCell(0, "A3"));
    chartData.Categories.Add(chartData.ChartDataWorkbook.GetCell(0, "A4"));
    pres.Save("Presentation_with_externalWorkbook.pptx", SaveFormat.Pptx);
}

Parametern ChartData (under metoden SetExternalWorkbook) används för att ange om en excel‑arbetsbok ska laddas eller inte.

  • När ChartData‑värdet sätts till false uppdateras endast arbetsbokens sökväg – diagramdata laddas inte och uppdateras inte från mål‑arbetsboken. Detta kan vara önskvärt när mål‑arbetsboken saknas eller är otillgänglig.
  • När ChartData‑värdet sätts till true uppdateras diagramdata från mål‑arbetsboken.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using (Presentation pres = new Presentation())
{
	IChart chart = pres.Slides[0].Shapes.AddChart(ChartType.Pie, 50, 50, 400, 600, true);
	IChartData chartData = chart.ChartData;

	(chartData as ChartData).SetExternalWorkbook("http://path/doesnt/exists", false);

	pres.Save("SetExternalWorkbookWithUpdateChartData.pptx", SaveFormat.Pptx);
}

Hämta den externa datakällans arbetsbokssökväg för ett diagram

  1. Skapa en instans av klassen Presentation.
  2. Hämta en bildspelsreferens via dess index.
  3. Skapa ett objekt för diagramformen.
  4. Skapa ett objekt för källtypen (ChartDataSourceType) som representerar diagrammets datakälla.
  5. Specificera det relevanta villkoret baserat på att källtypen är densamma som den externa arbetsbokens datakälltyp.
using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using (Presentation pres = new Presentation("pres.pptx"))
{
    ISlide slide = pres.Slides[1];
    IChart chart = (IChart)slide.Shapes[0];
    ChartDataSourceType sourceType = chart.ChartData.DataSourceType;
    if (sourceType == ChartDataSourceType.ExternalWorkbook)
    {
        string path = chart.ChartData.ExternalWorkbookPath;
    }
    
    // Sparar presentationen
    pres.Save("Result.pptx", SaveFormat.Pptx);
}

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.

using Aspose.Slides;
using Aspose.Slides.Charts;
using Aspose.Slides.Export;

using (Presentation pres = new Presentation("presentation.pptx"))
{
    IChart chart = pres.Slides[0].Shapes[0] as IChart;
    ChartData chartData = (ChartData)chart.ChartData;
                   

    chartData.Series[0].DataPoints[0].Value.AsCell.Value = 100;
    pres.Save("presentation_out.pptx", SaveFormat.Pptx);
}

Återskapa en arbetsbok från diagramcachen

Om ett diagram använder en extern arbetsbok som saknas eller är otillgänglig kan Aspose.Slides rekonstruera diagramarboken från data som cachats i presentationen. Skapa LoadOptions, konfigurera dess SpreadsheetOptions, och sätt ISpreadsheetOptions.RecoverWorkbookFromChartCache till true innan presentationen öppnas.

Följande C#‑exempel öppnar en presentation vars diagram refererar till en otillgänglig extern arbetsbok och får åtkomst till den återställda datan via IChart.ChartData och IChartData.ChartDataWorkbook:

using Aspose.Slides;
using Aspose.Slides.Charts;

var loadOptions = new LoadOptions
{
    SpreadsheetOptions = new SpreadsheetOptions
    {
        RecoverWorkbookFromChartCache = true
    }
};

using var presentation = new Presentation("presentation.pptx", loadOptions);

var chart = (IChart)presentation.Slides[0].Shapes[0];
var recoveredWorkbook = chart.ChartData.ChartDataWorkbook;

// Read or modify the recovered workbook data here.

Om den externa arbetsboken är otillgänglig och återställning är inaktiverad kastar Aspose.Slides ett InvalidOperationException. Aktivera återställning endast när användning av den cachade diagramdatan är ett acceptabelt 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 hela 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 är praktiskt för projektportabilitet; observera dock att presentationen lagrar den absoluta sökvägen i PPTX‑filen.

Kan jag använda arbetsböcker som ligger på nätverksresurser/delade mappar?
Ja, sådana arbetsböcker kan användas som en extern datakälla. Redigering av fjärrarbetsböcker direkt från Aspose.Slides stöds dock 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änkning. Ett vanligt tillvägagångssätt ä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 de alla pekar på samma fil kommer en uppdatering av filen att återspeglas i varje diagram nästa gång data läses.