Arbeitslösung zur Größenänderung von Arbeitsblättern

Hintergrund

Im Artikel Hinzufügen von Ole-Rahmen, haben wir erläutert, wie man einen Ole-Rahmen in einer PowerPoint-Präsentation unter Verwendung von Aspose.Slides für PHP über Java hinzufügt. Um das Objektänderungsproblem zu berücksichtigen, haben wir das Arbeitsblattbild des ausgewählten Bereichs dem Chart OLE-Objektrahmen zugewiesen. In der Ausgabepräsentation wird das Excel-Diagramm aktiviert, wenn wir auf den OLE-Objektrahmen doppelklicken, der das Arbeitsblattbild anzeigt. Die Endbenutzer können alle gewünschten Änderungen in der tatsächlichen Excel-Arbeitsmappe vornehmen und dann zur betreffenden Folie zurückkehren, indem sie außerhalb der aktivierten Excel-Arbeitsmappe klicken. Die Größe des OLE-Objektrahmens ändert sich, wenn der Benutzer zur Folie zurückkehrt. Der Skalierungsfaktor wird für unterschiedliche Größen des OLE-Objektrahmens und der eingebetteten Excel-Arbeitsmappe unterschiedlich sein.

Ursache der Größenänderung

Da die Excel-Arbeitsmappe ihre eigene Fenstergröße hat, versucht sie, ihre ursprüngliche Größe beim ersten Aktivieren beizubehalten. Andererseits hat der OLE-Objektrahmen seine eigene Größe. Laut Microsoft verhandeln Excel und PowerPoint beim Aktivieren der Excel-Arbeitsmappe über die Größe und stellen sicher, dass sie in den richtigen Proportionen als Teil des Einbettungsvorgangs ist. Basierend auf den Unterschieden in der Fenstergröße von Excel und der Größe / Position des OLE-Objektrahmens findet die Größenänderung statt.

Arbeitslösung

Es gibt zwei mögliche Lösungen, um den Größenänderungseffekt zu vermeiden.* Passen Sie die Größe des Ole-Rahmens in PPT an die Höhe/Breite der gewünschten Anzahl von Zeilen/Spalten im Ole-Rahmen an.* Behalten Sie die Größe des Ole-Rahmens konstant und skalieren Sie die Größe der beteiligten Zeilen/Spalten, um in die ausgewählte Ole-Rahmengröße zu passen.

Größe des Ole-Rahmens an die ausgewählten Zeilen/Spalten des Arbeitsblatts anpassen

In diesem Ansatz lernen wir, wie wir die Größe des Ole-Rahmens der eingebetteten Excel-Arbeitsmappe entsprechend der kumulierten Größe der Anzahl der beteiligten Zeilen und Spalten im Excel-Arbeitsblatt festlegen.

Beispiel

Angenommen, wir haben ein Vorlage-Excel-Blatt definiert und möchten dieses als Ole-Rahmen in die Präsentation einfügen. In diesem Szenario wird die Größe des OLE-Objektrahmens zunächst basierend auf der kumulierten Höhe der Zeilen und der Breite der Spalten der beteiligten Arbeitsmappenzeilen und -spalten berechnet. Danach setzen wir die Größe des Ole-Rahmens auf diesen berechneten Wert. Um die rote Eingebettetes Objekt-Nachricht für den Ole-Rahmen in PowerPoint zu vermeiden, erhalten wir außerdem das Bild der gewünschten Teile von Zeilen und Spalten in der Arbeitsmappe und setzen dies als Ole-Rahmenbild ein.

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();
}

Höhen der Arbeitsblattzeilen und Breite der Spalten gemäß der Ole-Rahmengröße anpassen

In diesem Ansatz lernen wir, wie wir die Höhen der beteiligten Zeilen und die Breite der beteiligten Spalte entsprechend der benutzerdefiniert festgelegten Ole-Rahmengröße skalieren.

Beispiel

Angenommen, wir haben ein Vorlage-Excel-Blatt definiert und möchten dieses als Ole-Rahmen in die Präsentation einfügen. In diesem Szenario setzen wir die Größe des Ole-Rahmens und skalieren die Größe der Zeilen und Spalten, die im Ole-Rahmenbereich beteiligt sind. Danach speichern wir die Arbeitsmappe im Stream, um Änderungen zu speichern, und konvertieren sie in ein Byte-Array, um sie im Ole-Rahmen hinzuzufügen. Um die rote Eingebettetes Objekt-Nachricht für den Ole-Rahmen in PowerPoint zu vermeiden, erhalten wir außerdem das Bild der gewünschten Teile von Zeilen und Spalten in der Arbeitsmappe und setzen dies als Ole-Rahmenbild ein.

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;
}

Fazit