Форматирование диаграмм презентации на PHP
Обзор
Эта статья объясняет, как форматировать диаграммы в презентациях PowerPoint с использованием Aspose.Slides. Она показывает, как настраивать ключевые элементы диаграммы, такие как оси, линии сетки, заголовки, легенды, область построения и заливки стен, чтобы улучшить внешний вид и читаемость данных диаграммы. Она также демонстрирует, как установить свойства шрифта для текста диаграммы, применить предустановленные числовые форматы к данным диаграммы и включить скругление углов области диаграммы. Вместе эти примеры показывают, как управлять как визуальным стилем, так и представлением данных диаграмм в презентации.
Форматирование элементов диаграммы
Используйте Chart для форматирования заголовков диаграммы, осей, линий сетки, легенд и области построения. Этот пример создает линейную диаграмму с маркерами и данными по умолчанию, затем применяет отдельные стили текста и линий к осям значений и категорий. Размеры шрифтов и толщины линий указаны в пунктах; метки категорий повернуты на 45 градусов.
Ось значений использует setNumberFormat независимо от исходных ячеек. Ее масштаб идет от -2 до 15, с основными интервалами 2 и вторичными интервалами 0,5. Пример также сочетает процентное форматирование с setDisplayUnit установленным в тысячи, поэтому адаптируйте эти настройки к смыслу и масштабу ваших данных. Легенда остается вне области построения, поскольку setOverlay вызывается с false. Заливки задней стены и пола настраиваются через getBackWall и getFloor, но эти поверхности видимы только в 3D‑диаграммах.
use aspose\slides\ChartType;
use aspose\slides\DisplayUnitType;
use aspose\slides\FillType;
use aspose\slides\FontData;
use aspose\slides\LineDashStyle;
use aspose\slides\NullableBool;
use aspose\slides\Presentation;
use aspose\slides\PresetColor;
use aspose\slides\SaveFormat;
use aspose\slides\TickLabelPositionType;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::LineWithMarkers, 50, 50, 500, 400);
$chart->setTitle(true);
$chart->getChartTitle()->addTextFrameForOverriding("");
$chartTitle = $chart->getChartTitle()->getTextFrameForOverriding()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$chartTitle->setText("Sample Chart");
$chartTitle->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$chartTitle->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$chartTitle->getPortionFormat()->setFontHeight(20);
$chartTitle->getPortionFormat()->setFontBold(NullableBool::True);
$chartTitle->getPortionFormat()->setFontItalic(NullableBool::True);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->setWidth(5);
$chart->getAxes()->getVerticalAxis()->getMajorGridLinesFormat()->getLine()->setDashStyle(LineDashStyle::DashDot);
$chart->getAxes()->getVerticalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getVerticalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$chart->getAxes()->getVerticalAxis()->getMinorGridLinesFormat()->getLine()->setWidth(3);
$chart->getAxes()->getVerticalAxis()->setNumberFormatLinkedToSource(false);
$chart->getAxes()->getVerticalAxis()->setDisplayUnit(DisplayUnitType::Thousands);
$chart->getAxes()->getVerticalAxis()->setNumberFormat("0.0%");
$chart->getAxes()->getVerticalAxis()->setAutomaticMajorUnit(false);
$chart->getAxes()->getVerticalAxis()->setAutomaticMaxValue(false);
$chart->getAxes()->getVerticalAxis()->setAutomaticMinorUnit(false);
$chart->getAxes()->getVerticalAxis()->setAutomaticMinValue(false);
$chart->getAxes()->getVerticalAxis()->setMaxValue(15);
$chart->getAxes()->getVerticalAxis()->setMinValue(-2);
$chart->getAxes()->getVerticalAxis()->setMinorUnit(0.5);
$chart->getAxes()->getVerticalAxis()->setMajorUnit(2.0);
$valueAxisText = $chart->getAxes()->getVerticalAxis()->getTextFormat()->getPortionFormat();
$valueAxisText->setFontBold(NullableBool::True);
$valueAxisText->setFontHeight(16);
$valueAxisText->setFontItalic(NullableBool::True);
$valueAxisText->getFillFormat()->setFillType(FillType::Solid);
$valueAxisText->getFillFormat()->getSolidFillColor()->setPresetColor(PresetColor::DarkGreen);
$valueAxisText->setLatinFont(new FontData("Times New Roman"));
$chart->getAxes()->getVerticalAxis()->setTitle(true);
$chart->getAxes()->getVerticalAxis()->getTitle()->addTextFrameForOverriding("");
$valueAxisTitle = $chart->getAxes()->getVerticalAxis()->getTitle()->getTextFrameForOverriding()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$valueAxisTitle->setText("Primary Axis");
$valueAxisTitle->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$valueAxisTitle->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$valueAxisTitle->getPortionFormat()->setFontHeight(20);
$valueAxisTitle->getPortionFormat()->setFontBold(NullableBool::True);
$valueAxisTitle->getPortionFormat()->setFontItalic(NullableBool::True);
$chart->getAxes()->getHorizontalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getHorizontalAxis()->getMajorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(new Java("java.awt.Color", 0, 128, 0));
$chart->getAxes()->getHorizontalAxis()->getMajorGridLinesFormat()->getLine()->setWidth(5);
$chart->getAxes()->getHorizontalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->setFillType(FillType::Solid);
$chart->getAxes()->getHorizontalAxis()->getMinorGridLinesFormat()->getLine()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->YELLOW);
$chart->getAxes()->getHorizontalAxis()->getMinorGridLinesFormat()->getLine()->setWidth(3);
$categoryAxisText = $chart->getAxes()->getHorizontalAxis()->getTextFormat()->getPortionFormat();
$categoryAxisText->setFontBold(NullableBool::True);
$categoryAxisText->setFontHeight(16);
$categoryAxisText->setFontItalic(NullableBool::True);
$categoryAxisText->getFillFormat()->setFillType(FillType::Solid);
$categoryAxisText->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLUE);
$categoryAxisText->setLatinFont(new FontData("Arial"));
$chart->getAxes()->getHorizontalAxis()->setTitle(true);
$chart->getAxes()->getHorizontalAxis()->getTitle()->addTextFrameForOverriding("");
$categoryAxisTitle = $chart->getAxes()->getHorizontalAxis()->getTitle()->getTextFrameForOverriding()->getParagraphs()->get_Item(0)->getPortions()->get_Item(0);
$categoryAxisTitle->setText("Sample Category");
$categoryAxisTitle->getPortionFormat()->getFillFormat()->setFillType(FillType::Solid);
$categoryAxisTitle->getPortionFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$categoryAxisTitle->getPortionFormat()->setFontHeight(20);
$categoryAxisTitle->getPortionFormat()->setFontBold(NullableBool::True);
$categoryAxisTitle->getPortionFormat()->setFontItalic(NullableBool::True);
$chart->getAxes()->getHorizontalAxis()->setTickLabelPosition(TickLabelPositionType::Low);
$chart->getAxes()->getHorizontalAxis()->setTickLabelRotationAngle(45);
$legendText = $chart->getLegend()->getTextFormat()->getPortionFormat();
$legendText->setFontBold(NullableBool::True);
$legendText->setFontHeight(16);
$legendText->setFontItalic(NullableBool::True);
$legendText->getFillFormat()->setFillType(FillType::Solid);
$legendText->getFillFormat()->getSolidFillColor()->setPresetColor(PresetColor::DarkRed);
$chart->getLegend()->setOverlay(false);
$chart->getBackWall()->setThickness(1);
$chart->getBackWall()->getFormat()->getFill()->setFillType(FillType::Solid);
$chart->getBackWall()->getFormat()->getFill()->getSolidFillColor()->setColor(new Java("java.awt.Color", 255, 165, 0));
$chart->getFloor()->getFormat()->getFill()->setFillType(FillType::Solid);
$chart->getFloor()->getFormat()->getFill()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
$chart->getPlotArea()->getFormat()->getFill()->setFillType(FillType::Solid);
$chart->getPlotArea()->getFormat()->getFill()->getSolidFillColor()->setPresetColor(PresetColor::LightCyan);
$presentation->save("FormattedChart_out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Установка свойств шрифта для диаграммы
Установите размер шрифта по умолчанию для текста диаграммы через Chart::getTextFormat. В примере создается групповая столбчатая диаграмма с шрифтом 20 пунктов и включаются подписи значений для первой серии через setShowValue. Текстовые элементы со своими явными настройками шрифта могут переопределять значение по умолчанию диаграммы.
use aspose\slides\ChartType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 100, 100, 500, 400);
$chart->getTextFormat()->getPortionFormat()->setFontHeight(20);
$chart->getChartData()->getSeries()->get_Item(0)->getLabels()->getDefaultDataLabelFormat()->setShowValue(true);
$presentation->save("FontPropertiesForChart.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Установка числового формата
Используйте ChartDataCell::setPresetNumberFormat для применения встроенного числового формата к ячейкам рабочей книги диаграммы. В этом примере создается групповая столбчатая диаграмма с данными по умолчанию, привязанными к ячейкам, и применяется индекс формата 10 (0.00%) к каждой ячейке значений серии. Это изменяет способ отображения значений в рабочей книге без изменения самих чисел; например, 0,25 отображается как 25,00 %. Форматы осей и подписей данных можно настраивать отдельно.
use aspose\slides\ChartType;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 50, 50, 500, 400);
$series = $chart->getChartData()->getSeries();
for ($i = 0; $i < java_values($series->size()); $i++) {
$chartSeries = $series->get_Item($i);
$dataPoints = $chartSeries->getDataPoints();
for ($j = 0; $j < java_values($dataPoints->size()); $j++) {
$dataPoint = $dataPoints->get_Item($j);
$dataPoint->getValue()->getAsCell()->setPresetNumberFormat(10); // 0.00%
}
}
$presentation->save("PresetNumberFormat_out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
В следующей таблице перечислены индексы встроенных числовых форматов с типичными форматами Excel для локали English (United States). Точные строки форматов и их отображение могут различаться в зависимости от приложения и локали, особенно для валют и дат. Некоторые форматы Excel также отличаются от значений по умолчанию в стандарте OOXML, как описано в Microsoft’s number format implementation notes.
| Индекс | Формат |
|---|---|
| 0 | General |
| 1 | 0 |
| 2 | 0.00 |
| 3 | #,##0 |
| 4 | #,##0.00 |
| 5 | "$"#,##0_);("$"#,##0) |
| 6 | "$"#,##0_);[Red]("$"#,##0) |
| 7 | "$"#,##0.00_);("$"#,##0.00) |
| 8 | "$"#,##0.00_);[Red]("$"#,##0.00) |
| 9 | 0% |
| 10 | 0.00% |
| 11 | 0.00E+00 |
| 12 | # ?/? |
| 13 | # ??/?? |
| 14 | m/d/yyyy |
| 15 | d-mmm-yy |
| 16 | d-mmm |
| 17 | mmm-yy |
| 18 | h:mm AM/PM |
| 19 | h:mm:ss AM/PM |
| 20 | h:mm |
| 21 | h:mm:ss |
| 22 | m/d/yyyy h:mm |
| 37 | #,##0_);(#,##0) |
| 38 | #,##0_);[Red](#,##0) |
| 39 | #,##0.00_);(#,##0.00) |
| 40 | #,##0.00_);[Red](#,##0.00) |
| 41 | _(* #,##0_);_(* (#,##0);_(* "-"_);_(@_) |
| 42 | _("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_) |
| 43 | _(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_) |
| 44 | _("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_) |
| 45 | mm:ss |
| 46 | [h]:mm:ss |
| 47 | mm:ss.0 |
| 48 | ##0.0E+0 |
| 49 | @ |
Установка скругленных границ области диаграммы
Вызовите Chart::setRoundedCorners с true, чтобы скруглить углы области диаграммы. Пример создает групповую столбчатую диаграмму и использует getLineFormat для задания ее контуру сплошным серым цветом и однолинейным стилем перед сохранением презентации.
use aspose\slides\ChartType;
use aspose\slides\FillType;
use aspose\slides\LineStyle;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation();
try {
$slide = $presentation->getSlides()->get_Item(0);
$chart = $slide->getShapes()->addChart(ChartType::ClusteredColumn, 20, 100, 600, 400);
$chart->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$chart->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->GRAY);
$chart->getLineFormat()->setStyle(LineStyle::Single);
$chart->setRoundedCorners(true);
$presentation->save("out.pptx", SaveFormat::Pptx);
} finally {
$presentation->dispose();
}
Редактирование существующих аннотаций диаграммы
Диаграмма может содержать пользовательские фигуры, такие как текстовая аннотация, объясняющая статус отчета. Доступ к этим фигурам осуществляется через Chart::getUserShapes. Коллекция, возвращаемая getShapes, содержит фигуры, принадлежащие диаграмме.
Обычный текстовый блок, размещенный поверх диаграммы, принадлежит слайду, даже если выглядит как часть диаграммы. Перебор через Slide::getShapes находит диаграмму и обычные фигуры слайда, но не перечисляет отдельные фигуры внутри диаграммы. Заголовки диаграмм и подписи данных являются отдельными элементами диаграммы, а не пользовательскими аннотациями в этой коллекции.
Скачайте chart-annotations.pptx и поместите его в рабочий каталог приложения. На его первом слайде находится диаграмма с не сгруппированной аннотацией «Preliminary results», линией, принадлежащей диаграмме, и обычным текстовым блоком слайда «Slide overlay». Пример находит первую диаграмму на этом слайде и меняет аннотацию на «Final results», когда отчет готов к публикации. Он проверяет, что коллекция не пуста, и редактирует только AutoShape с ненулевым текстовым фреймом, возвращаемым getTextFrame, и с ожидаемым текстом.
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
$presentation = new Presentation("chart-annotations.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$chartType = new JavaClass("com.aspose.slides.IChart");
$autoShapeType = new JavaClass("com.aspose.slides.IAutoShape");
$chart = null;
for ($i = 0; $i < java_values($slide->getShapes()->size()); $i++) {
$shape = $slide->getShapes()->get_Item($i);
if (java_instanceof($shape, $chartType)) {
$chart = $shape;
break;
}
}
if ($chart === null || java_values($chart->getUserShapes()->getShapes()->size()) == 0) {
echo "No chart or chart-owned shapes found." . PHP_EOL;
return;
}
$updated = false;
$userShapes = $chart->getUserShapes()->getShapes();
for ($i = 0; $i < java_values($userShapes->size()); $i++) {
$shape = $userShapes->get_Item($i);
if (java_instanceof($shape, $autoShapeType)) {
$annotation = $shape;
if (!java_is_null($annotation->getTextFrame()) && java_values($annotation->getTextFrame()->getText()) === "Preliminary results") {
$annotation->getTextFrame()->setText("Final results");
$updated = true;
break;
}
}
}
if ($updated) {
$presentation->save("chart-annotations-updated.pptx", SaveFormat::Pptx);
} else {
echo "No matching text annotation found." . PHP_EOL;
}
} finally {
$presentation->dispose();
}
Линия и текстовый блок слайда остаются без изменений. Ниже приведены изображения входных данных и сохранённого, повторно открытого результата:
| До редактирования | После редактирования |
|---|---|
![]() |
![]() |
Note
Пример проверяет только фигуры верхнего уровня, принадлежащие диаграмме. Если аннотация находится внутри GroupShape, также проверьте коллекцию getShapes этой группы. Повторяйте это рекурсивно для вложенных групп, применяя те же проверки текста к их дочерним фигурам. Сама группа является контейнером; не рассматривайте её как текстовый блок.Часто задаваемые вопросы
Могу ли я задать полупрозрачные заливки для столбцов/областей, оставив границу непрозрачной?
Да. Прозрачность заливки и контур настраиваются отдельно. Это полезно для повышения читаемости сетки и данных в плотных визуализациях.
Как справиться с наложением подписей данных?
Уменьшите размер шрифта, отключите несущественные компоненты подписи (например, категории), скорректируйте положение подписи, при необходимости показывайте подписи только для выбранных точек или переключите формат на «значение + легенда».
Могу ли я применять градиентные или шаблонные заливки к сериям?
Да. Серии поддерживают сплошные, градиентные и шаблонные заливки. На практике используйте градиенты умеренно и избегайте сочетаний, снижающих контраст с сеткой и текстом.

