راهحل عملی برای تغییر اندازه نمودار در PPTX
پیشزمینه
مشاهده شده است که نمودارهای اکسل که به عنوان اشیای OLE در یک ارائه پاورپوینت از طریق اجزای Aspose جاسازی میشوند، پس از اولین فعالسازی به مقیاس نامشخصی تغییر اندازه میدهند. این رفتار باعث تفاوت بصری مشهودی در ارائه بین حالت پیش‑فعالسازی و پسفعالسازی نمودار میشود. تیم Aspose مسئله را به طور جزئی بررسی کرد و راهحلی یافت. این مقاله علل مشکل و رفع آن را شرح میدهد.
در مقالهٔ قبلی، نحوهٔ ایجاد یک نمودار اکسل با Aspose.Cells برای .NET و جاسازی آن در یک ارائه پاورپوینت با استفاده از Aspose.Slides برای .NET را توضیح دادیم. برای رفع مسئله پیشنمایش شی، تصویر نمودار را به فریم OLE شی اختصاص دادیم. در ارائه خروجی، هنگامی که فریم OLE حاوی تصویر نمودار را دو بار کلیک میکنید، نمودار اکسل فعال میشود. کاربران نهایی میتوانند هر تغییری که میخواهند در کتابکار اکسل پایه اعمال کنند و سپس با کلیک خارج از کتابکار فعال، به اسلاید مربوطه بازگردند. هنگام بازگشت کاربر به اسلاید، اندازهٔ فریم OLE تغییر میکند و عامل تغییر اندازه بسته به اندازهٔ اولیهٔ هر دو فریم OLE و کتابکار اکسل جاسازیشده متفاوت است.
علت تغییر اندازه
به دلیل اینکه کتابکار اکسل دارای اندازهٔ پنجرهٔ خود است، سعی میکند اندازهٔ اصلی خود را در اولین فعالسازی حفظ کند. فریم OLE اما اندازهٔ مختص خود را دارد. بر اساس گفته مایکروسافت، هنگامی که کتابکار اکسل فعال میشود، اکسل و پاورپوینت برای حفظ نسبتهای صحیح، اندازه را مذاکره میکنند به عنوان بخشی از فرایند جاسازی. بسته به اختلاف بین اندازهٔ پنجرهٔ اکسل و اندازه یا موقعیت فریم OLE، تغییر اندازه رخ میدهد.
راهحل عملی
دو سناریوی ممکن برای ایجاد ارائههای پاورپوینت با Aspose.Slides برای .NET وجود دارد.
سناریوی 1: ایجاد ارائه بر پایهٔ یک قالب موجود.
سناریوی 2: ایجاد ارائه از صفر.
راهحلی که در اینجا ارائه میدهیم برای هر دو سناریو قابل اعمال است. پایهٔ تمام روشهای حل مسئله یکسان است: باید اندازهٔ پنجرهٔ شی OLE جاسازیشده با فریم OLE در اسلاید پاورپوینت منطبق باشد. اکنون دو روش این راهحل را بررسی میکنیم.
رویکرد اول
در این روش، نحوهٔ تنظیم اندازهٔ پنجرهٔ کتابکار اکسل جاسازیشده را طوری که با اندازهٔ فریم OLE در اسلاید پاورپوینت مطابقت داشته باشد، یاد می‑گیریم.
سناریوی 1
فرض کنید یک قالب تعریف کردهایم و میخواهیم ارائهها را بر پایهٔ آن ایجاد کنیم. فرض کنید در قالب، شکلی در اندیس 2 موجود باشد که میخواهیم فریم OLE حاوی کتابکار اکسل جاسازیشده را در آن قرار دهیم. در این سناریو، اندازهٔ فریم OLE از پیش تعریف شده است—که با اندازهٔ شکل در اندیس 2 در قالب مطابقت دارد. تمام کاری که باید انجام دهیم این است که اندازهٔ پنجرهٔ کتابکار را برابر با اندازهٔ آن شکل تنظیم کنیم. قطعه کد زیر این منظور را انجام میدهد:
// اندازه نمودار را با یک پنجره تعریف کنید.
chart.SizeWithWindow = true;
// عرض پنجره کتابکار را بر حسب اینچ تنظیم کنید (به ۷۲ تقسیم میشود زیرا PowerPoint ۷۲ پیکسل در اینچ استفاده میکند).
workbook.Worksheets.WindowWidthInch = slide.Shapes[2].Width / 72f;
// ارتفاع پنجره کتابکار را برحسب اینچ تنظیم کنید.
workbook.Worksheets.WindowHeightInch = slide.Shapes[2].Height / 72f;
// کتابکار را به یک جریان حافظه ذخیره کنید.
MemoryStream workbookStream = workbook.SaveToStream();
// یک فریم شی OLE با دادههای اکسل جاسازیشده ایجاد کنید.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
slide.Shapes[2].X,
slide.Shapes[2].Y,
slide.Shapes[2].Width,
slide.Shapes[2].Height,
"Excel.Sheet.8",
workbookStream.ToArray());
سناریوی 2
بیایید بگوییم میخواهیم یک ارائه از صفر ایجاد کنیم و فریمی OLE با هر اندازهای و کتابکار اکسل جاسازیشده در آن قرار دهیم. در قطعه کد زیر، یک فریم OLE به ارتفاع ۴ اینچ و عرض ۹.۵ اینچ در موقعیت x = ۰.۵ اینچ و y = ۱ اینچ روی اسلاید ایجاد میکنیم. سپس پنجرهٔ کتابکار اکسل را به همان اندازه—۴ اینچ ارتفاع و ۹.۵ اینچ عرض—تنظیم میکنیم.
// ارتفاع مورد نظر ما.
int desiredHeight = 288; // 4 اینچ (4 * 72)
// عرض مورد نظر ما.
int desiredWidth = 684; // 9.5 اینچ (9.5 * 72)
// اندازه نمودار را با یک پنجره تعریف کنید.
chart.SizeWithWindow = true;
// عرض پنجره کتابکار را برحسب اینچ تنظیم کنید.
workbook.Worksheets.WindowWidthInch = desiredWidth / 72f;
// ارتفاع پنجره کتابکار را برحسب اینچ تنظیم کنید.
workbook.Worksheets.WindowHeightInch = desiredHeight / 72f;
// کتابکار را به یک جریان حافظه ذخیره کنید.
MemoryStream workbookStream = workbook.SaveToStream();
// یک فریم شی OLE با دادههای اکسل جاسازیشده ایجاد کنید.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
36,
72,
desiredWidth,
desiredHeight,
"Excel.Sheet.8",
workbookStream.ToArray());
رویکرد دوم
در این روش، نحوهٔ تنظیم اندازهٔ نمودار در کتابکار اکسل جاسازیشده را طوری که با اندازهٔ فریم OLE در اسلاید پاورپوینت منطبق باشد، یاد می‑گیریم. این روش زمانی مفید است که اندازهٔ نمودار از پیش شناخته شده باشد و در آینده تغییر نکند.
سناریوی 1
فرض کنید یک قالب تعریف کردهایم و میخواهیم ارائهها را بر پایهٔ آن ایجاد کنیم. فرض کنید در قالب، شکلی در اندیس 2 موجود باشد که میخواهیم فریم OLE حاوی کتابکار اکسل جاسازیشده را در آن قرار دهیم. در این سناریو، اندازهٔ فریم OLE از پیش تعریف شده است—که با اندازهٔ شکل در اندیس ۲ مطابقت دارد. تمام کاری که باید انجام دهیم این است که اندازهٔ نمودار در کتابکار را برابر با اندازهٔ آن شکل تنظیم کنیم. قطعه کد زیر این هدف را برآورده میکند:
// اندازه نمودار را بدون پنجره تعریف کنید.
chart.SizeWithWindow = false;
// عرض نمودار را بر حسب پیکسل تنظیم کنید (ضرب در 96 چون Excel 96 پیکسل در اینچ استفاده میکند).
chart.ChartObject.Width = (int)((slide.Shapes[2].Width / 72f) * 96f);
// ارتفاع نمودار را بر حسب پیکسل تنظیم کنید.
chart.ChartObject.Height = (int)((slide.Shapes[2].Height / 72f) * 96f);
// اندازه چاپ نمودار را تعریف کنید.
chart.PrintSize = PrintSizeType.Custom;
// کتابکار را به یک جریان حافظه ذخیره کنید.
MemoryStream workbookStream = workbook.SaveToStream();
// یک فریم شی OLE با دادههای اکسل جاسازیشده ایجاد کنید.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
slide.Shapes[2].X,
slide.Shapes[2].Y,
slide.Shapes[2].Width,
slide.Shapes[2].Height,
"Excel.Sheet.8",
workbookStream.ToArray());
سناریوی 2
فرض کنید میخواهیم یک ارائه از صفر ایجاد کنیم و فریمی OLE با هر اندازهای و کتابکار اکسل جاسازیشده در آن داشته باشیم. در قطعه کد زیر، یک فریم OLE با ارتفاع ۴ اینچ و عرض ۹.۵ اینچ در موقعیت x = ۰.۵ اینچ و y = ۱ اینچ روی اسلاید ایجاد میکنیم. همچنین اندازهٔ نمودار متناظر را به همان ابعاد تنظیم میکنیم: ارتفاع ۴ اینچ و عرض ۹.۵ اینچ.
// ارتفاع مورد نظر ما.
int desiredHeight = 288; // 4 اینچ (4 * 576)
// عرض مورد نظر ما.
int desiredWidth = 684; // 9.5 اینچ (9.5 * 576)
// اندازه نمودار را بدون پنجره تعریف کنید.
chart.SizeWithWindow = false;
// عرض نمودار را بر حسب پیکسل تنظیم کنید.
chart.ChartObject.Width = (int)((desiredWidth / 72f) * 96f);
// ارتفاع نمودار را بر حسب پیکسل تنظیم کنید.
chart.ChartObject.Height = (int)((desiredHeight / 72f) * 96f);
// کتابکار را به یک جریان حافظه ذخیره کنید.
MemoryStream workbookStream = workbook.SaveToStream();
// یک فریم شی OLE با دادههای اکسل جاسازیشده ایجاد کنید.
Aspose.Slides.OleObjectFrame oleFrame = slide.Shapes.AddOleObjectFrame(
36,
72,
desiredWidth,
desiredHeight,
"Excel.Sheet.8",
workbookStream.ToArray());
نتیجهگیری
دو رویکرد برای رفع مشکل تغییر اندازهٔ نمودار وجود دارد. انتخاب رویکرد بستگی به نیازها و مورد استفاده دارد. هر دو رویکرد بهصورت یکسان برای ارائههای ساختهشده از قالب یا از صفر کار میکنند. همچنین هیچ محدودیتی برای اندازهٔ فریم OLE در این راهحل وجود ندارد.
سوالات متداول
چرا پس از فعالسازی در پاورپوینت، نمودار اکسل جاسازیشده من تغییر اندازه میدهد؟
این به این دلیل است که اکسل سعی میکند اندازهٔ پنجرهٔ اصلی خود را در اولین فعالسازی بازیابی کند، در حالی که فریم OLE در پاورپوینت دارای ابعاد جداگانهای است. پاورپوینت و اکسل برای حفظ نسبت عرض‑به‑ارتفاع مذاکره میکنند که میتواند منجر به تغییر اندازه شود.
آیا میتوان این مشکل تغییر اندازه را کاملاً جلوگیری کرد؟
بله. با هماهنگسازی اندازهٔ پنجرهٔ کتابکار اکسل یا اندازهٔ نمودار با اندازهٔ فریم OLE قبل از جاسازی، میتوانید اندازهٔ نمودارها را ثابت نگه دارید.
کدام رویکرد را باید انتخاب کنم، تنظیم اندازهٔ پنجرهٔ کتابکار یا تنظیم اندازهٔ نمودار؟
از رویکرد ۱ (اندازهٔ پنجره) استفاده کنید اگر میخواهید نسبت ابعاد کتابکار حفظ شود و ممکن است بعداً امکان تغییر اندازه وجود داشته باشد.
از رویکرد ۲ (اندازهٔ نمودار) استفاده کنید اگر ابعاد نمودار ثابت هستند و پس از جاسازی تغییر نخواهند کرد.
آیا این روشها برای ارائههای مبتنی بر قالب و ارائههای جدید همکار هستند؟
بله. هر دو رویکرد برای ارائههای ساختهشده از قالب و از صفر بهطور یکسان کار میکنند.
آیا محدودیتی برای اندازهٔ فریم OLE وجود دارد؟
خیر. میتوانید فریم OLE را به هر اندازهای تنظیم کنید به شرطی که بهدرستی با اندازهٔ کتابکار یا نمودار مقیاسبندی شود.
آیا میتوانم از این روشها برای نمودارهای ایجادشده در سایر برنامههای صفحهگسترده استفاده کنم؟
نمونهها برای نمودارهای اکسل ایجادشده با Aspose.Cells طراحی شدهاند، اما اصول برای سایر برنامههای صفحهگستردهٔ سازگار با OLE که گزینههای مشابهی برای تنظیم اندازه دارند، نیز کاربرد دارد.