راهحل عملی برای تغییر اندازه نمودار در PPTX
پیشزمینه
مشاهده شده است که نمودارهای اکسل که به عنوان اشیاء OLE در یک ارائه پاورپوینت از طریق اجزای Aspose جاسازی میشوند، پس از اولین فعالسازی به مقیاس نامشخصی تغییر اندازه میدهند. این رفتار باعث تفاوت واضحی در ارائه بین حالتهای قبل و بعد از فعالسازی نمودار میشود. تیم Aspose این مشکل را بهطور جزئی بررسی کرده و راهحلی یافته است. این مقاله علل مشکل و رفع آن را شرح میدهد.
در مقاله قبلی توضیح دادیم که چگونه یک نمودار اکسل را با Aspose.Cells for Java ایجاد کرده و آن را به عنوان شیء OLE در یک ارائه پاورپوینت با Aspose.Slides for Java جاسازی کنیم. برای رفع مشکل پیشنمایش شیء، تصویر نمودار را به چارچوب شیء OLE نمودار اختصاص دادیم. در ارائه خروجی، وقتی بر چارچوب شیء OLE که تصویر نمودار را نشان میدهد دوبار کلیک کنید، نمودار اکسل فعال میشود. کاربران میتوانند تغییرات دلخواه خود را در کتابکار اکسل انجام دهند و سپس با کلیک خارج از کتابکار فعال شده به اسلاید مربوطه بازگردند. اندازه چارچوب شیء OLE هنگام بازگشت کاربر به اسلاید تغییر میکند و ضریب تغییر اندازه بسته به اندازههای اولیه هر دو چارچوب شیء OLE و کتابکار اکسل جاسازی شده متفاوت است.
علت تغییر اندازه
از آنجا که کتابکار اکسل پنجرهٔ خود را دارد، سعی میکند در اولین فعالسازی اندازه اصلی خود را حفظ کند. اما چارچوب شیء OLE اندازهٔ خود را دارد. بر اساس مایکروسافت، وقتی کتابکار اکسل فعال میشود، اکسل و پاورپوینت برای فرآیند جاسازی، اندازه را مذاکره کرده و نسبتهای صحیح را حفظ میکنند. بسته به تفاوت بین اندازه پنجرهٔ اکسل و اندازه یا موقعیت چارچوب شیء OLE، تغییر اندازه رخ میدهد.
راهحل عملی
دو سناریوی ممکن برای ایجاد ارائههای پاورپوینت با Aspose.Slides for Java وجود دارد.
سناریوی 1: ایجاد یک ارائه بر پایهٔ یک الگوی موجود.
سناریوی 2: ایجاد یک ارائه از ابتدا.
راهحلی که در اینجا ارائه میدهیم برای هر دو سناریو اعمال میشود. پایهٔ تمامی رویکردهای حل مسئله یکی است: اندازهٔ پنجرهٔ شیء OLE جاسازی شده باید با چارچوب شیء OLE در اسلاید پاورپوینت مطابقت داشته باشد. اکنون دو رویکرد این راهحل را بررسی میکنیم.
رویکرد اول
در این رویکرد، نحوهٔ تنظیم اندازهٔ پنجرهٔ کتابکار اکسل جاسازی شده را میآموزیم تا با اندازهٔ چارچوب شیء OLE در اسلاید پاورپوینت مطابقت داشته باشد.
سناریوی 1
فرض کنید یک الگو تعریف کردهایم و میخواهیم ارائههایی بر پایهٔ آن ایجاد کنیم. فرض کنید در الگو یک شکل در موقعیت شاخص 2 وجود دارد که میخواهیم چارچوب OLE شامل کتابکار اکسل جاسازیشده را در آن قرار دهیم. در این سناریو، اندازهٔ چارچوب شیء OLE از پیش تعریف شده است—که با اندازهٔ شکل در شاخص 2 الگو مطابقت دارد. تنها کاری که لازم است انجام دهیم این است که اندازهٔ پنجرهٔ کتابکار را برابر با اندازهٔ آن شکل تنظیم کنیم. قطعه کد زیر این منظور را برآورده میکند:
// عرض پنجره کتابکار را بر حسب اینچ تنظیم کنید (بهصورت تقسیم بر 576 زیرا پاورپوینت 576 پیکسل در اینچ استفاده میکند).
workbook.getSettings().setWindowWidthInch(slide.getShapes().get_Item(2).getWidth() / 72f);
// ارتفاع پنجره کتابکار را بر حسب اینچ تنظیم کنید.
workbook.getSettings().setWindowHeightInch(slide.getShapes().get_Item(2).getHeight() / 72f);
// کتابکار را در یک جریان حافظه ذخیره کنید.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// یک چارچوب شیء OLE با دادههای اکسل جاسازیشده ایجاد کنید.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
slide.getShapes().get_Item(2).getX(),
slide.getShapes().get_Item (2).getY(),
slide.getShapes().get_Item (2).getWidth(),
slide.getShapes().get_Item (2).getHeight(),
"Excel.Sheet.8",
workbookStream.toByteArray());
سناریوی 2
فرض کنید میخواهیم یک ارائه از ابتدا ایجاد کنیم و یک چارچوب شیء OLE با هر اندازهای شامل کتابکار اکسل جاسازیشده اضافه کنیم. در قطعه کد زیر، یک چارچوب شیء OLE با ارتفاع 4 اینچ و عرض 9.5 اینچ در مختصات x = 0.5 اینچ و y = 1 اینچ روی اسلاید ایجاد میکنیم. سپس پنجرهٔ کتابکار اکسل را به همان اندازه—ارتفاع 4 اینچ و عرض 9.5 اینچ—تنظیم میکنیم.
// ارتفاع دلخواه ما.
int desiredHeight = 288; // 4 اینچ (4 * 72)
// عرض دلخواه ما.
int desiredWidth = 684; // 9.5 اینچ (9.5 * 72)
// تعریف اندازه نمودار با پنجره.
chart.setSizeWithWindow(true);
// عرض پنجره کتابکار را بر حسب اینچ تنظیم کنید (تقسیم بر 576 چون PowerPoint از 576 پیکسل در هر اینچ استفاده میکند).
workbook.getSettings().setWindowWidthInch(desiredHeight / 72f);
// ارتفاع پنجره کتابکار را بر حسب اینچ تنظیم کنید.
workbook.getSettings().setWindowHeightInch(desiredWidth / 72f);
// کتابکار را در یک جریان حافظه ذخیره کنید.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// یک چارچوب شیء OLE با دادههای اکسل جاسازیشده ایجاد کنید.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
288,
576,
desiredWidth,
desiredHeight,
"Excel.Sheet.8",
workbookStream.toByteArray());
رویکرد دوم
در این رویکرد، یاد میگیریم چگونه اندازهٔ نمودار در کتابکار اکسل جاسازیشده را طوری تنظیم کنیم که با اندازهٔ چارچوب شیء OLE در اسلاید پاورپوینت مطابقت داشته باشد. این رویکرد وقتی مفید است که اندازهٔ نمودار از پیش شناخته شده باشد و هرگز تغییر نکند.
سناریوی 1
فرض کنید یک الگو تعریف کردهایم و میخواهیم ارائههایی بر پایهٔ آن ایجاد کنیم. فرض کنید در الگو یک شکل در موقعیت شاخص 2 وجود دارد که قصد داریم چارچوب OLE شامل کتابکار اکسل جاسازیشده را در آن قرار دهیم. در این سناریو، اندازهٔ چارچوب OLE از پیش تعریف شده است—که با اندازهٔ شکل شاخص 2 الگو مطابقت دارد. تنها کاری که لازم است انجام دهیم این است که اندازهٔ نمودار را در کتابکار برابر با اندازهٔ آن شکل تنظیم کنیم. قطعه کد زیر این منظور را برآورده میکند:
// تعریف اندازهٔ نمودار بدون پنجره.
chart.setSizeWithWindow(false);
// تنظیم عرض نمودار بر حسب پیکسل (ضرب در 96 چون اکسل 96 پیکسل در اینچ استفاده میکند).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 72f) * 96f));
// تنظیم ارتفاع نمودار بر حسب پیکسل.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 72f) * 96f));
// تعریف اندازهٔ چاپ نمودار.
chart.setPrintSize(PrintSizeType.CUSTOM);
// ذخیره کتابکار در یک جریان حافظه.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// ایجاد یک چارچوب شیء OLE با دادههای اکسل جاسازیشده.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
slide.getShapes().get_Item(2).getX(),
slide.getShapes().get_Item (2).getY(),
slide.getShapes().get_Item (2).getWidth(),
slide.getShapes().get_Item (2).getHeight(),
"Excel.Sheet.8",
workbookStream.toByteArray());
سناریوی 2:
فرض کنید میخواهیم یک ارائه از ابتدا ایجاد کنیم و یک چارچوب شیء OLE با هر اندازهای شامل کتابکار اکسل جاسازیشده اضافه کنیم. در قطعه کد زیر، یک چارچوب شیء OLE با ارتفاع 4 اینچ و عرض 9.5 اینچ در مختصات x = 0.5 اینچ و y = 1 اینچ روی اسلاید ایجاد میکنیم. همچنین اندازهٔ نمودار مربوطه را به همان ابعاد تنظیم میکنیم: ارتفاع 4 اینچ و عرض 9.5 اینچ.
// ارتفاع دلخواه ما.
int desiredHeight = 288; // 4 اینچ (4 * 72)
// عرض دلخواه ما.
int desiredWidth = 684; // 9.5 اینچ (9.5 * 72)
// تعریف اندازهٔ نمودار بدون پنجره.
chart.setSizeWithWindow(false);
// تنظیم عرض نمودار بر حسب پیکسل (ضرب در 96 چون اکسل 96 پیکسل در اینچ استفاده میکند).
chart.getChartObject().setWidth((int)((slide.getShapes().get_Item(2).getWidth() / 576f) * 96f));
// تنظیم ارتفاع نمودار بر حسب پیکسل.
chart.getChartObject().setHeight((int)((slide.getShapes().get_Item(2).getHeight() / 576f) * 96f));
// ذخیره کتابکار در یک جریان حافظه.
ByteArrayOutputStream workbookStream = new ByteArrayOutputStream();
workbook.save(workbookStream, com.aspose.cells.SaveFormat.EXCEL_97_TO_2003);
// ایجاد یک چارچوب شیء OLE با دادههای اکسل جاسازیشده.
IOleObjectFrame oleFrame = slide.getShapes().addOleObjectFrame(
288,
576,
desiredWidth,
desiredHeight,
"Excel.Sheet.8",
workbookStream.toByteArray());
نتیجهگیری
دو رویکرد برای رفع مشکل تغییر اندازهٔ نمودار وجود دارد. انتخاب رویکرد بستگی به نیازها و مورد استفاده دارد. هر دو رویکرد بهصورت یکسان کار میکنند چه ارائهها از یک الگو ساخته شوند و چه از ابتدا. همچنین در این راهحل محدودیتی برای اندازهٔ چارچوب شیء OLE وجود ندارد.
سوالات متداول
چرا پس از فعالسازی نمودار اکسل جاسازیشده در پاورپوینت اندازهاش تغییر میکند؟
این به این دلیل رخ میدهد که اکسل سعی میکند در اولین فعالسازی اندازهٔ پنجرهٔ اصلی خود را بازگرداند، در حالی که چارچوب شیء OLE در پاورپوینت ابعاد خاص خود را دارد. پاورپوینت و اکسل برای حفظ نسبت عرض به ارتفاع، اندازه را مذاکره میکنند که میتواند منجر به تغییر اندازه شود.
آیا میتوان این مشکل تغییر اندازه را بهطور کامل جلوگیری کرد؟
بله. با مطابقت دادن اندازهٔ پنجرهٔ کتابکار اکسل یا اندازهٔ نمودار با اندازهٔ چارچوب شیء OLE قبل از جاسازی، میتوانید اندازهٔ نمودارها را ثابت نگه دارید.
کدام رویکرد را باید انتخاب کنم: تنظیم اندازهٔ پنجرهٔ کتابکار یا تنظیم اندازهٔ نمودار؟
از رویکرد 1 (اندازهٔ پنجره) استفاده کنید اگر میخواهید نسبت ابعاد کتابکار حفظ شود و امکان تغییر اندازه بعدی داشته باشد.
از رویکرد 2 (اندازهٔ نمودار) استفاده کنید اگر ابعاد نمودار ثابت هستند و پس از جاسازی تغییر نخواهند کرد.
آیا این روشها برای ارائههای مبتنی بر الگو و ارائههای جدید عمل میکنند؟
بله. هر دو رویکرد برای ارائههای ساختهشده از الگوها و از ابتدا بهصورت یکسان عمل میکنند.
آیا برای اندازهٔ چارچوب شیء OLE محدودیتی وجود دارد؟
خیر. میتوانید چارچوب OLE را به هر اندازهای تنظیم کنید به شرط آنکه بهدرستی به اندازهٔ کتابکار یا نمودار مقیاسبندی شود.
آیا میتوانم از این روشها برای نمودارهای ساختهشده در سایر برنامههای صفحهگسترده استفاده کنم؟
مثالها برای نمودارهای اکسل ایجاد شده با Aspose.Cells طراحی شدهاند، اما اصول برای سایر برنامههای صفحهگستردهٔ سازگار با OLE که گزینههای مشابهی برای تنظیم اندازه دارند، نیز قابلاستفاده است.