حل عملي لتغيير حجم ورقة العمل
السياق
في مقال إضافة إطارات Ole, شرحنا كيفية إضافة إطار Ole في العرض في عرض PowerPoint باستخدام Aspose.Slides لـ PHP عبر Java. من أجل معالجة مشكلة تغيير الكائن، قمنا بتعيين صورة ورقة العمل لمنطقة محددة إلى إطار كائن OLE الخاص بالرسم البياني. في العرض الناتج، عندما نقوم بالنقر المزدوج على إطار كائن OLE الذي يعرض صورة ورقة العمل، يتم تنشيط رسم Excel البياني. يمكن لمستخدمي النهاية إجراء أي تغييرات مطلوبة في دفتر العمل Excel الفعلي ثم العودة إلى الشريحة المعنية من خلال النقر خارج دفتر العمل Excel المفعّل. سيتغير حجم إطار كائن OLE عندما يعود المستخدم إلى الشريحة. ستكون عوامل تغيير الحجم مختلفة لأحجام مختلفة من إطار كائن OLE ودفتر العمل Excel المدمج.
سبب تغيير الحجم
نظرًا لأن دفتر العمل Excel له حجم نافذته الخاصة، فإنه يحاول الاحتفاظ بحجمه الأصلي عند التفعيل الأول. من ناحية أخرى، سيكون لإطار كائن OLE حجمه الخاص. وفقًا لـ Microsoft، عند تنشيط دفتر العمل Excel، تتفاوض Excel وPowerPoint على الحجم وتضمن أنه يتناسب بشكل صحيح كجزء من عملية التضمين. استنادًا إلى الاختلافات في حجم نافذة Excel وحجم / موضع إطار كائن OLE، يحدث تغيير الحجم.
حل عملي
هناك حلّان ممكنان لتجنب تأثير إعادة الحجم.* قم بتغيير حجم إطار Ole في PPT ليتناسب مع الحجم من حيث ارتفاع/عرض عدد الصفوف/الأعمدة المطلوب في إطار Ole* احتفظ بحجم إطار Ole ثابتًا وقم بتغيير حجم الصفوف/الأعمدة المشاركة لتناسب حجم إطار Ole المحدد
تغيير حجم إطار Ole ليتناسب مع حجم الصفوف/الأعمدة المختارة في ورقة العمل
في هذا النهج، سنتعلم كيفية تعيين حجم إطار Ole لدفتر العمل Excel المدمج بما يتناسب مع الحجم التراكمي لعدد الصفوف والأعمدة المشاركة في ورقة العمل Excel.
مثال
افترض أننا قمنا بتعريف ورقة Excel نموذجية ونرغب في إضافتها إلى العرض كإطار Ole. في هذا السيناريو، سيتم حساب حجم إطار كائن OLE أولاً بناءً على ارتفاع الصفوف التراكمي وعرض الأعمدة لصفوف وأعمدة دفتر العمل المشاركة. ثم سنقوم بتعيين حجم إطار Ole إلى تلك القيمة المحسوبة. لتجنب الرسالة الحمراء الكائن المضمن لإطار Ole في PowerPoint، سنقوم أيضًا بالحصول على صورة للأجزاء المرغوبة من الصفوف والأعمدة في دفتر العمل وتعيينها كصورة إطار Ole.
try { | |
WorkbookDesigner workbookDesigner = new WorkbookDesigner(); | |
Workbook workbook = new Workbook("AsposeTest.xls"); | |
workbookDesigner.setWorkbook(workbook); | |
Presentation presentation = new Presentation("AsposeTest.ppt"); | |
ISlide slide = presentation.getSlides().get_Item(0); | |
//Setting Ole frame according to Row, Columns | |
AddOLEFrame(slide, 0, 15, 0, 3, 0, 300, 1100, 0, 0, presentation, workbookDesigner, true, 0, 0); | |
presentation.save("AsposeTest_Ole.pptx", SaveFormat.Pptx); | |
} catch (Exception e) { | |
} |
private static void AddOLEFrame(ISlide slide, int startRow, int endRow, int startCol, int endCol, | |
int dataSheetIdx, int x, int y, double OleWidth, double OleHeight, | |
Presentation presentation, WorkbookDesigner workbookDesigner, | |
boolean onePagePerSheet, int outputWidth, int outputHeight) throws Exception//String sheetName, | |
{ | |
String path="D:\\"; | |
String tempFileName = path +"tempImage"; | |
if (startRow == 0) | |
{ | |
startRow++; | |
endRow++; | |
} | |
//Setting active sheet index of workbook | |
workbookDesigner.getWorkbook().getWorksheets().setActiveSheetIndex (dataSheetIdx); | |
SetWorkBookArea(startRow, endRow, startCol, endCol, dataSheetIdx, workbookDesigner); | |
//Getting Workbook and selected worksheet | |
Workbook workbook = workbookDesigner.getWorkbook(); | |
Worksheet work=workbook.getWorksheets().get(dataSheetIdx); | |
Dimension SlideOleSize=SetOleAccordingToSelectedRowsCloumns(workbook, startRow, endRow, startCol, endCol, dataSheetIdx); | |
OleWidth = SlideOleSize.getWidth(); | |
OleHeight = SlideOleSize.getHeight(); | |
//Set Ole Size in Workbook | |
workbook.getWorksheets().setOleSize(startRow, endRow, startCol, endCol); | |
work.setGridlinesVisible( false); | |
//Setting Image Options to take the worksheet Image | |
ImageOrPrintOptions imageOrPrintOptions = new ImageOrPrintOptions(); | |
imageOrPrintOptions.setImageFormat(com.aspose.cells.ImageFormat.getBmp()); | |
imageOrPrintOptions.setOnePagePerSheet( onePagePerSheet); | |
SheetRender render = new SheetRender(work, imageOrPrintOptions); | |
String ext = ".bmp"; | |
render.toImage(0, tempFileName + ext); | |
BufferedImage tempImage = ImageIO.read(new File(tempFileName + ext)); | |
BufferedImage image = ScaleImage(tempImage, outputWidth, outputHeight); | |
String newTempFileName = "NewTemp"; | |
ImageIO.write(image,"bmp", new File(newTempFileName+ext)); | |
//Adding Image to slide picture collection | |
//Creating a stream to hold the image file | |
InputStream iStream = new BufferedInputStream(new FileInputStream(newTempFileName+ext)); | |
IPPImage imgx = null; | |
imgx = presentation.getImages().addImage(iStream); | |
//Saving worbook to stream and copying in byte array | |
ByteArrayOutputStream mstream = new ByteArrayOutputStream (); | |
workbook.save(mstream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003); | |
//Adding Ole Object frame | |
IOleObjectFrame oleObjectFrame = slide.getShapes().addOleObjectFrame(x, y, (int)OleWidth,(int)OleHeight, "Excel.Sheet.8", mstream.toByteArray()); | |
//Setting ole frame Imnae and Alternative Text property | |
oleObjectFrame.getSubstitutePictureFormat().getPicture().setImage(imgx); | |
oleObjectFrame.setAlternativeText( "image." + imgx.getContentType()); | |
} |
private static java.awt.Dimension SetOleAccordingToSelectedRowsCloumns(Workbook workbook, int startRow, int endRow, int startCol, | |
int endCol, int dataSheetIdx) | |
{ | |
Worksheet work = workbook.getWorksheets().get(dataSheetIdx); | |
double actualHeight = 0, actualWidth = 0; | |
for (int i = startRow; i <= endRow; i++) | |
actualHeight += work.getCells().getRowHeightInch(i); | |
for (int i = startCol; i <= endCol; i++) | |
actualWidth += work.getCells().getColumnWidthInch(i); | |
//Setting new Row and Column Height | |
double width=0, height=0; | |
width=actualWidth * 576; | |
height=actualHeight * 576; | |
return new java.awt.Dimension((int)(width), (int)(height)); | |
} |
private static BufferedImage ScaleImage(BufferedImage image, int outputWidth, int outputHeight) | |
{ | |
if (outputWidth == 0 && outputHeight == 0) | |
{ | |
outputWidth = image.getWidth(); | |
outputHeight = image.getHeight(); | |
} | |
//BufferedImage outputImage=new BufferedImage(); | |
BufferedImage resized = new BufferedImage(outputWidth, outputHeight, image.getType()); | |
Graphics2D g = resized.createGraphics(); | |
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); | |
g.drawImage(image, 0, 0, outputWidth, outputHeight, 0, 0,image.getWidth(), image.getHeight(), null); | |
g.dispose(); | |
return resized; | |
} |
private static void SetWorkBookArea(int startRow, int endRow, int startCol, int endCol, | |
int dataSheetIdx, WorkbookDesigner workbookDesigner) | |
{ | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setPrintArea( PrintArea(startRow, endRow, startCol, endCol)); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setBottomMargin(0); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setFooterMargin(0); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setTopMargin (0); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setLeftMargin ( 0); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setRightMargin ( 0); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setZoom (100); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setPrintGridlines(false); | |
workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx).getPageSetup().setPrintQuality( 600); | |
} |
private static String PrintArea(int startRow, int endRow, int startCol, int endCol) | |
{ | |
return ExcelColumnLetter(startCol) + startRow + ":" + ExcelColumnLetter(endCol) + endRow; | |
} |
private static String ExcelColumnLetter(int intCol) | |
{ | |
int intFirstLetter = ((intCol) / 26) + 64; | |
int intSecondLetter = (intCol % 26) + 65; | |
char letter1 = (intFirstLetter > 64) ? (char)intFirstLetter : ' '; | |
String tem=Character.toString(letter1) + Character.toString((char)intSecondLetter); | |
return tem.trim(); | |
} |
تغيير ارتفاع الصفوف وعرض الأعمدة في ورقة العمل وفقًا لحجم إطار Ole
في هذا النهج، سنتعلم كيفية تغيير ارتفاعات الصفوف المشاركة وعرض العمود المشاركة وفقًا لحجم إطار Ole المحدد
مثال
افترض أننا قمنا بتعريف ورقة Excel نموذجية ونرغب في إضافتها إلى العرض كإطار Ole. في هذا السيناريو، سنقوم بتعيين حجم إطار Ole وتغيير حجم الصفوف والأعمدة المشاركة في منطقة إطار Ole. ثم سنقوم بحفظ دفتر العمل في دفق لحفظ التغييرات وتحويله إلى مصفوفة بايت لإضافته في إطار Ole. لتجنب الرسالة الحمراء الكائن المضمن لإطار Ole في PowerPoint، سنقوم أيضًا بالحصول على صورة للأجزاء المرغوبة من الصفوف والأعمدة في دفتر العمل وتعيينها كصورة إطار Ole.
try { | |
WorkbookDesigner workbookDesigner = new WorkbookDesigner(); | |
Workbook workbook = new Workbook("AsposeTest.xls"); | |
workbookDesigner.setWorkbook(workbook); | |
Presentation presentation = new Presentation("AsposeTest.ppt"); | |
ISlide slide = presentation.getSlides().get_Item(0); | |
//Setting Ole frame according to Row, Columns | |
AddOLEFrame(slide, 0, 15, 0, 3, 0, 300, 1100, 0, 0, presentation, workbookDesigner, true, 0, 0); | |
presentation.save("AsposeTest_Ole.pptx", SaveFormat.Pptx); | |
} catch (Exception e) { | |
} | |
private static void SetOleAccordingToCustomHeighWidth(Workbook workbook, int startRow, | |
int endRow, int startCol, int endCol, double slideWidth, double slideHeight, int dataSheetIdx) | |
{ | |
Worksheet work = workbook.getWorksheets().get(dataSheetIdx); | |
double actualHeight = 0, actualWidth = 0; | |
double newHeight = slideHeight; | |
double newWidth = slideWidth; | |
double tem = 0; | |
double newTem = 0; | |
for (int i = startRow; i <= endRow; i++) | |
actualHeight += work.getCells().getRowHeightInch(i); | |
for (int i = startCol; i <= endCol; i++) | |
actualWidth += work.getCells().getColumnWidthInch(i); | |
///Setting new Row and Column Height | |
for (int i = startRow; i <= endRow; i++) | |
{ | |
tem = work.getCells().getRowHeightInch(i); | |
newTem = (tem / actualHeight) * newHeight; | |
work.getCells().setRowHeightInch(i, newTem); | |
} | |
for (int i = startCol; i <= endCol; i++) | |
{ | |
tem = work.getCells().getColumnWidthInch(i); | |
newTem = (tem / actualWidth) * newWidth; | |
work.getCells().setColumnWidthInch(i, newTem); | |
} | |
} |
private static void AddOLEFrame(ISlide slide, int startRow, int endRow, int startCol, int endCol, | |
int dataSheetIdx, int x, int y, int OleWidth, int OleHeight, | |
Presentation presentation, WorkbookDesigner workbookDesigner, | |
Boolean onePagePerSheet, int outputWidth, int outputHeight) | |
{ | |
try { | |
String path = "D:\\"; | |
String tempFileName = path +"tempImage"; | |
if (startRow == 0) | |
{ | |
startRow++; | |
endRow++; | |
} | |
//Setting active sheet index of workbook | |
workbookDesigner.getWorkbook().getWorksheets().setActiveSheetIndex(dataSheetIdx); | |
//Getting Workbook and selected worksheet | |
Workbook workbook = workbookDesigner.getWorkbook(); | |
Worksheet work=workbook.getWorksheets().get(dataSheetIdx); | |
//Scaling rows height and coluumns width according to custom Ole size | |
double height = OleHeight / 576f; | |
double width = OleWidth / 576f; | |
SetOleAccordingToCustomHeighWidth(workbook, startRow, endRow, startCol, endCol, width, height, dataSheetIdx); | |
//Set Ole Size in Workbook | |
workbook.getWorksheets().setOleSize(startRow, endRow, startCol, endCol); | |
workbook.getWorksheets().get(0).setGridlinesVisible(false); | |
//Setting Image Options to take the worksheet Image | |
ImageOrPrintOptions imageOrPrintOptions = new ImageOrPrintOptions(); | |
imageOrPrintOptions.setImageFormat(ImageFormat.getBmp()); | |
imageOrPrintOptions.setOnePagePerSheet(onePagePerSheet); | |
SheetRender render = new SheetRender(workbookDesigner.getWorkbook().getWorksheets().get(dataSheetIdx), imageOrPrintOptions); | |
String ext = ".bmp"; | |
render.toImage(0, tempFileName + ext); | |
BufferedImage tempImage = ImageIO.read(new File(tempFileName + ext)); | |
BufferedImage image = ScaleImage(tempImage, outputWidth, outputHeight); | |
String newTempFileName = "NewTemp"; | |
ImageIO.write(image,"bmp", new File(newTempFileName+ext)); | |
//Adding Image to slide picture collection | |
//Creating a stream to hold the image file | |
InputStream iStream = new BufferedInputStream(new FileInputStream(newTempFileName+ext)); | |
IPPImage imgx = null; | |
imgx = presentation.getImages().addImage(iStream); | |
//Saving worbook to stream and copying in byte array | |
ByteArrayOutputStream mstream = new ByteArrayOutputStream (); | |
workbook.save(mstream,com.aspose.cells.SaveFormat.EXCEL_97_TO_2003); | |
//Adding Ole Object frame | |
OleObjectFrame oleObjectFrame = (OleObjectFrame) slide.getShapes().addOleObjectFrame(x, y, (int)OleWidth,(int)OleHeight, "Excel.Sheet.8", mstream.toByteArray()); | |
//Setting ole frame Imnae and Alternative Text property | |
oleObjectFrame.getSubstitutePictureFormat().getPicture().setImage(imgx); | |
oleObjectFrame.setAlternativeText( "image." + imgx.getContentType()); | |
} catch (Exception e) { | |
} | |
} |
private static BufferedImage ScaleImage(BufferedImage image, int outputWidth, int outputHeight) | |
{ | |
if (outputWidth == 0 && outputHeight == 0) | |
{ | |
outputWidth = image.getWidth(); | |
outputHeight = image.getHeight(); | |
} | |
//BufferedImage outputImage=new BufferedImage(); | |
BufferedImage resized = new BufferedImage(outputWidth, outputHeight, image.getType()); | |
Graphics2D g = resized.createGraphics(); | |
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); | |
g.drawImage(image, 0, 0, outputWidth, outputHeight, 0, 0,image.getWidth(), image.getHeight(), null); | |
g.dispose(); | |
return resized; | |
} | |