ایجاد یا بهروزرسانی نمودارهای ارائه PowerPoint در Java
نمای کلی
این مقاله راهنمای جامع ایجاد و سفارشیسازی نمودارها با Aspose.Slides for Java را ارائه میدهد. شما یاد خواهید گرفت که چگونه بهصورت برنامهنویسی یک نمودار را به اسلاید اضافه کنید، دادهها را پر کنید و گزینههای قالببندی مختلف را برای مطابقت با نیازهای طراحیتان اعمال کنید. در طول مقاله، مثالهای کد دقیق هر گام را نشان میدهند، از مقداردهی اولیه ارائه و شیء نمودار تا تنظیم سریها، محورها و افسانهها. با پیروی از این راهنما، درک جامعی از چگونگی ادغام تولید دینامیک نمودار در برنامههای Java خود به دست میآورید و فرآیند ساخت ارائههای مبتنی بر داده را ساده میکنید.
ایجاد نمودار
نمودارها به افراد کمک میکنند تا دادهها را بهسرعت بهصورت بصری درک کنند و بینشهایی بهدست آورند که ممکن است از یک جدول یا صفحهگسترده واضح نباشد.
چرا نمودارها ایجاد کنیم؟
با استفاده از نمودارها میتوانید:
- مقادیر بزرگ داده را در یک اسلاید خلاصه، فشرده یا تجمیع کنید؛
- الگوها و روندهای داده را آشکار کنید؛
- جهت و شتاب داده را در طول زمان یا نسبت به یک واحد اندازهگیری خاص استنتاج کنید؛
- دادههای خارجازقالب، ناهنجاریها، انحرافها، خطاها و دادههای بیمعنی را شناسایی کنید؛
- دادههای پیچیده را بهصورت مؤثر ارتباط یا ارائه دهید.
در PowerPoint میتوانید از عملکرد Insert برای ایجاد نمودارها استفاده کنید که الگوهای متنوعی برای طراحی انواع نمودارها فراهم میکند. با استفاده از Aspose.Slides میتوانید هم نمودارهای استاندارد (مبتنی بر انواع رایج) و هم نمودارهای سفارشی ایجاد کنید.
Note
از شمارشگر ChartType در بسته com.aspose.slides استفاده کنید. مقادیر این شمارشگر به انواع مختلف نمودارها مربوط میشوند.ایجاد نمودارهای ستونی خوشهای
این مثال از متد addChart برای ایجاد یک نمودار ستونی خوشهای استفاده میکند که دو سری را در سه دسته مقایسه میکند. سریها از پرکنهای قرمز و سبز استفاده میکنند و برچسبهای منفرد نام دسته، نام سری و مقادیر را نشان میدهند. شاخص ورق کار ۰ به اولین ورق در کتابکار نمودار توکار اشاره دارد.
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 300);
chart.getChartTitle().addTextFrameForOverriding("Sample Title");
chart.getChartTitle().getTextFrameForOverriding().getTextFrameFormat().setCenterText(NullableBool.True);
chart.getChartTitle().setHeight(20);
chart.setTitle(true);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
int worksheetIndex = 0;
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, 0, 1, "Series 1");
chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
seriesNameCell = workbook.getCell(worksheetIndex, 0, 2, "Series 2");
chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
IChartDataCell categoryCell = workbook.getCell(worksheetIndex, 1, 0, "Category 1");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(worksheetIndex, 2, 0, "Category 2");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(worksheetIndex, 3, 0, "Category 3");
chart.getChartData().getCategories().add(categoryCell);
IChartSeries series = chart.getChartData().getSeries().get_Item(0);
IChartDataCell valueCell = workbook.getCell(worksheetIndex, 1, 1, 20);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 2, 1, 50);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 3, 1, 30);
series.getDataPoints().addDataPointForBarSeries(valueCell);
series.getFormat().getFill().setFillType(FillType.Solid);
series.getFormat().getFill().getSolidFillColor().setColor(Color.RED);
series = chart.getChartData().getSeries().get_Item(1);
valueCell = workbook.getCell(worksheetIndex, 1, 2, 30);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 2, 2, 10);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 3, 2, 60);
series.getDataPoints().addDataPointForBarSeries(valueCell);
series.getFormat().getFill().setFillType(FillType.Solid);
series.getFormat().getFill().getSolidFillColor().setColor(new Color(0, 128, 0));
IDataLabel label = series.getDataPoints().get_Item(0).getLabel();
label.getDataLabelFormat().setShowCategoryName(true);
label = series.getDataPoints().get_Item(1).getLabel();
label.getDataLabelFormat().setShowSeriesName(true);
label = series.getDataPoints().get_Item(2).getLabel();
label.getDataLabelFormat().setShowValue(true);
label.getDataLabelFormat().setShowSeriesName(true);
label.getDataLabelFormat().setSeparator("/");
presentation.save("AsposeChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای پراکنده
نمودارهای پراکنده (همچنین بهعنوان scatter plots یا x‑y graphs شناخته میشوند) معمولاً برای بررسی الگوها یا نشان دادن همبستگی بین دو متغیر استفاده میشوند.
از نمودار پراکنده زمانی استفاده کنید که:
- دادههای عددی جفت شده داشته باشید؛
- دو متغیر که بهخوبی با هم جفت میشوند؛
- بخواهید تعیین کنید آیا دو متغیر مرتبط هستند یا نه؛
- یک متغیر مستقل داشته باشید که مقادیر متعددی برای یک متغیر وابسته دارد.
این مثال دو مجموعه مقدار x‑y را ترسیم میکند. سری اول از خطوط مستقیم با علامتگرهای ستارهای، سری دوم از خطوط صاف با علامتگرهای دایرهای استفاده میکند؛ هر دو از اندازه علامتگر ۱۰ بهره میبرند که با setSize پیکربندی شده است. متد setSymbol شکل علامتگر را تعیین میکند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.ScatterWithSmoothLines, 20, 20, 500, 300);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
int worksheetIndex = 0;
chart.getChartData().getSeries().clear();
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, 1, 1, "Series 1");
chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
seriesNameCell = workbook.getCell(worksheetIndex, 1, 3, "Series 2");
chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
IChartSeries series = chart.getChartData().getSeries().get_Item(0);
IChartDataCell xValueCell = workbook.getCell(worksheetIndex, 2, 1, 1);
IChartDataCell yValueCell = workbook.getCell(worksheetIndex, 2, 2, 3);
series.getDataPoints().addDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.getCell(worksheetIndex, 3, 1, 2);
yValueCell = workbook.getCell(worksheetIndex, 3, 2, 10);
series.getDataPoints().addDataPointForScatterSeries(xValueCell, yValueCell);
series.setType(ChartType.ScatterWithStraightLinesAndMarkers);
series.getMarker().setSize(10);
series.getMarker().setSymbol(MarkerStyleType.Star);
series = chart.getChartData().getSeries().get_Item(1);
xValueCell = workbook.getCell(worksheetIndex, 2, 3, 5);
yValueCell = workbook.getCell(worksheetIndex, 2, 4, 2);
series.getDataPoints().addDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.getCell(worksheetIndex, 3, 3, 3);
yValueCell = workbook.getCell(worksheetIndex, 3, 4, 1);
series.getDataPoints().addDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.getCell(worksheetIndex, 4, 3, 2);
yValueCell = workbook.getCell(worksheetIndex, 4, 4, 2);
series.getDataPoints().addDataPointForScatterSeries(xValueCell, yValueCell);
xValueCell = workbook.getCell(worksheetIndex, 5, 3, 5);
yValueCell = workbook.getCell(worksheetIndex, 5, 4, 1);
series.getDataPoints().addDataPointForScatterSeries(xValueCell, yValueCell);
series.getMarker().setSize(10);
series.getMarker().setSymbol(MarkerStyleType.Circle);
presentation.save("AsposeChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای دایرهای
نمودارهای دایرهای برای نشان دادن رابطه بخش‑به‑کل در دادهها، بهویژه زمانی که دادهها شامل برچسبهای دستهای با مقدار عددی هستند، بهترین گزینهاند. اما اگر دادههای شما شامل بخشها یا برچسبهای زیادی باشد، ممکن است بهتر باشد بهجای آن از نمودار میلهای استفاده کنید.
این مثال یک نمودار دایرهای با سه مقدار فصلی ایجاد میکند. هر قطعه پرکن و حاشیه سفارشی دارد و برچسبها ترکیبی از مقادیر، درصدها و اطلاعات سری را نشان میدهند. متد setFirstSliceAngle اولین قطعه را در زاویه ۱۸۰ درجه آغاز میکند.
import com.aspose.slides.*;
import java.awt.Color;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Pie, 20, 20, 500, 300);
chart.getChartTitle().addTextFrameForOverriding("Sample Title");
chart.getChartTitle().getTextFrameForOverriding().getTextFrameFormat().setCenterText(NullableBool.True);
chart.getChartTitle().setHeight(20);
chart.setTitle(true);
chart.getChartData().getSeries().get_Item(0).getLabels().getDefaultDataLabelFormat().setShowValue(true);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
int worksheetIndex = 0;
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataCell categoryCell = workbook.getCell(0, 1, 0, "1st Qtr");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, 2, 0, "2nd Qtr");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, 3, 0, "3rd Qtr");
chart.getChartData().getCategories().add(categoryCell);
IChartDataCell seriesNameCell = workbook.getCell(0, 0, 1, "Series 1");
IChartSeries series = chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
IChartDataCell valueCell = workbook.getCell(worksheetIndex, 1, 1, 20);
series.getDataPoints().addDataPointForPieSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 2, 1, 50);
series.getDataPoints().addDataPointForPieSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 3, 1, 30);
series.getDataPoints().addDataPointForPieSeries(valueCell);
chart.getChartData().getSeriesGroups().get_Item(0).setColorVaried(true);
IChartDataPoint firstSlice = series.getDataPoints().get_Item(0);
firstSlice.getFormat().getFill().setFillType(FillType.Solid);
firstSlice.getFormat().getFill().getSolidFillColor().setColor(Color.CYAN);
firstSlice.getFormat().getLine().getFillFormat().setFillType(FillType.Solid);
firstSlice.getFormat().getLine().getFillFormat().getSolidFillColor().setColor(Color.GRAY);
firstSlice.getFormat().getLine().setWidth(3.0);
firstSlice.getFormat().getLine().setStyle(LineStyle.ThinThick);
firstSlice.getFormat().getLine().setDashStyle(LineDashStyle.LargeDash);
IChartDataPoint secondSlice = series.getDataPoints().get_Item(1);
secondSlice.getFormat().getFill().setFillType(FillType.Solid);
secondSlice.getFormat().getFill().getSolidFillColor().setColor(new Color(165, 42, 42));
secondSlice.getFormat().getLine().getFillFormat().setFillType(FillType.Solid);
secondSlice.getFormat().getLine().getFillFormat().getSolidFillColor().setColor(Color.BLUE);
secondSlice.getFormat().getLine().setWidth(3.0);
secondSlice.getFormat().getLine().setStyle(LineStyle.Single);
secondSlice.getFormat().getLine().setDashStyle(LineDashStyle.LargeDashDot);
IChartDataPoint thirdSlice = series.getDataPoints().get_Item(2);
thirdSlice.getFormat().getFill().setFillType(FillType.Solid);
thirdSlice.getFormat().getFill().getSolidFillColor().setColor(new Color(255, 127, 80));
thirdSlice.getFormat().getLine().getFillFormat().setFillType(FillType.Solid);
thirdSlice.getFormat().getLine().getFillFormat().getSolidFillColor().setColor(Color.RED);
thirdSlice.getFormat().getLine().setWidth(2.0);
thirdSlice.getFormat().getLine().setStyle(LineStyle.ThinThin);
thirdSlice.getFormat().getLine().setDashStyle(LineDashStyle.LargeDashDotDot);
IDataLabel firstLabel = series.getDataPoints().get_Item(0).getLabel();
firstLabel.getDataLabelFormat().setShowValue(true);
IDataLabel secondLabel = series.getDataPoints().get_Item(1).getLabel();
secondLabel.getDataLabelFormat().setShowValue(true);
secondLabel.getDataLabelFormat().setShowLegendKey(true);
secondLabel.getDataLabelFormat().setShowPercentage(true);
IDataLabel thirdLabel = series.getDataPoints().get_Item(2).getLabel();
thirdLabel.getDataLabelFormat().setShowSeriesName(true);
thirdLabel.getDataLabelFormat().setShowPercentage(true);
series.getLabels().getDefaultDataLabelFormat().setShowLeaderLines(true);
chart.getChartData().getSeriesGroups().get_Item(0).setFirstSliceAngle(180);
presentation.save("PieChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

برای بهبود قابلیت خواندن برچسبهای خارج از دایره، بخش Format Leader Lines را ببینید تا نمونهای از موقعیتدهی برچسبها و سفارشیسازی رنگ، عرض، شفافیت و سبک خطهای رهبری مشاهده کنید.
ایجاد نمودارهای خطی
نمودارهای خطی (همچنین بهعنوان line graphs شناخته میشوند) برای نشان دادن تغییرات مقدار در طول زمان مناسباند. با استفاده از یک نمودار خطی میتوانید حجم بالایی از دادهها را بهصورت همزمان مقایسه کنید، تغییرات و روندها را در طول زمان پیگیری کنید، ناهنجاریها را در سریهای داده برجسته کنید و غیره.
این مثال با استفاده از addChart یک نمودار خطی با سریها و دستههای پیشفرض ایجاد میکند و سپس ارائه را بهصورت PPTX ذخیره میکند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart lineChart = slide.getShapes().addChart(ChartType.Line, 20, 20, 500, 300);
presentation.save("lineChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
بهصورت پیشفرض، نقاط در نمودار خطی با خطوط مستقیم پیوسته بههم متصل میشوند. اگر میخواهید نقاط بهجای خطوط پیوسته با خط تیره متصل شوند، متد setDashStyle را همراه با یک مقدار از LineDashStyle فراخوانی کنید:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart lineChart = slide.getShapes().addChart(ChartType.Line, 20, 20, 500, 300);
for (IChartSeries series : lineChart.getChartData().getSeries())
{
series.getFormat().getLine().setDashStyle(LineDashStyle.Dash);
}
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای درختنقشه (Tree Map)
نمودارهای درختنقشه برای دادههای فروش که میخواهید اندازه نسبی دستههای داده را نشان دهید و سریعاً به مواردی که مشارکتکنندههای بزرگ در هر دسته هستند، توجه کنید، مناسباند.
این مثال یک درختنقشه با هشت برگ گروهبندیشده در چهار ساقه و دو شاخه ایجاد میکند. متد setGroupingItem ساقهها را در سطح گروهبندی ۱ و شاخهها را در سطح ۲ اختصاص میدهد. مقادیر اندازه مستطیلهای نسبی را تعیین میکنند، در حالی که برچسبهای دسته و برچسبهای والد همپوشانیشده سلسلهمراتب را شناسایی میکنند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Treemap, 20, 20, 500, 300);
chart.getChartData().getCategories().clear();
chart.getChartData().getSeries().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
// شاخه 1
IChartDataCell categoryCell = workbook.getCell(0, "C1", "Leaf1");
IChartCategory leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem1");
leaf.getGroupingLevels().setGroupingItem(2, "Branch1");
categoryCell = workbook.getCell(0, "C2", "Leaf2");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "C3", "Leaf3");
leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem2");
categoryCell = workbook.getCell(0, "C4", "Leaf4");
chart.getChartData().getCategories().add(categoryCell);
// شاخه 2
categoryCell = workbook.getCell(0, "C5", "Leaf5");
leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem3");
leaf.getGroupingLevels().setGroupingItem(2, "Branch2");
categoryCell = workbook.getCell(0, "C6", "Leaf6");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "C7", "Leaf7");
leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem4");
categoryCell = workbook.getCell(0, "C8", "Leaf8");
chart.getChartData().getCategories().add(categoryCell);
IChartSeries series = chart.getChartData().getSeries().add(ChartType.Treemap);
series.getLabels().getDefaultDataLabelFormat().setShowCategoryName(true);
IChartDataCell valueCell = workbook.getCell(0, "D1", 4);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
valueCell = workbook.getCell(0, "D2", 5);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
valueCell = workbook.getCell(0, "D3", 3);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
valueCell = workbook.getCell(0, "D4", 6);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
valueCell = workbook.getCell(0, "D5", 9);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
valueCell = workbook.getCell(0, "D6", 9);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
valueCell = workbook.getCell(0, "D7", 4);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
valueCell = workbook.getCell(0, "D8", 3);
series.getDataPoints().addDataPointForTreemapSeries(valueCell);
series.setParentLabelLayout(ParentLabelLayoutType.Overlapping);
presentation.save("Treemap.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای آبشاری (Waterfall)
نمودار آبشاری نشان میدهد که چگونه تغییرات مثبت و منفی به مقدار نهایی کمک میکنند. بهعنوان مثال، یک تجزیه سود میتواند با درآمد شروع شود، هزینهها را کم کند و سایر درآمدها را اضافه کند. ستونهای تغییر بین مقدار قبلی و مقدار جدید شناور میشوند، در حالی که ستونهای کل از صفر تا مقدار انبارششده گسترش مییابند.
مثال زیر از مبالغ بههزار دلار آمریکا استفاده میکند:
| دسته | مقدار کتاب کار | نوع ستون |
|---|---|---|
| درآمد | 1000 | Increase |
| هزینه فروش | -400 | Decrease |
| سود ناخالص | 600 | Intermediate total |
| هزینههای عملیاتی | -200 | Decrease |
| سایر درآمدها | 50 | Increase |
| سود خالص | 450 | Final total |
برای نشان دادن یک نقطه بهعنوان کل میانی یا نهایی، متد setSetAsTotal آن را با true فراخوانی کنید. مقدار انباشته واقعی را در سلول کتابکار آن نقطه قرار دهید: 600 برای سود ناخالص (1000 - 400) و 450 برای سود خالص (600 - 200 + 50). این متد ستون را بهعنوان کل علامتگذاری میکند؛ محاسبه یا پر کردن مقدار سلول را انجام نمیدهد. از صفر بهعنوان جایگزین استفاده نکنید و مقدار دیگری برای نقطه کل فراهم نکنید. یک ستون کل مقدار انباشتهشده را بدون افزودن مجدد به مقدار جاری نمایش میدهد.
این مثال کامل Java یک نمودار را با عضو Waterfall از ChartType ایجاد میکند، دادههای پیشفرض را پاک میکند و کتابکار توکار را پر میکند. شاخص ورق کار 0 اولین ورق را انتخاب میکند؛ ستون A شامل نام دستهها و ستون B شامل مقادیر است. هر سلول مقدار با addDataPointForWaterfallSeries اضافه میشود. اندیسهای نقطهای مبتنی بر صفر 2 و 5 کلهای میانی و نهایی را شناسایی میکنند. فراخوانی setShowValue با true مقادیر را بر روی ستونها نشان میدهد. ارائه ورودی یا کتابکار مورد نیاز نیست.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Waterfall, 20, 20, 680, 200);
chart.setTitle(true);
chart.getChartTitle().addTextFrameForOverriding("Profit breakdown (USD thousands)");
chart.getChartTitle().setOverlay(false);
chart.setLegend(false);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
int worksheetIndex = 0;
workbook.clear(worksheetIndex);
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, 0, 1, "Profit");
IChartSeries series = chart.getChartData().getSeries().add(seriesNameCell, ChartType.Waterfall);
String[] categories = new String[] { "Revenue", "Cost of sales", "Gross profit", "Operating expenses", "Other income", "Net profit" };
double[] values = new double[] { 1000, -400, 600, -200, 50, 450 };
for (int i = 0; i < categories.length; i++)
{
IChartDataCell categoryCell = workbook.getCell(worksheetIndex, i + 1, 0, categories[i]);
chart.getChartData().getCategories().add(categoryCell);
IChartDataCell valueCell = workbook.getCell(worksheetIndex, i + 1, 1, values[i]);
series.getDataPoints().addDataPointForWaterfallSeries(valueCell);
}
// نقطههای سوم و ششم نشانگر مجموعها هستند، نه تغییرات اضافی.
series.getDataPoints().get_Item(2).setSetAsTotal(true);
series.getDataPoints().get_Item(5).setSetAsTotal(true);
series.setShowConnectorLines(true);
series.getLabels().getDefaultDataLabelFormat().setShowValue(true);
presentation.save("WaterfallChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
متد سطح‑سری setShowConnectorLines را با true صدا بزنید تا خطوط ارتباطی بین ستونهای متوالی نشان داده شوند و مقدار در حال اجرا راحتتر دنبال شود. برای مخفی کردن این خطوط، فراخوانی متد را در مثال به series.setShowConnectorLines(false); تغییر دهید قبل از ذخیره. این فقط قابلیت نمایش خط را تغییر میدهد، نه داده یا کلها.
ارائه ذخیرهشده سود ناخالص ۶۰۰ و سود خالص ۴۵۰ را نشان میدهد، بهطوری که هر دو کل از صفر شروع میشوند:

ایجاد نمودارهای سهام (Stock)
نمودارهای سهام برای نمایش دادههای مالی مانند قیمتهای باز، بالا، پایین و بسته استفاده میشوند و به تجزیه و تحلیل روندهای بازار و نوسانات کمک میکنند. این نمودارها بینشی اساسی درباره عملکرد سهام فراهم میکنند و به سرمایهگذاران و تحلیلگران در اتخاذ تصمیمات آگاهانه کمک مینمایند.
این مثال یک نمودار open‑high‑low‑close با چهار سری به ترتیب و سه دسته ایجاد میکند. متد setUpDownBars میلههای بالا/پایین را فعال میکند و getHiLowLinesFormat خطوط بالا‑پایین که بازه قیمت را نشان میدهند، کنترل میکند؛ در حالی که خطوط سریهای منفرد و خطوط شبکه افقی جزئی مخفی هستند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.OpenHighLowClose, 20, 20, 500, 300, false);
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
IChartDataCell categoryCell = workbook.getCell(0, 1, 0, "A");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, 2, 0, "B");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, 3, 0, "C");
chart.getChartData().getCategories().add(categoryCell);
IChartDataCell seriesNameCell = workbook.getCell(0, 0, 1, "Open");
chart.getChartData().getSeries().add(seriesNameCell, ChartType.OpenHighLowClose);
seriesNameCell = workbook.getCell(0, 0, 2, "High");
chart.getChartData().getSeries().add(seriesNameCell, ChartType.OpenHighLowClose);
seriesNameCell = workbook.getCell(0, 0, 3, "Low");
chart.getChartData().getSeries().add(seriesNameCell, ChartType.OpenHighLowClose);
seriesNameCell = workbook.getCell(0, 0, 4, "Close");
chart.getChartData().getSeries().add(seriesNameCell, ChartType.OpenHighLowClose);
IChartSeries series = chart.getChartData().getSeries().get_Item(0);
IChartDataCell valueCell = workbook.getCell(0, 1, 1, 72);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 2, 1, 25);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 3, 1, 38);
series.getDataPoints().addDataPointForStockSeries(valueCell);
series = chart.getChartData().getSeries().get_Item(1);
valueCell = workbook.getCell(0, 1, 2, 172);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 2, 2, 57);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 3, 2, 57);
series.getDataPoints().addDataPointForStockSeries(valueCell);
series = chart.getChartData().getSeries().get_Item(2);
valueCell = workbook.getCell(0, 1, 3, 12);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 2, 3, 12);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 3, 3, 13);
series.getDataPoints().addDataPointForStockSeries(valueCell);
series = chart.getChartData().getSeries().get_Item(3);
valueCell = workbook.getCell(0, 1, 4, 25);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 2, 4, 38);
series.getDataPoints().addDataPointForStockSeries(valueCell);
valueCell = workbook.getCell(0, 3, 4, 50);
series.getDataPoints().addDataPointForStockSeries(valueCell);
chart.getChartData().getSeriesGroups().get_Item(0).getUpDownBars().setUpDownBars(true);
chart.getChartData().getSeriesGroups().get_Item(0).getHiLowLinesFormat().getLine().getFillFormat().setFillType(FillType.Solid);
for (IChartSeries stockSeries : chart.getChartData().getSeries())
{
stockSeries.getFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
}
chart.getAxes().getVerticalAxis().getMinorGridLinesFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
presentation.save("Stock-chart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای جعبهای و ویسکر (Box and Whisker)
نمودارهای جعبهای و ویسکر برای نمایش توزیع دادهها با خلاصهکردن معیارهای آماری کلیدی مانند میانه، چارکها و نقاط دورافتاده استفاده میشوند. آنها به ویژه در تحلیل اکتشافی دادهها و مطالعات آماری برای درک سریع تغییرپذیری دادهها و شناسایی ناهنجاریها مفید هستند.
این مثال یک نمودار جعبهای و ویسکر از شش مقدار ایجاد میکند. متد setQuartileMethod روش محاسبه چارکهای انحصاری را انتخاب میکند. مثال همچنین خطوط متوسط، نشانگرهای متوسط، نقاط داخلی و نقاط دورافتاده را فعال میکند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.BoxAndWhisker, 20, 20, 500, 300);
chart.getChartData().getCategories().clear();
chart.getChartData().getSeries().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
IChartDataCell categoryCell = workbook.getCell(0, "A1", "Category 1");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A2", "Category 2");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A3", "Category 3");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A4", "Category 4");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A5", "Category 5");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A6", "Category 6");
chart.getChartData().getCategories().add(categoryCell);
IChartSeries series = chart.getChartData().getSeries().add(ChartType.BoxAndWhisker);
series.setQuartileMethod(QuartileMethodType.Exclusive);
series.setShowMeanLine(true);
series.setShowMeanMarkers(true);
series.setShowInnerPoints(true);
series.setShowOutlierPoints(true);
IChartDataCell valueCell = workbook.getCell(0, "B1", 15);
series.getDataPoints().addDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.getCell(0, "B2", 41);
series.getDataPoints().addDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.getCell(0, "B3", 16);
series.getDataPoints().addDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.getCell(0, "B4", 10);
series.getDataPoints().addDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.getCell(0, "B5", 23);
series.getDataPoints().addDataPointForBoxAndWhiskerSeries(valueCell);
valueCell = workbook.getCell(0, "B6", 16);
series.getDataPoints().addDataPointForBoxAndWhiskerSeries(valueCell);
presentation.save("BoxAndWhisker.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
ایجاد نمودارهای قیف (Funnel)
نمودارهای قیف برای بصریسازی فرآیندهایی که شامل مراحل متوالی هستند و حجم دادهها در هر گام کاهش مییابد، بهکار میروند. این نمودارها بهویژه برای تحلیل نرخ تبدیل، شناسایی گلوگاهها و پیگیری کارایی فرآیندهای فروش یا بازاریابی مفیدند.
این مثال با استفاده از addChart یک نمودار قیف به اولین اسلاید یک ارائه موجود اضافه میکند. دادههای پیشفرض را با شش دسته و مقادیر بین ۵۰ تا ۵۰۰ جایگزین میکند و سپس ارائه بهروزرسانیشده را ذخیره میکند. ارائه ورودی باید حداقل یک اسلاید داشته باشد.
import com.aspose.slides.*;
Presentation presentation = new Presentation("test.pptx");
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Funnel, 50, 50, 500, 400);
chart.getChartData().getCategories().clear();
chart.getChartData().getSeries().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
IChartDataCell categoryCell = workbook.getCell(0, "A1", "Category 1");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A2", "Category 2");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A3", "Category 3");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A4", "Category 4");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A5", "Category 5");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "A6", "Category 6");
chart.getChartData().getCategories().add(categoryCell);
IChartSeries series = chart.getChartData().getSeries().add(ChartType.Funnel);
IChartDataCell valueCell = workbook.getCell(0, "B1", 50);
series.getDataPoints().addDataPointForFunnelSeries(valueCell);
valueCell = workbook.getCell(0, "B2", 100);
series.getDataPoints().addDataPointForFunnelSeries(valueCell);
valueCell = workbook.getCell(0, "B3", 200);
series.getDataPoints().addDataPointForFunnelSeries(valueCell);
valueCell = workbook.getCell(0, "B4", 300);
series.getDataPoints().addDataPointForFunnelSeries(valueCell);
valueCell = workbook.getCell(0, "B5", 400);
series.getDataPoints().addDataPointForFunnelSeries(valueCell);
valueCell = workbook.getCell(0, "B6", 500);
series.getDataPoints().addDataPointForFunnelSeries(valueCell);
presentation.save("Funnel.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای خورشیدی (Sunburst)
نمودارهای خورشیدی برای بصریسازی دادههای سلسلهمراتبی استفاده میشوند و سطوح را بهصورت حلقههای همدرونی نمایش میدهند. این نمودارها روابط بخش‑به‑کل را نشان میدهند و برای نمایش دستهها و زیردستههای تو در تو بهصورت واضح و فشرده مناسباند.
این مثال یک نمودار خورشیدی با هشت برگ گروهبندیشده در چهار ساقه و دو شاخه ایجاد میکند. متد setGroupingItem ساقهها را در سطح گروهبندی ۱ و شاخهها را در سطح ۲ اختصاص میدهد. برچسبهای دسته بخشها را شناسایی میکنند و مقادیر اندازه نسبی آنها را تعیین میکنند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Sunburst, 20, 20, 500, 300);
chart.getChartData().getCategories().clear();
chart.getChartData().getSeries().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
// شاخه 1
IChartDataCell categoryCell = workbook.getCell(0, "C1", "Leaf1");
IChartCategory leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem1");
leaf.getGroupingLevels().setGroupingItem(2, "Branch1");
categoryCell = workbook.getCell(0, "C2", "Leaf2");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "C3", "Leaf3");
leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem2");
categoryCell = workbook.getCell(0, "C4", "Leaf4");
chart.getChartData().getCategories().add(categoryCell);
// شاخه 2
categoryCell = workbook.getCell(0, "C5", "Leaf5");
leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem3");
leaf.getGroupingLevels().setGroupingItem(2, "Branch2");
categoryCell = workbook.getCell(0, "C6", "Leaf6");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "C7", "Leaf7");
leaf = chart.getChartData().getCategories().add(categoryCell);
leaf.getGroupingLevels().setGroupingItem(1, "Stem4");
categoryCell = workbook.getCell(0, "C8", "Leaf8");
chart.getChartData().getCategories().add(categoryCell);
IChartSeries series = chart.getChartData().getSeries().add(ChartType.Sunburst);
series.getLabels().getDefaultDataLabelFormat().setShowCategoryName(true);
IChartDataCell valueCell = workbook.getCell(0, "D1", 4);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
valueCell = workbook.getCell(0, "D2", 5);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
valueCell = workbook.getCell(0, "D3", 3);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
valueCell = workbook.getCell(0, "D4", 6);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
valueCell = workbook.getCell(0, "D5", 9);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
valueCell = workbook.getCell(0, "D6", 9);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
valueCell = workbook.getCell(0, "D7", 4);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
valueCell = workbook.getCell(0, "D8", 3);
series.getDataPoints().addDataPointForSunburstSeries(valueCell);
presentation.save("Sunburst.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای هیستوگرام (Histogram)
نمودارهای هیستوگرام نشان میدهند که مقادیر عددی چگونه در بازههای (bins) مختلف توزیع شدهاند. برای گزارشهای ماهانه زمان پردازش سفارش، از عرض بینهها و آستانههای یکسان استفاده کنید تا بازهها ثابت بمانند و توزیعها راحتتر مقایسه شوند.
متد setAggregationType را بر روی محور افقی با یک حالت از AxisAggregationType فراخوانی کنید. setBinWidth فقط برای ByBinWidth اعمال میشود؛ setNumberOfBins فقط برای ByNumberOfBins معتبر است. برای اجازه دادن به نمودار جهت انتخاب بینها از Automatic استفاده کنید.
استفاده از عرض بین ثابت
این مثال زمان پردازش را به بازههای ۱۰‑دقیقهای تقسیم میکند، با بینهای جداگانه برای زمانهای ≤۱۰ دقیقه و >۴۰ دقیقه. این بینها را با setUnderflowBin و setOverflowBin فعال کنید. هنگام ارائه آستانههای صریح از طریق setUnderflowBin و setOverflowBin، متدهای setAutomaticUnderflowBin و setAutomaticOverflowBin را با false فراخوانی کنید.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Histogram, 20, 20, 680, 200);
chart.setLegend(false);
chart.setTitle(false);
chart.getChartData().getCategories().clear();
chart.getChartData().getSeries().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
IChartSeries series = chart.getChartData().getSeries().add(ChartType.Histogram);
double[] values = { 5, 10, 10, 11, 15, 20, 20, 21, 25, 30, 30, 31, 35, 40, 40, 41, 50 };
for (int i = 0; i < values.length; i++)
{
IChartDataCell valueCell = workbook.getCell(0, i, 0, values[i]);
series.getDataPoints().addDataPointForHistogramSeries(valueCell);
}
IAxis axis = chart.getAxes().getHorizontalAxis();
axis.setAggregationType(AxisAggregationType.ByBinWidth);
axis.setBinWidth(10);
axis.setUnderflowBin(true);
axis.setAutomaticUnderflowBin(false);
axis.setUnderflowBin(10);
axis.setOverflowBin(true);
axis.setAutomaticOverflowBin(false);
axis.setOverflowBin(40);
presentation.save("Histogram-bin-width.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
ارائه در PowerPoint تعداد بینها را بهصورت 3, 4, 4, 4, و 2 نشان میدهد. بین زیر جریان شامل 5, 10, 10 است، بنابراین آستانه آن شامل مقادیر است. بین فوق جریان فقط شامل 41, 50 است، بنابراین آستانهاش استثناست؛ هر دو مقدار برابر با 40 در بازه قبلی میمانند. بینهای داخلی شامل مقادیری بزرگتر از حد پایین و کمتر یا مساوی حد بالای خود هستند.

مشخص کردن تعداد بینها
برای سطح جزئیات ثابت بهجای بازههای ثابت، پنج بین برای همان داده درخواست کنید. این مثال بینهای زیر و فوق جریان را غیرفعال میگذارد. نمودار عرض را از بازه داده تعیین میکند، بنابراین مرزها میتوانند بین گزارشها تغییر کنند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.Histogram, 20, 20, 680, 200);
chart.setLegend(false);
chart.setTitle(false);
chart.getChartData().getCategories().clear();
chart.getChartData().getSeries().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
IChartSeries series = chart.getChartData().getSeries().add(ChartType.Histogram);
double[] values = { 5, 10, 10, 11, 15, 20, 20, 21, 25, 30, 30, 31, 35, 40, 40, 41, 50 };
for (int i = 0; i < values.length; i++)
{
IChartDataCell valueCell = workbook.getCell(0, i, 0, values[i]);
series.getDataPoints().addDataPointForHistogramSeries(valueCell);
}
IAxis axis = chart.getAxes().getHorizontalAxis();
axis.setAggregationType(AxisAggregationType.ByNumberOfBins);
axis.setNumberOfBins(5);
presentation.save("Histogram-bin-count.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
پنج بین به ترتیب مقادیر 4, 4, 4, 4, و 1 را دارند. این توزیع را با نتیجه عرض ثابت بالا مقایسه کنید: مقادیر ورودی یکسان هستند، اما مرزها متفاوتاند.

ایجاد نمودارهای رادار (Radar)
نمودارهای رادار برای نمایش دادههای چندمتغیره در قالب دو‑بعدی استفاده میشوند و امکان مقایسه چندین متغیر بهصورت همزمان را فراهم میکنند. این نمودارها بهویژه برای شناسایی الگوها، نقاط قوت و ضعف در میان معیارهای عملکرد متعدد یا ویژگیها مفیدند.
این مثال با استفاده از addChart یک نمودار رادار با سریها و دستههای پیشفرض ایجاد میکند و سپس ارائه را بهصورت PPTX ذخیره میکند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
slide.getShapes().addChart(ChartType.Radar, 20, 20, 500, 300);
presentation.save("Radar-chart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای چنددستهای (Multi-Category)
نمودارهای چنددستهای برای نمایش دادههایی که شامل بیش از یک گروهبندی دستهای هستند استفاده میشوند و امکان مقایسه مقادیر در ابعاد متعدد بهطور همزمان را میدهند. این نمودارها بهویژه زمانی مفیدند که بخواهید روندها و روابط را در مجموعه دادههای چندلایه پیچیده بررسی کنید.
این مثال یک نمودار ستونی خوشهای با هشت دسته در چهار جفت ایجاد میکند. متد setGroupingItem به هر جفت یک برچسب مشترک در سطح گروهبندی ۱ میدهد و محور دسته با برچسبهای منفرد و گروهی تولید میشود.
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);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.clear(0);
int worksheetIndex = 0;
IChartDataCell categoryCell = workbook.getCell(0, "c2", "A");
IChartCategory category = chart.getChartData().getCategories().add(categoryCell);
category.getGroupingLevels().setGroupingItem(1, "Group1");
categoryCell = workbook.getCell(0, "c3", "B");
category = chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "c4", "C");
category = chart.getChartData().getCategories().add(categoryCell);
category.getGroupingLevels().setGroupingItem(1, "Group2");
categoryCell = workbook.getCell(0, "c5", "D");
category = chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "c6", "E");
category = chart.getChartData().getCategories().add(categoryCell);
category.getGroupingLevels().setGroupingItem(1, "Group3");
categoryCell = workbook.getCell(0, "c7", "F");
category = chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(0, "c8", "G");
category = chart.getChartData().getCategories().add(categoryCell);
category.getGroupingLevels().setGroupingItem(1, "Group4");
categoryCell = workbook.getCell(0, "c9", "H");
category = chart.getChartData().getCategories().add(categoryCell);
IChartDataCell seriesNameCell = workbook.getCell(0, "D1", "Series 1");
IChartSeries series = chart.getChartData().getSeries().add(seriesNameCell, ChartType.ClusteredColumn);
IChartDataCell valueCell = workbook.getCell(worksheetIndex, "D2", 10);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, "D3", 20);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, "D4", 30);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, "D5", 40);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, "D6", 50);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, "D7", 60);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, "D8", 70);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, "D9", 80);
series.getDataPoints().addDataPointForBarSeries(valueCell);
presentation.save("AsposeChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

ایجاد نمودارهای نقشه (Map)
نمودارهای نقشه برای بصریسازی دادههای جغرافیایی با نگاشت اطلاعات به مکانهای خاص مانند کشورهای، ایالتها یا شهرها استفاده میشوند. این نمودارها برای تجزیه و تحلیل روندهای منطقهای، دادههای جمعیتی و توزیعهای فضایی بهصورت واضح و جذاب بسیار مفیدند.
این مثال با استفاده از addChart یک نمودار نقشه با دادههای جغرافیایی پیشفرض ایجاد میکند و برای مشاهده در PowerPoint آن را ذخیره میکند.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide
// ایجاد یک نمودار نقشه
IChart chart = slide.getShapes().addChart(ChartType.Map, 20, 20, 500, 300);
presentation.save("mapChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
نتیجه:

Note
تصویر بالا نشان میدهد که ارائه ذخیرهشده در PowerPoint باز میشود. Aspose.Slides نمودار نقشه و دادههای آن را بهدرستی مینویسد، اما خود نمودارهای نقشه را رندر نمیکند: وقتی اسلاید حاوی یک نمودار نقشه به تصویر تبدیل شود یا به PDF یا SVG تبدیل شود، ناحیه نمودار خالی میماند. سایر شکلهای موجود در همان اسلاید تحت تأثیر قرار نمیگیرند.ایجاد نمودارهای ترکیبی (Combination)
یک نمودار ترکیبی (یا combo chart) دو یا چند نوع نمودار را در یک گراف ترکیب میکند. این نمودار به شما اجازه میدهد تا تفاوتها یا مقایسههای بین دو یا چند مجموعه داده را برجسته کنید و روابط بین آنها را شناسایی نمایید.

این مثال دو سری ستونی خوشهای را با یک سری خطی در چهار دسته ترکیب میکند. ستونها از محور عمودی اصلی استفاده میکنند، در حالی که متد setPlotOnSecondAxis خط را بر روی محور عمودی ثانویه سمت راست قرار میدهد. توابع کمکی عنوان، افسانه، برچسبهای محور و خطوط شبکه را پیکربندی میکنند.
import com.aspose.slides.*;
import java.awt.Color;
class ComboChartExample
{
void createComboChart()
{
Presentation presentation = new Presentation();
try
{
IChart chart = createChartWithFirstSeries(presentation.getSlides().get_Item(0));
addSecondSeriesToChart(chart);
addThirdSeriesToChart(chart);
setPrimaryAxesFormat(chart);
setSecondaryAxesFormat(chart);
presentation.save("combo-chart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
}
IChart createChartWithFirstSeries(ISlide slide)
{
IChart chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 50, 50, 600, 400);
chart.setTitle(true);
chart.getChartTitle().addTextFrameForOverriding("Chart Title");
chart.getChartTitle().setOverlay(false);
IPortionFormat portionFormat = chart.getChartTitle().getTextFrameForOverriding().getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat();
portionFormat.setFontBold(NullableBool.False);
portionFormat.setFontHeight(18f);
chart.getLegend().setPosition(LegendPositionType.Bottom);
chart.getLegend().getTextFormat().getPortionFormat().setFontHeight(12f);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
int worksheetIndex = 0;
IChartDataCell categoryCell = workbook.getCell(worksheetIndex, 1, 0, "Category 1");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(worksheetIndex, 2, 0, "Category 2");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(worksheetIndex, 3, 0, "Category 3");
chart.getChartData().getCategories().add(categoryCell);
categoryCell = workbook.getCell(worksheetIndex, 4, 0, "Category 4");
chart.getChartData().getCategories().add(categoryCell);
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, 0, 1, "Series 1");
IChartSeries series = chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
series.getParentSeriesGroup().setOverlap((byte) -25);
series.getParentSeriesGroup().setGapWidth(220);
IChartDataCell valueCell = workbook.getCell(worksheetIndex, 1, 1, 4.3);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 2, 1, 2.5);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 3, 1, 3.5);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 4, 1, 4.5);
series.getDataPoints().addDataPointForBarSeries(valueCell);
return chart;
}
void addSecondSeriesToChart(IChart chart)
{
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
final int worksheetIndex = 0;
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, 0, 2, "Series 2");
IChartSeries series = chart.getChartData().getSeries().add(seriesNameCell, ChartType.ClusteredColumn);
series.getParentSeriesGroup().setOverlap((byte) -25);
series.getParentSeriesGroup().setGapWidth(220);
IChartDataCell valueCell = workbook.getCell(worksheetIndex, 1, 2, 2.4);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 2, 2, 4.4);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 3, 2, 1.8);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 4, 2, 2.8);
series.getDataPoints().addDataPointForBarSeries(valueCell);
}
void addThirdSeriesToChart(IChart chart)
{
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
final int worksheetIndex = 0;
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, 0, 3, "Series 3");
IChartSeries series = chart.getChartData().getSeries().add(seriesNameCell, ChartType.Line);
IChartDataCell valueCell = workbook.getCell(worksheetIndex, 1, 3, 2.0);
series.getDataPoints().addDataPointForLineSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 2, 3, 2.0);
series.getDataPoints().addDataPointForLineSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 3, 3, 3.0);
series.getDataPoints().addDataPointForLineSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 4, 3, 5.0);
series.getDataPoints().addDataPointForLineSeries(valueCell);
series.setPlotOnSecondAxis(true);
}
void setPrimaryAxesFormat(IChart chart)
{
IAxis horizontalAxis = chart.getAxes().getHorizontalAxis();
horizontalAxis.getTextFormat().getPortionFormat().setFontHeight(12f);
horizontalAxis.getFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
setAxisTitle(horizontalAxis, "X Axis");
IAxis verticalAxis = chart.getAxes().getVerticalAxis();
verticalAxis.getTextFormat().getPortionFormat().setFontHeight(12f);
verticalAxis.getFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
setAxisTitle(verticalAxis, "Y Axis 1");
ILineFillFormat majorGridLinesFormat = verticalAxis.getMajorGridLinesFormat().getLine().getFillFormat();
majorGridLinesFormat.setFillType(FillType.Solid);
majorGridLinesFormat.getSolidFillColor().setColor(new Color(217, 217, 217));
}
void setSecondaryAxesFormat(IChart chart)
{
IAxis secondaryHorizontalAxis = chart.getAxes().getSecondaryHorizontalAxis();
secondaryHorizontalAxis.setPosition(AxisPositionType.Bottom);
secondaryHorizontalAxis.setCrossType(CrossesType.Maximum);
secondaryHorizontalAxis.setVisible(false);
secondaryHorizontalAxis.getMajorGridLinesFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
secondaryHorizontalAxis.getMinorGridLinesFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
IAxis secondaryVerticalAxis = chart.getAxes().getSecondaryVerticalAxis();
secondaryVerticalAxis.setPosition(AxisPositionType.Right);
secondaryVerticalAxis.getTextFormat().getPortionFormat().setFontHeight(12f);
secondaryVerticalAxis.getFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
secondaryVerticalAxis.getMajorGridLinesFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
secondaryVerticalAxis.getMinorGridLinesFormat().getLine().getFillFormat().setFillType(FillType.NoFill);
setAxisTitle(secondaryVerticalAxis, "Y Axis 2");
}
void setAxisTitle(IAxis axis, String axisTitle)
{
axis.setTitle(true);
axis.getTitle().setOverlay(false);
IPortionFormat titlePortionFormat = axis.getTitle().addTextFrameForOverriding(axisTitle).getParagraphs().get_Item(0).getParagraphFormat().getDefaultPortionFormat();
titlePortionFormat.setFontBold(NullableBool.False);
titlePortionFormat.setFontHeight(12f);
}
}
ComboChartExample example = new ComboChartExample();
example.createComboChart();
بهروزرسانی نمودارها
Aspose.Slides for Java به شما امکان میدهد نمودارهای PowerPoint را با اصلاح دادههای نمودار، قالببندی و استایل بهروزرسانی کنید. این قابلیت فرآیند نگهداشتن ارائهها با محتوای دینامیک را ساده میکند و اطمینان میدهد که نمودارها بهدقت دادهها و استانداردهای بصری فعلی را بازتاب میدهند.
این مثال نمودار با نام “My chart” را در اولین اسلاید یک ارائه موجود بهروز میکند. این مثال نیاز به دو سری ستونی با سه نقطه داده در هر کدام دارد، که برچسبهای دسته در ستون A و نام سریها در ردیف اول ورق کار اول قرار دارند. این مثال از متد getCell برای تغییر سلولهای کتابکار استفاده میکند، مقادیر سریها را بهروز میکند، سری سوم را اضافه میکند و نوع نمودار را به سیلندرهای خوشهای از طریق setType تغییر میدهد.
import com.aspose.slides.*;
final String chartName = "My chart";
Presentation presentation = new Presentation("ExistingChart.pptx");
try
{
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes())
{
if (shape instanceof IChart && chartName.equals(shape.getName()))
{
IChart chart = (IChart) shape;
int worksheetIndex = 0;
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
workbook.getCell(worksheetIndex, 1, 0, "Modified Category 1");
workbook.getCell(worksheetIndex, 2, 0, "Modified Category 2");
IChartSeries series = chart.getChartData().getSeries().get_Item(0);
workbook.getCell(worksheetIndex, 0, 1, "New_Series 1");
series.getDataPoints().get_Item(0).getValue().setData(90);
series.getDataPoints().get_Item(1).getValue().setData(123);
series.getDataPoints().get_Item(2).getValue().setData(44);
series = chart.getChartData().getSeries().get_Item(1);
workbook.getCell(worksheetIndex, 0, 2, "New_Series 2");
series.getDataPoints().get_Item(0).getValue().setData(23);
series.getDataPoints().get_Item(1).getValue().setData(67);
series.getDataPoints().get_Item(2).getValue().setData(99);
IChartDataCell seriesNameCell = workbook.getCell(worksheetIndex, 0, 3, "Series 3");
series = chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
IChartDataCell valueCell = workbook.getCell(worksheetIndex, 1, 3, 20);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 2, 3, 50);
series.getDataPoints().addDataPointForBarSeries(valueCell);
valueCell = workbook.getCell(worksheetIndex, 3, 3, 30);
series.getDataPoints().addDataPointForBarSeries(valueCell);
chart.setType(ChartType.ClusteredCylinder);
}
}
presentation.save("AsposeChartModified.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
تنظیم دامنه داده برای یک نمودار
برای بررسی دامنهای که قبلاً توسط یک نمودار موجود استفاده شده است، به Retrieve a Chart’s Data Range مراجعه کنید.
Aspose.Slides for Java انعطافپذیری تعریف دامنه داده خاصی از یک ورق کار بهعنوان منبع داده برای نمودار شما را فراهم میکند. این به این معنی است که میتوانید مستقیماً بخشی از ورق کار را به نمودار نگاشت کنید و کنترل کنید که کدام سلولها به سریها و دستههای نمودار کمک میکنند. در نتیجه، میتوانید نمودارهای خود را بهراحتی با آخرین تغییرات داده در ورق کار همگامسازی کنید و اطمینان حاصل کنید که ارائههای PowerPoint شما اطلاعات دقیق و بهروزی دارند.
این مثال از متد setRange برای تنظیم منبع داده نمودار با نام “My chart” در اولین اسلاید یک ارائه موجود به Sheet1!A1:B4 استفاده میکند. کتابکار نمودار باید شامل همان ورق کار باشد و دامنهای پر شده داشته باشد که سرصفحه سری در ردیف اول، برچسبهای دسته در ستون A و سه مقدار در ستون B قرار داشته باشند.
import com.aspose.slides.*;
final String chartName = "My chart";
Presentation presentation = new Presentation("ExistingChart.pptx");
try
{
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes())
{
if (shape instanceof IChart && chartName.equals(shape.getName()))
{
IChart chart = (IChart) shape;
chart.getChartData().setRange("Sheet1!A1:B4");
}
}
presentation.save("SetDataRange.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
استفاده از علامتگرهای پیشفرض در نمودارها
وقتی از علامتگرهای پیشفرض در نمودارها استفاده میکنید، هر سری نمودار بهصورت خودکار یک نماد علامتگر پیشفرض متفاوت دریافت میکند.
این مثال با استفاده از addChart یک نمودار با دو سری خطی و یک افسانه ایجاد میکند. تنظیمات علامتگر از طریق getMarker نمادهای علامتگر اختصاصیافته خودکار را حفظ میکند. سری اول شامل یک مقدار منفی و یک مقدار مفقود (null) است، در حالی که سری دوم برای هر دسته یک مقدار دارد.
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try
{
ISlide slide = presentation.getSlides().get_Item(0);
IChart chart = slide.getShapes().addChart(ChartType.LineWithMarkers, 10, 10, 400, 400);
chart.getChartData().getSeries().clear();
chart.getChartData().getCategories().clear();
IChartDataWorkbook workbook = chart.getChartData().getChartDataWorkbook();
IChartDataCell seriesNameCell = workbook.getCell(0, 0, 1, "Series 1");
IChartSeries series = chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
IChartDataCell categoryCell = workbook.getCell(0, 1, 0, "C1");
chart.getChartData().getCategories().add(categoryCell);
IChartDataCell valueCell = workbook.getCell(0, 1, 1, 24);
series.getDataPoints().addDataPointForLineSeries(valueCell);
categoryCell = workbook.getCell(0, 2, 0, "C2");
chart.getChartData().getCategories().add(categoryCell);
valueCell = workbook.getCell(0, 2, 1, 23);
series.getDataPoints().addDataPointForLineSeries(valueCell);
categoryCell = workbook.getCell(0, 3, 0, "C3");
chart.getChartData().getCategories().add(categoryCell);
valueCell = workbook.getCell(0, 3, 1, -10);
series.getDataPoints().addDataPointForLineSeries(valueCell);
categoryCell = workbook.getCell(0, 4, 0, "C4");
chart.getChartData().getCategories().add(categoryCell);
valueCell = workbook.getCell(0, 4, 1, null);
series.getDataPoints().addDataPointForLineSeries(valueCell);
seriesNameCell = workbook.getCell(0, 0, 2, "Series 2");
IChartSeries secondSeries = chart.getChartData().getSeries().add(seriesNameCell, chart.getType());
valueCell = workbook.getCell(0, 1, 2, 30);
secondSeries.getDataPoints().addDataPointForLineSeries(valueCell);
valueCell = workbook.getCell(0, 2, 2, 10);
secondSeries.getDataPoints().addDataPointForLineSeries(valueCell);
valueCell = workbook.getCell(0, 3, 2, 60);
secondSeries.getDataPoints().addDataPointForLineSeries(valueCell);
valueCell = workbook.getCell(0, 4, 2, 40);
secondSeries.getDataPoints().addDataPointForLineSeries(valueCell);
chart.setLegend(true);
chart.getLegend().setOverlay(false);
presentation.save("DefaultMarkersInChart.pptx", SaveFormat.Pptx);
}
finally
{
presentation.dispose();
}
پرسشهای متداول
کدام انواع نمودارها توسط Aspose.Slides for Java پشتیبانی میشوند؟
Aspose.Slides for Java طیف وسیعی از انواع نمودارها شامل ستونی، خطی، دایرهای، ناحیهای، پراکنده، هیستوگرام، رادار و بسیاری دیگر را پشتیبانی میکند. این انعطافپذیری به شما اجازه میدهد مناسبترین نوع نمودار را برای نیازهای بصریسازی دادههای خود انتخاب کنید.
چگونه یک نمودار جدید به اسلاید اضافه کنم؟
برای افزودن یک نمودار، ابتدا یک نمونه از کلاس Presentation ایجاد میکنید، اسلاید مورد نظر را با استفاده از شاخص آن دریافت میکنید و سپس متد افزودن نمودار را فراخوانی میکنید، نوع نمودار و دادههای اولیه را مشخص میکنید. این فرآیند نمودار را مستقیماً در ارائه شما ادغام میکند.
چگونه میتوانم دادههای نمایش دادهشده در یک نمودار را بهروز کنم؟
میتوانید با دسترسی به کتابکار داده نمودار (IChartDataWorkbook)، سریها و دستههای پیشفرض را پاک کنید و دادههای سفارشی خود را اضافه کنید. این امکان بهصورت برنامهنویسی نمودار را برای بازتاب جدیدترین دادهها بهروز میکند.
آیا امکان سفارشیسازی ظاهر نمودار وجود دارد؟
بله، Aspose.Slides for Java گزینههای سفارشیسازی گستردهای ارائه میدهد. میتوانید رنگها، قلمها، برچسبها، افسانهها و سایر عناصر قالببندی را تغییر دهید تا ظاهر نمودار را مطابق نیازهای طراحی خاص خود تنظیم کنید.