Διαχείριση Σειρών Δεδομένων Διαγραμμάτων σε Παρουσιάσεις σε Android

Επισκόπηση

Ένα διάγραμμα μπορεί να αποθηκεύει τις τιμές που σχεδιάζει σε κελιά του βιβλίου εργασίας ή απευθείας ως αριθμητικά κυριολεκτικά. Ένα IChartSeries αντιπροσωπεύει ένα σύνολο σχετικών τιμών και κάθε IChartDataPoint αντιπροσωπεύει ένα σημείο σε αυτή τη σειρά. Τα αντικείμενα IChartCategory παρέχουν τις ετικέτες ή τις τιμές ομαδοποίησης που μοιράζονται οι σειρές. Σε διαγράμματα που δημιουργούνται με προεπιλεγμένα δεδομένα, τα ονόματα σειρών, οι κατηγορίες και οι τιμές σημείων χρησιμοποιούν αντικείμενα IChartDataCell από το βιβλίο εργασίας του διαγράμματος.

Για ένα τυπικό διάγραμμα κατηγορίας, το προεπιλεγμένο βιβλίο εργασίας χρησιμοποιεί τη σειρά 0 για τα ονόματα των σειρών, τη στήλη 0 για τα ονόματα των κατηγοριών και τα υπόλοιπα κελιά για τις τιμές των σειρών. Οι δείκτες φύλλου εργασίας, σειράς και στήλης που περνούν στο IChartDataWorkbook.getCell είναι μηδενική βάση. Αυτή η διάταξη είναι χρήσιμη όταν δημιουργείτε ένα διάγραμμα με προεπιλεγμένα δεδομένα, αλλά μη υποθέτετε ότι κάθε υπάρχον διάγραμμα τη χρησιμοποιεί. Για μια φορτωμένη παρουσίαση, εξετάστε τα κελιά στα οποία αναφέρονται οι σειρές, οι κατηγορίες και τα σημεία δεδομένων πριν αλλάξετε τις τιμές του βιβλίου εργασίας.

Οι ρυθμίσεις του διαγράμματος έχουν τρεις διαφορετικές εμβέλειες:

  • Ρυθμίσεις επιπέδου σειράς, όπως το IChartSeries.getFormat, παρέχουν την προεπιλεγμένη εμφάνιση για όλα τα σημεία μιας σειράς.
  • Ρυθμίσεις σημείου δεδομένων, όπως το IChartDataPoint.getFormat, παρακάμπτουν την εμφάνιση της σειράς για ένα σημείο.
  • Ρυθμίσεις ομάδας εφαρμόζονται σε συμβατές σειρές που ανήκουν στο ίδιο IChartSeriesGroup. Πρόσβαση στην ομάδα μέσω του IChartSeries.getParentSeriesGroup όταν χρειάζεται να ορίσετε επιλογές όπως η επικάλυψη ή το πλάτος κενών.

Όταν δεν έχει οριστεί ρητή γεμίσματος σημείου ή σειράς, το στυλ και το θέμα του διαγράμματος καθορίζουν την αυτόματη εμφάνιση. Όταν υπάρχουν και μορφοποίηση σειράς και σημείου, η μορφοποίηση σημείου έχει προτεραιότητα για εκείνο το σημείο.

Σειρές διαγράμματος PowerPoint

Ορισμός Τιμών Σειράς Χρησιμοποιώντας Αριθμητικά Κυριολεκτικά

Χρησιμοποιήστε αριθμητικά κυριολεκτικά όταν οι τιμές της σειράς προέρχονται από δεδομένα ή υπολογισμούς της εφαρμογής και δεν απαιτούν αναφορές σε κελιά του φύλλου. Καλέστε το setDataSourceTypeForValues με το DataSourceType.DoubleLiterals πριν αναθέσετε σε κάθε σημείο το αποτέλεσμα του getValue μέσω του setAsLiteralDouble.

Η ρύθμιση της συλλογής ελέγχει τον τύπο πηγής όλων των τιμών σημείων σε αυτή τη σειρά. Η μέθοδος getDataSourceType του κάθε σημείου αναφέρει τον επιλεγμένο τύπο· αλλάξτε το μέσω της ρύθμισης της συλλογής. Με το Worksheet, χρησιμοποιήστε το getAsCell για πρόσβαση στο κελί αναφοράς. Με το DoubleLiterals, χρησιμοποιήστε το getAsLiteralDouble ή το setAsLiteralDouble για ανάγνωση ή εγγραφή του αριθμού άμεσα.

Το παρακάτω παράδειγμα δημιουργεί ένα διάγραμμα στήλης με προεπιλεγμένες σειρές και κατηγορίες, στη συνέχεια αναθέτει τις υπολογισμένες τιμές 10, 20 κ.ο.κ. στα υπάρχοντα σημεία της πρώτης σειράς. Αποθηκεύει την παρουσίαση, την ανοίγει ξανά και εκτυπώνει τις αποθηκευμένες τιμές.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 300);
    IChartSeries series = chart.getChartData().getSeries().get_Item(0);

    series.getDataPoints().setDataSourceTypeForValues(DataSourceType.DoubleLiterals);
    for (int i = 0; i < series.getDataPoints().size(); i++) {
        series.getDataPoints().get_Item(i).getValue().setAsLiteralDouble((i + 1) * 10);
    }

    presentation.save("numeric_literals.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Presentation reopenedPresentation = new Presentation("numeric_literals.pptx");
try {
    ISlide reopenedSlide = reopenedPresentation.getSlides().get_Item(0);
    IChart reopenedChart = (IChart) reopenedSlide.getShapes().get_Item(0);
    IChartSeries reopenedSeries = reopenedChart.getChartData().getSeries().get_Item(0);
    for (IChartDataPoint point : reopenedSeries.getDataPoints()) {
        System.out.println(point.getValue().getAsLiteralDouble());
    }
} finally {
    reopenedPresentation.dispose();
}

Ο τύπος πηγής τιμής σημείου είναι ξεχωριστός από το IChartData.getDataSourceType, το οποίο προσδιορίζει τη διαμόρφωση εσωτερικού ή εξωτερικού βιβλίου εργασίας του διαγράμματος. Η χρήση αριθμητικών κυριολεκτικών δεν αφαιρεί, από μόνη της, το ενσωματωμένο βιβλίο εργασίας. Σε αυτό το παράδειγμα, το βιβλίο εργασίας παραμένει διαθέσιμο για ετικέτες κατηγοριών, ονόματα σειρών και τις άλλες σειρές. Δείτε το Chart Workbook για διαχείριση βιβλίου εργασίας.

Για διαγράμματα διασποράς και φυσαλίδων, χρησιμοποιήστε το setDataSourceTypeForXValues και το setDataSourceTypeForYValues για να επιλέξετε τις πηγές των getXValue και getYValue. Τα διαγράμματα φυσαλίδων χρησιμοποιούν επίσης το setDataSourceTypeForBubbleSizes για το getBubbleSize. Ορίστε κάθε εφαρμόσιμοπροέξοδο σε DoubleLiterals πριν αναθέσετε αριθμούς μέσω της μεθόδου setAsLiteralDouble του αντίστοιχου τιμής.

Ορισμός Επικάλυψης Σειρών Διαγράμματος

Το IChartSeries.getOverlap αναφέρει πόσο οι μπάρες ή στήλες επικαλύπτονται σε 2D διάγραμμα, από -100 έως 100 τοις εκατό. Είναι μια ανάγνωση μόνο προβολής της ρύθμισης στην γονική ομάδα σειρών. Χρησιμοποιήστε το IChartSeriesGroup.setOverlap για να ενημερώσετε κάθε συμβατή σειρά σε αυτή την ομάδα. Η επιλογή αυτή εφαρμόζεται σε τύπους διαγραμμάτων που εμφανίζουν ομαδοποιημένες μπάρες ή στήλες· δεν επηρεάζει ανεξάρτητες ομάδες σειρών σε συνδυαστικό διάγραμμα.

Το παρακάτω παράδειγμα ορίζει την επικάλυψη για την ομάδα που περιέχει την πρώτη σειρά:

import com.aspose.slides.*;

final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final byte overlapPercent = 30;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    // Το νέο διάγραμμα περιέχει παράδειγμα σειρών, κατηγοριών και τιμών.
    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);

    IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
    series.getParentSeriesGroup().setOverlap(overlapPercent);

    presentation.save("series_overlap.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Το αποτέλεσμα:

Η επικάλυψη των σειρών

Αλλαγή Χρώματος Γέμισης Σειράς

Χρησιμοποιήστε το IChartSeries.getFormat για να ορίσετε τη προεπιλεγμένη γέμιση ολόκληρης μιας σειράς. Εάν ένα σημείο έχει ήδη ρητή γέμιση, η ρύθμιση του IChartDataPoint.getFormat παρακάμπτει τη γέμιση της σειράς για εκείνο το σημείο.

Το παρακάτω παράδειγμα εφαρμόζει μια συμπαγή μπλε γέμιση στην πρώτη σειρά:

import com.aspose.slides.*;
import android.graphics.Color;

final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);

    IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
    series.getFormat().getFill().setFillType(FillType.Solid);
    series.getFormat().getFill().getSolidFillColor().setColor(Color.BLUE);

    presentation.save("series_color.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Το αποτέλεσμα:

Το χρώμα της σειράς

Αλλαγή Ονόματος Σειράς

Ένα όνομα σειράς αποθηκεύεται στο βιβλίο δεδομένων του διαγράμματος και εμφανίζεται συνήθως στην υπόμνηση. Στο προεπιλεγμένο βιβλίο εργασίας που δημιουργείται για ένα ομαδοποιημένο διάγραμμα στήλης, το κελί B1 βρίσκεται στη σειρά 0, στήλη 1 και περιέχει το όνομα της πρώτης σειράς. Οι ονομαστικές σταθερές στο παρακάτω παράδειγμα κάνουν αυτή τη δομή ρητή:

import com.aspose.slides.*;

final int firstSlideIndex = 0;
final int worksheetIndex = 0;
final int seriesNameRowIndex = 0;
final int firstSeriesColumnIndex = 1;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);

    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
    IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, seriesNameRowIndex, firstSeriesColumnIndex);
    seriesNameCell.setValue("Revenue");

    presentation.save("series_name.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Μπορείτε επίσης να ενημερώσετε το κελί στο οποίο ήδη αναφέρεται το IChartSeries.getName. Αυτή η προσέγγιση αποφεύγει την υπόθεση συγκεκριμένης σειράς και στήλης σε υπάρχον διάγραμμα:

import com.aspose.slides.*;

final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int firstNameCellIndex = 0;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);

    IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
    IChartDataCell seriesNameCell = series.getName().getAsCells().get_Item(firstNameCellIndex);
    seriesNameCell.setValue("Revenue");

    presentation.save("series_name.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Το αποτέλεσμα:

Το όνομα της σειράς

Δημιουργία Σειράς με Όνομα από Πολλαπλά Κελιά

Ένα σύνθετο όνομα σειράς είναι χρήσιμο όταν το όνομα προϊόντος και η περίοδος αναφοράς αποθηκεύονται σε διαφορετικά κελιά του βιβλίου εργασίας. Για παράδειγμα, μπορείτε να συνδυάσετε το Product A στο B1 και το 2026 στο C1 σε ένα όνομα σειράς, διατηρώντας και τα δύο τμήματα συνδεδεμένα με τα κελιά προέλευσης.

Χρησιμοποιήστε το IChartDataWorkbook.getCellCollection για να ανακτήσετε την περιοχή ονομάτων, στη συνέχεια περάστε αυτή τη συλλογή στο IChartSeriesCollection.add. Το όρισμα skipHiddenCells ελέγχει εάν τα κρυμμένα κελιά θα συμπεριληφθούν: true τα εξαιρεί, ενώ false τα περιλαμβάνει. Αυτό το παράδειγμα χρησιμοποιεί false για να συμπεριλάβει κάθε κελί στην περιοχή ονομάτων.

Το παρακάτω παράδειγμα δημιουργεί μια παρουσίαση με μία σειρά και δύο σημεία δεδομένων. Τα κελιά B1:C1 παρέχουν μόνο το όνομα της σειράς· τα A2:A3 παρέχουν τις ετικέτες κατηγοριών, και τα B2:B3 τις αριθμητικές τιμές.

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, 620, 180);

    chart.getChartData().getSeries().clear();
    chart.getChartData().getCategories().clear();
    chart.setLegend(true);

    IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
    workbook.clear(0);

    // Αυτά τα δύο κελιά παρέχουν το όνομα της σειράς.
    workbook.getCell(0, 0, 1, "Product A");
    workbook.getCell(0, 0, 2, "2026");
    IChartCellCollection nameCells = workbook.getCellCollection("Sheet1!$B$1:$C$1", false);
    IChartSeries series = chart.getChartData().getSeries().add(nameCells, ChartType.ClusteredColumn);

    // Ξεχωριστά κελιά παρέχουν τις κατηγορίες και τα αριθμητικά σημεία δεδομένων.
    IChartDataCell northCategory = workbook.getCell(0, 1, 0, "North");
    IChartDataCell southCategory = workbook.getCell(0, 2, 0, "South");
    chart.getChartData().getCategories().add(northCategory);
    chart.getChartData().getCategories().add(southCategory);
    IChartDataCell northValue = workbook.getCell(0, 1, 1, 120);
    IChartDataCell southValue = workbook.getCell(0, 2, 1, 150);
    series.getDataPoints().addDataPointForBarSeries(northValue);
    series.getDataPoints().addDataPointForBarSeries(southValue);

    presentation.save("composite_series_name.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Το παραγόμενο όνομα σειράς είναι Product A 2026, με ένα κενό μεταξύ των δύο τιμών κελιών. Η υπόμνηση το εμφανίζει ως μία καταχώρηση για και τις δύο στήλες. Η εικόνα παρακάτω δείχνει το αποτέλεσμα:

Διάγραμμα στήλης με τιμές Βορρά και Νότου και το σύνθετο όνομα σειράς Product A 2026 στην υπόμνηση

Λήψη Αυτόματου Χρώματος Γέμισης Σειράς

Το IChartSeries.getAutomaticSeriesColor επιστρέφει το χρώμα που υπολογίζεται από το δείκτη σειράς και το στυλ διαγράμματος ως ακέραιο χρώμα Android ARGB. Αυτό είναι το χρώμα που χρησιμοποιείται όταν η γέμιση της σειράς δεν έχει οριστεί ρητά. Η κλήση της μεθόδου διαβάζει το υπολογισμένο χρώμα· δεν αναθέτει νέα γέμιση.

Το παρακάτω παράδειγμα εκτυπώνει τον αυτόματο ακέραιο χρώματος για κάθε προεπιλεγμένη σειρά:

import com.aspose.slides.*;

final int firstSlideIndex = 0;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);

    int seriesCount = chart.getChartData().getSeries().size();
    for (int seriesIndex = 0; seriesIndex < seriesCount; seriesIndex++) {
        IChartSeries series = chart.getChartData().getSeries().get_Item(seriesIndex);
        int automaticColor = series.getAutomaticSeriesColor();
        System.out.println("Series " + seriesIndex + ": " + automaticColor);
    }
} finally {
    presentation.dispose();
}

Οι ακριβείς ακέραιες τιμές εξαρτώνται από το στυλ και το θέμα του διαγράμματος.

Ορισμός Αντιστροφής Χρώματος Γέμισης για Σειρά Διαγράμματος

Για σειρές μπάρες, στήλες και φυσαλίδες, το IChartSeries.setInvertIfNegative μπορεί να εμφανίζει αρνητικές τιμές με διαφορετικό γέμισμα. Ορίστε τη συνηθισμένη γέμιση της σειράς σε συμπαγή, ενεργοποιήστε την αντιστροφή και αναθέστε το χρώμα αρνητικής τιμής μέσω του IChartSeries.getInvertedSolidFillColor. Οι αρνητικοί αριθμοί παραμένουν αμετάβλητοι στο βιβλίο εργασίας· αλλάζει μόνο το χρώμα εμφάνισής τους.

Το παρακάτω παράδειγμα αντικαθιστά τα προεπιλεγμένα δεδομένα διαγράμματος με μία σειρά. Η σειρά 0 του φύλλου περιέχει το όνομα της σειράς, η στήλη 0 τις ετικέτες κατηγοριών και η στήλη 1 τις τιμές:

import com.aspose.slides.*;
import android.graphics.Color;

final int firstSlideIndex = 0;
final int worksheetIndex = 0;
final int headerRowIndex = 0;
final int categoryColumnIndex = 0;
final int firstSeriesColumnIndex = 1;
final int firstDataRowIndex = 1;

String[] categoryNames = { "Category 1", "Category 2", "Category 3" };
int[] seriesValues = { -20, 50, -30 };

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);
    IChartData chartData = chart.getChartData();
    IChartDataWorkbook workbook = chartData.getChartDataWorkbook();

    chartData.getSeries().clear();
    chartData.getCategories().clear();

    IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, headerRowIndex, firstSeriesColumnIndex, "Series 1");
    int chartType = chart.getType();
    IChartSeries series = chartData.getSeries().add(seriesNameCell, chartType);

    for (int categoryIndex = 0; categoryIndex < categoryNames.length; categoryIndex++) {
        int dataRowIndex = firstDataRowIndex + categoryIndex;
        String categoryName = categoryNames[categoryIndex];
        int seriesValue = seriesValues[categoryIndex];

        IChartDataCell categoryCell = workbook.getCell(worksheetIndex, dataRowIndex, categoryColumnIndex, categoryName);
        chartData.getCategories().add(categoryCell);

        IChartDataCell valueCell = workbook.getCell(worksheetIndex, dataRowIndex, firstSeriesColumnIndex, seriesValue);
        series.getDataPoints().addDataPointForBarSeries(valueCell);
    }

    int automaticSeriesColor = series.getAutomaticSeriesColor();
    series.getFormat().getFill().setFillType(FillType.Solid);
    series.getFormat().getFill().getSolidFillColor().setColor(automaticSeriesColor);
    series.setInvertIfNegative(true);
    series.getInvertedSolidFillColor().setColor(Color.RED);

    presentation.save("inverted_solid_fill_color.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Το αποτέλεσμα:

Το αντιστροφή συμπαγούς χρώματος γέμισης

Μπορείτε να ενεργοποιήσετε την αντιστροφή για ένα σημείο μέσω του IChartDataPoint.setInvertIfNegative. Στο παρακάτω παράδειγμα η αντιστροφή είναι απενεργοποιημένη για τη σειρά και ενεργοποιείται μόνο για το επιλεγμένο σημείο. Στο σημείο έχει επίσης ανατεθεί αρνητική τιμή ώστε το αποτέλεσμα να φαίνεται:

import com.aspose.slides.*;
import android.graphics.Color;

final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int targetDataPointIndex = 2;
final int negativeValue = -30;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);

    IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
    int automaticSeriesColor = series.getAutomaticSeriesColor();
    series.getFormat().getFill().setFillType(FillType.Solid);
    series.getFormat().getFill().getSolidFillColor().setColor(automaticSeriesColor);
    series.getInvertedSolidFillColor().setColor(Color.RED);
    series.setInvertIfNegative(false);

    IChartDataPoint dataPoint = series.getDataPoints().get_Item(targetDataPointIndex);
    dataPoint.getValue().getAsCell().setValue(negativeValue);
    dataPoint.setInvertIfNegative(true);

    presentation.save("data_point_invert_color_if_negative.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Καθαρισμός Συγκεκριμένης Τιμής Σημείου Δεδομένων

Για να κάνετε ένα σημείο κενό χωρίς να αφαιρέσετε τα υπόλοιπα, ορίστε το κελί του βιβλίου εργασίας σε null. Σε διάγραμμα στήλης, η σχεδιασμένη τιμή είναι προσβάσιμη μέσω του IChartDataPoint.getValue. Το σημείο παραμένει στην ίδια θέση κατηγορίας, αλλά το διάγραμμα το αντιμετωπίζει ως κενό σύμφωνα με τις ρυθμίσεις κενών τιμών του διαγράμματος.

Το παρακάτω παράδειγμα διαγράφει μόνο το δεύτερο σημείο στη πρώτη σειρά:

import com.aspose.slides.*;

final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int targetDataPointIndex = 1;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 200);

    IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
    IChartDataPoint dataPoint = series.getDataPoints().get_Item(targetDataPointIndex);
    dataPoint.getValue().getAsCell().setValue(null);

    presentation.save("clear_data_point_value.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Τα διαγράμματα διασποράς χρησιμοποιούν ξεχωριστά κελιά X και Y, και τα διαγράμματα φυσαλίδων επίσης ένα κελί μεγέθους. Διαγράψτε μόνο το κελί που αντιπροσωπεύει την τιμή που θέλετε να αφαιρέσετε. Μην καλείτε το IChartDataPointCollection.clear όταν θέλετε να διατηρήσετε τα άλλα σημεία, επειδή αυτή η μέθοδος αφαιρεί όλα τα σημεία δεδομένων από τη συλλογή.

Διαχείριση Προβολής Κελιών Κενών

Τα κρυμμένα κελιά που περιέχουν τιμές αποτελούν ξεχωριστή περίπτωση από τα κενά κελιά. Για να συμπεριλάβετε ή να εξαιρέσετε δεδομένα από κρυμμένες γραμμές και στήλες του φύλλου εργασίας, δείτε την ενότητα Include Data from Hidden Rows and Columns.

Ένα κενό κελί βιβλίου εργασίας αντιπροσωπεύει ελλιπή δεδομένα· ένα κελί που περιέχει 0 αντιπροσωπεύει γνωστή αριθμητική τιμή. Καλέστε το IChartDataCell.setValue με null για να κάνετε το κελί κενό. Ένας αριθμητικός μηδέν παραμένει μηδέν ανεξαρτήτως της ρύθμισης κενών κελιών.

Χρησιμοποιήστε το IChart.setDisplayBlanksAs για να επιλέξετε πώς το διάγραμμα εμφανίζει κενά κελιά. Αυτή η ρύθμιση ισχύει σε ολόκληρο το διάγραμμα. Αλλάζει τον τρόπο που τα κενά σχεδιάζονται, χωρίς να γεμίζει το κενό κελί του βιβλίου εργασίας με μηδέν ή με παρεμβαλλόμενη τιμή.

Το παρακάτω αυτοσχέδιο παράδειγμα δημιουργεί ένα διάγραμμα γραμμής με μία σειρά, διαγράφει την τιμή για την Ημέρα 3 και αποθηκεύει το ίδιο διάγραμμα με κάθε λειτουργία. Δεν απαιτείται αρχείο εισόδου. Το IChartDataWorkbook χρησιμοποιεί το φύλλο 0, στήλη 0 για ετικέτες κατηγοριών και στήλη 1 για τιμές· η σειρά 0 περιέχει το όνομα της σειράς. Τα τελικά δεδομένα είναι 10, 20, empty, 30, 40.

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IChart chart = slide.getShapes().addChart(ChartType.LineWithMarkers, 40, 40, 640, 400);
    IChartData chartData = chart.getChartData();
    IChartDataWorkbook workbook = chartData.getChartDataWorkbook();

    chartData.getSeries().clear();
    chartData.getCategories().clear();

    IChartDataCell seriesNameCell = workbook.getCell(0, 0, 1, "Measurements");
    IChartSeries series = chartData.getSeries().add(seriesNameCell, chart.getType());
    int[] values = { 10, 20, 25, 30, 40 };

    for (int i = 0; i < values.length; i++) {
        IChartDataCell categoryCell = workbook.getCell(0, i + 1, 0, "Day " + (i + 1));
        chartData.getCategories().add(categoryCell);
        IChartDataCell valueCell = workbook.getCell(0, i + 1, 1, values[i]);
        series.getDataPoints().addDataPointForLineSeries(valueCell);
    }

    // Αφήστε την Ημέρα 3 πραγματικά κενή, διατηρώντας την κατηγορία και το σημείο δεδομένων της.
    workbook.getCell(0, 3, 1).setValue(null);

    int[] modes = { DisplayBlanksAsType.Gap, DisplayBlanksAsType.Zero, DisplayBlanksAsType.Span };
    String[] modeNames = { "Gap", "Zero", "Span" };
    for (int i = 0; i < modes.length; i++) {
        chart.setDisplayBlanksAs(modes[i]);
        presentation.save("empty_cells_" + modeNames[i] + ".pptx", SaveFormat.Pptx);
    }
} finally {
    presentation.dispose();
}

Κάθε αρχείο εξόδου αποθηκεύει τη λειτουργία που είχε οριστεί πριν από την αποθήκευση: empty_cells_Gap.pptx, empty_cells_Zero.pptx και empty_cells_Span.pptx. Για να αποθηκεύσετε μόνο μία έκδοση, ορίστε την επιθυμητή λειτουργία και αποθηκεύστε την παρουσίαση μία φορά αντί για επανάληψη των λειτουργιών.

Η σύγκριση παρακάτω δείχνει τα ίδια δεδομένα και στα τρία αρχεία. Η Ημέρα 3 είναι κενή στο βιβλίο εργασίας σε κάθε περίπτωση:

Διαγράμματα γραμμής με πανομοιόμορφα δεδομένα: Gap διακόπτει τη γραμμή στην Ημέρα 3, Zero κατεβάζει τη γραμμή στο μηδέν, και Span συνδέει τη Ημέρα 2 με τη 4.

Το οπτικό αποτέλεσμα εξαρτάται από τον τύπο διαγράμματος. Ένα διάγραμμα γραμμής κάνει τις τρεις λειτουργίες εύκολα συγκρίσιμες. Τα διαγράμματα μπάρες και στήλες δεν έχουν γραμμή για σύνδεση μεταξύ μιας ελλιπούς κατηγορίας, οπότε το Span δεν μπορεί να δημιουργήσει το συνδετικό τμήμα που φαίνεται παραπάνω· μια κενή στήλη και μια στήλη μηδενικού ύψους μπορεί επίσης να φαίνονται ομοίως. Ομοίως, ένα διάγραμμα διασποράς μόνο με δείκτες δεν έχει γραμμή σύνδεσης. Μην περιμένετε τρία διακριτά αποτελέσματα για κάθε τύπο διαγράμματος· ελέγξτε την έξοδο για τον τύπο που χρησιμοποιείτε.

Ορισμός Πλάτους Κενών Μεταξύ Σειρών

Το πλάτος κενών είναι το διάστημα μεταξύ διαδοχικών ομάδων μπαρ ή στηλών, εκφρασμένο ως ποσοστό του πλάτους της μπαρ ή στήλης. Όπως η επικάλυψη, ανήκει στην γονική ομάδα σειρών και όχι σε μία σειρά. Καλέστε το IChartSeriesGroup.setGapWidth μία φορά για την ομάδα. Μεγαλύτερη τιμή δημιουργεί περισσότερο χώρο μεταξύ των ομάδων· μικρότερη τιμή τις κάνει πιο πυκνές.

Το παρακάτω παράδειγμα αλλάζει το πλάτος κενών και αποθηκεύει μόνο την τελική παρουσίαση:

import com.aspose.slides.*;

final int firstSlideIndex = 0;
final int firstSeriesIndex = 0;
final int gapWidthPercent = 30;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(firstSlideIndex);

    IChart chart = slide.getShapes().addChart(ChartType.StackedColumn, 20, 20, 500, 200);

    IChartSeries series = chart.getChartData().getSeries().get_Item(firstSeriesIndex);
    series.getParentSeriesGroup().setGapWidth(gapWidthPercent);

    presentation.save("gap_width_30.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Το αποτέλεσμα:

Το πλάτος κενών

Συχνές Ερωτήσεις

Ποιους τύπους διαγραμμάτων υποστηρίζουν σειρές δεδομένων;

Όλοι οι τύποι διαγραμμάτων που αντιπροσωπεύονται από τον παρονομαστή ChartType χρησιμοποιούν δεδομένα διαγράμματος, αλλά οι σειρές τους δεν έχουν όλα την ίδια δομή ή ρυθμίσεις τιμών. Για παράδειγμα, τα διαγράμματα κατηγορίας χρησιμοποιούν κατηγορίες και τιμές, τα διαγράμματα διασποράς χρησιμοποιούν τιμές X και Y, και τα διαγράμματα φυσαλίδων προσθέτουν μεγέθη φυσαλίδας. Χρησιμοποιήστε τη μέθοδο δημιουργίας σημείου δεδομένων που ταιριάζει με τον τύπο σειράς. Οι επιλογές όπως η επικάλυψη και το πλάτος κενών εφαρμόζονται μόνο σε συμβατές ομάδες μπαρ ή στηλών.

Τι είναι μια ομάδα σειρών διαγράμματος;

Ένα IChartSeriesGroup περιέχει συμβατές σειρές που μοιράζονται ρυθμίσεις σχεδίασης σε επίπεδο ομάδας. Ένα συνδυαστικό διάγραμμα μπορεί να περιέχει περισσότερες από μία ομάδες, οπότε η αλλαγή της ομάδας που προέρχεται από μια σειρά δεν αλλάζει υποχρεωτικά όλες τις σειρές στο διάγραμμα.

Ένα νεοδημιουργημένο διάγραμμα περιέχει προεπιλεγμένα δεδομένα;

Ναι. Από προεπιλογή, η μέθοδος IShapeCollection.addChart δημιουργεί δείγματα σειρών, κατηγοριών και τιμών. Μπορείτε να επεξεργαστείτε αυτά τα κελιά ή να διαγράψετε τόσο τις σειρές όσο και τις συλλογές κατηγοριών πριν προσθέσετε ένα εντελώς προσαρμοσμένο σύνολο δεδομένων. Ένα υπερφόρτωμα μπορεί επίσης να δημιουργήσει ένα διάγραμμα χωρίς προεπιλεγμένα δεδομένα.

Πώς συνδέονται τα αντικείμενα διαγράμματος με κελιά του βιβλίου εργασίας;

Τα ονόματα σειρών, οι ετικέτες κατηγοριών και οι τιμές σημείων δεδομένων αναφέρονται σε κελιά ενός IChartDataWorkbook. Η αλλαγή ενός κελιού-αναφοράς ενημερώνει το αντίστοιχο στοιχείο του διαγράμματος. Όταν δημιουργείτε προσαρμοσμένα δεδομένα, κρατήστε τις γραμμές κατηγοριών και τις γραμμές τιμών σειρών ευθυγραμμισμένες ώστε κάθε σημείο να σχεδιάζεται κάτω από τη σωστή κατηγορία.

Πώς μπορώ να διαγράψω μόνο ένα σημείο αντί ολόκληρης σειράς;

Ορίστε το αντίστοιχο κελί τιμής σε null για να διατηρήσετε τη θέση κατηγορίας του σημείου ως κενό. Χρησιμοποιήστε το IChartDataPointCollection.clear μόνο όταν θέλετε να αφαιρέσετε όλα τα σημεία από εκείνη τη σειρά. Εάν αφαιρείτε επίσης τις κατηγορίες, ενημερώστε κάθε σειρά ώστε οι τιμές τους να παραμείνουν ευθυγραμμισμένες με τη συλλογή κατηγοριών.

Πώς εμφανίζονται τα κενά σημεία;

Το αποτέλεσμα εξαρτάται από τον τύπο διαγράμματος και την τιμή που έχει οριστεί μέσω του IChart.setDisplayBlanksAs. Τα υποστηριζόμενα διαγράμματα μπορούν να εμφανίζουν κενά ως κενά, ως μηδενικές τιμές ή συνδέοντας γειτονικά σημεία. Επιλέξτε τη ρύθμιση που ταιριάζει με το νόημα των ελλιπών δεδομένων στην παρουσίασή σας. Δείτε την ενότητα Control the Display of Empty Cells για ένα πλήρες παράδειγμα και οπτική σύγκριση.

Πώς μορφοποιούνται οι αρνητικές τιμές;

Για υποστηριζόμενες σειρές μπαρ, στήλες και φυσαλίδες, καλέστε το IChartSeries.setInvertIfNegative και ορίστε το χρώμα που επιστρέφει το IChartSeries.getInvertedSolidFillColor. Μπορείτε να παρακάμψετε τη συμπεριφορά για ένα μεμονωμένο σημείο με το IChartDataPoint.setInvertIfNegative. Αυτές οι μέθοδοι επηρεάζουν τη μορφοποίηση, όχι τις αποθηκευμένες αριθμητικές τιμές.

Ποια μορφοποίηση κυριαρχεί όταν τόσο η σειρά όσο και το σημείο μορφοποιούνται;

Η ρητή μορφοποίηση σημείου δεδομένων έχει προτεραιότητα για εκείνο το σημείο. Τα άλλα σημεία συνεχίζουν να χρησιμοποιούν τη ρητή μορφοποίηση σειράς ή, όταν η μορφοποίηση σειράς δεν είναι ορισμένη, το αυτόματο στυλ και θέμα του διαγράμματος. Οι ρυθμίσεις ομάδας όπως η επικάλυψη και το πλάτος κενών ελέγχουν τη διάταξη και δεν υπερισχύουν της μορφοποίησης σε επίπεδο σημείου.

Υπάρχει περιορισμός στον αριθμό σειρών που μπορεί να περιέχει ένα διάγραμμα;

Το Aspose.Slides δεν επιβάλλει συγκεκριμένο περιορισμό στον αριθμό σειρών. Στην πράξη, περιορισμοί του αρχείου παρουσίασης, η διαθέσιμη μνήμη, ο χρόνος απόδοσης και η αναγνωσιμότητα του διαγράμματος καθορίζουν ένα πρακτικό όριο.

Τι πρέπει να αλλάξω όταν οι στήλες είναι πολύ κοντά ή πολύ απομακρυσμένες;

Καλέστε το IChartSeriesGroup.setGapWidth στη σχετική γονική ομάδα σειρών. Αυξήστε την τιμή για να διευρύνετε το κενό μεταξύ των ομάδων ή μειώστε την για να φέρετε τις ομάδες πιο κοντά.