워크시트 크기 조정에 대한 작업 솔루션

배경

이 문서 OLE 관리에서는 Aspose.Slides for PHP via Java를 사용하여 PowerPoint 프레젠테이션에 OLE 프레임을 추가하는 방법을 설명했습니다. 개체 미리 보기 문제를 해결하기 위해 선택한 워크시트 영역의 이미지를 OLE 개체 프레임에 할당했습니다. 출력 프레젠테이션에서 워크시트 이미지를 표시하는 OLE 개체 프레임을 두 번 클릭하면 Excel 통합 문서가 활성화됩니다. 최종 사용자는 실제 Excel 통합 문서를 원하는 대로 수정한 후 활성화된 Excel 통합 문서 바깥을 클릭하여 슬라이드로 돌아갈 수 있습니다. 사용자가 슬라이드로 돌아가면 OLE 개체 프레임의 크기가 변경됩니다. 크기 조정 비율은 OLE 개체 프레임의 크기와 삽입된 Excel 통합 문서의 크기에 따라 달라집니다.

크기 조정 원인

Excel 통합 문서는 자체 창 크기를 가지고 있기 때문에 첫 번째 활성화 시 원래 크기를 유지하려고 합니다. 반면 OLE 개체 프레임은 자체 크기를 가집니다. Microsoft에 따르면 Excel 통합 문서가 활성화될 때 Excel과 PowerPoint가 크기를 협상하여 삽입 과정에서 올바른 비율을 유지합니다. 크기 조정은 Excel 창 크기와 OLE 개체 프레임의 크기 및 위치 차이에 따라 발생합니다.

작동 솔루션

크기 조정 효과를 방지하기 위한 두 가지 가능한 솔루션이 있습니다.

  • PowerPoint 프레젠테이션에서 OLE 프레임을 선택한 행과 열의 전체 높이와 너비에 맞게 스케일링합니다.
  • OLE 프레임 크기를 일정하게 유지하고 선택한 행과 열을 해당 프레임에 맞게 스케일링합니다.

OLE 프레임 크기 스케일링

이 접근 방식은 삽입된 Excel 워크시트에서 선택한 행과 열의 전체 높이와 너비에 맞게 OLE 프레임 크기를 설정합니다.

예제는 기존 Excel 통합 문서를 로드하고, 0 기반 인덱스를 사용하여 첫 번째 워크시트의 처음 10개 행과 13개 열을 선택합니다. WorksheetCollection::setOleSize는 표시 범위를 정의합니다. 미리 보기는 96 DPI로 렌더링되며, 픽셀 치수는 인치당 72 포인트를 사용하여 포인트로 변환됩니다. ShapeCollection::addOleObjectFrame은 수정된 통합 문서를 해당 치수의 프레임에 삽입합니다. 미리 보기 이미지는 OleObjectFrame::getSubstitutePictureFormat을 통해 할당되어 저장된 프레젠테이션의 “EMBEDDED OLE OBJECT” 자리 표시자를 교체합니다.

use aspose\cells\SaveFormat as CellsSaveFormat;
use aspose\cells\Workbook;
use aspose\slides\Images;
use aspose\slides\OleEmbeddedDataInfo;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use Java as JavaObject;

$workbook = new Workbook("sample.xlsx");
try {
    $worksheet = $workbook->getWorksheets()->get(0);
    $startRow = 0;
    $rowCount = 10;
    $startColumn = 0;
    $columnCount = 13;
    $lastRow = $startRow + $rowCount - 1;
    $lastColumn = $startColumn + $columnCount - 1;
    $workbook->getWorksheets()->setOleSize($startRow, $lastRow, $startColumn, $lastColumn);
    $cellRange = $worksheet->getCells()->createRange($startRow, $startColumn, $rowCount, $columnCount);

    $imageResolution = 96;
    $imageStream = CreateOleImage($cellRange, $imageResolution);

    // 수정된 워크북을 삽입하고 Java 바이트 배열에 이진 데이터를 유지합니다.
    $workbookStream = new JavaObject("java.io.ByteArrayOutputStream");
    $workbook->save($workbookStream, CellsSaveFormat::XLSX);
    $workbookBytes = $workbookStream->toByteArray();
    $image = Images::fromStream($imageStream);
    try {
        $frameWidth = java_values($image->getWidth()) * 72.0 / $imageResolution;
        $frameHeight = java_values($image->getHeight()) * 72.0 / $imageResolution;
        $presentation = new Presentation();
        try {
            $slide = $presentation->getSlides()->get_Item(0);
            $dataInfo = new OleEmbeddedDataInfo($workbookBytes, "xlsx");
            $oleFrame = $slide->getShapes()->addOleObjectFrame(10, 10, $frameWidth, $frameHeight, $dataInfo);
            $previewImage = $presentation->getImages()->addImage($image);
            $oleFrame->getSubstitutePictureFormat()->getPicture()->setImage($previewImage);
            $oleFrame->setObjectIcon(false);
            $presentation->save("output.pptx", SaveFormat::Pptx);
        } finally {
            $presentation->dispose();
        }
    } finally {
        $image->dispose();
        $imageStream->close();
    }
} finally {
    $workbook->dispose();
}

미리 보기 도우미는 PageSetup::setPrintArea를 선택한 범위로 설정하고 여백, 머리글 및 바닥글을 제거합니다. ImageOrPrintOptions::setOnlyArea가 활성화된 상태에서 SheetRender::toImage는 해당 범위를 PNG 이미지로 렌더링합니다. 도우미는 PNG 이미지를 포함하는 새 입력 스트림을 반환하며, 프레젠테이션에서 사용하기 위해 스트림의 시작 위치에 배치됩니다.

use aspose\cells\ImageOrPrintOptions;
use aspose\cells\ImageType;
use aspose\cells\SheetRender;
use Java as JavaObject;

function CreateOleImage($cellRange, $imageResolution) {
    $pageSetup = $cellRange->getWorksheet()->getPageSetup();
    $pageSetup->setPrintArea($cellRange->getAddress());
    $pageSetup->setLeftMargin(0);
    $pageSetup->setRightMargin(0);
    $pageSetup->setTopMargin(0);
    $pageSetup->setBottomMargin(0);
    $pageSetup->clearHeaderFooter();

    $imageOptions = new ImageOrPrintOptions();
    $imageOptions->setImageType(ImageType::PNG);
    $imageOptions->setVerticalResolution($imageResolution);
    $imageOptions->setHorizontalResolution($imageResolution);
    $imageOptions->setOnePagePerSheet(true);
    $imageOptions->setOnlyArea(true);

    $worksheet = $cellRange->getWorksheet();
    $sheetRender = new SheetRender($worksheet, $imageOptions);
    $imageStream = new JavaObject("java.io.ByteArrayOutputStream");
    $sheetRender->toImage(0, $imageStream);
    $imageBytes = $imageStream->toByteArray();
    return new JavaObject("java.io.ByteArrayInputStream", $imageBytes);
}

셀 범위 크기 스케일링

이 접근 방식은 선택된 행의 높이와 선택된 열의 너비를 사용자 정의 OLE 프레임 크기에 맞게 스케일링합니다.

예제는 기존 Excel 통합 문서를 로드하고, 0 기반 인덱스를 사용하여 첫 번째 워크시트의 처음 10개 행과 13개 열을 선택합니다. WorksheetCollection::setOleSize는 표시 범위를 정의하며, 아래 도우미는 해당 범위를 가로 400 포인트, 세로 100 포인트인 프레임에 맞게 스케일링합니다. 수정된 통합 문서를 스트림에 저장한 후, ShapeCollection::addOleObjectFrame을 사용하여 지정된 크기로 삽입합니다. 96 DPI로 렌더링된 미리 보기 이미지는 OleObjectFrame::getSubstitutePictureFormat을 통해 할당되어 저장된 프레젠테이션에 기본 자리 표시자 대신 선택된 셀을 표시합니다.

use aspose\cells\SaveFormat as CellsSaveFormat;
use aspose\cells\Workbook;
use aspose\slides\Images;
use aspose\slides\OleEmbeddedDataInfo;
use aspose\slides\Presentation;
use aspose\slides\SaveFormat;
use Java as JavaObject;

$workbook = new Workbook("sample.xlsx");
try {
    $worksheet = $workbook->getWorksheets()->get(0);
    $startRow = 0;
    $rowCount = 10;
    $startColumn = 0;
    $columnCount = 13;
    $lastRow = $startRow + $rowCount - 1;
    $lastColumn = $startColumn + $columnCount - 1;
    $workbook->getWorksheets()->setOleSize($startRow, $lastRow, $startColumn, $lastColumn);
    $cellRange = $worksheet->getCells()->createRange($startRow, $startColumn, $rowCount, $columnCount);
    $frameWidth = 400;
    $frameHeight = 100;
    ScaleCellRange($cellRange, $frameWidth, $frameHeight);

    $imageResolution = 96;
    $imageStream = CreateOleImage($cellRange, $imageResolution);

    // 수정된 워크북을 삽입하고 Java 바이트 배열에 이진 데이터를 유지합니다.
    $workbookStream = new JavaObject("java.io.ByteArrayOutputStream");
    $workbook->save($workbookStream, CellsSaveFormat::XLSX);
    $workbookBytes = $workbookStream->toByteArray();
    $image = Images::fromStream($imageStream);
    try {
        $presentation = new Presentation();
        try {
            $slide = $presentation->getSlides()->get_Item(0);
            $dataInfo = new OleEmbeddedDataInfo($workbookBytes, "xlsx");
            $oleFrame = $slide->getShapes()->addOleObjectFrame(10, 10, $frameWidth, $frameHeight, $dataInfo);
            $previewImage = $presentation->getImages()->addImage($image);
            $oleFrame->getSubstitutePictureFormat()->getPicture()->setImage($previewImage);
            $oleFrame->setObjectIcon(false);
            $presentation->save("output.pptx", SaveFormat::Pptx);
        } finally {
            $presentation->dispose();
        }
    } finally {
        $image->dispose();
        $imageStream->close();
    }
} finally {
    $workbook->dispose();
}

스케일링 도우미는 선택된 범위에 대해 별도의 가로 및 세로 비율을 계산하여 열의 상대적인 너비와 행의 상대적인 높이를 보존합니다. 계산된 치수를 포인트에서 인치로 변환한 후 Cells::setColumnWidthInch 및 Cells::setRowHeightInch을 사용해 적용합니다. 선택된 범위는 너비와 높이가 0이 아니어야 합니다.

use aspose\cells\CellsUnitType;

// 너비와 높이는 포인트 단위로 예상되는 셀 범위의 크기입니다.
function ScaleCellRange($cellRange, $width, $height) {
    $rangeWidth = java_values($cellRange->getWidth());
    $rangeHeight = java_values($cellRange->getHeight());
    $cells = $cellRange->getWorksheet()->getCells();
    $columnCount = java_values($cellRange->getColumnCount());
    $rowCount = java_values($cellRange->getRowCount());
    $firstColumn = java_values($cellRange->getFirstColumn());
    $firstRow = java_values($cellRange->getFirstRow());

    for ($i = 0; $i < $columnCount; $i++) {
        $columnIndex = $firstColumn + $i;
        $columnWidth = java_values($cells->getColumnWidth($columnIndex, false, CellsUnitType::POINT));
        $newColumnWidth = $columnWidth * $width / $rangeWidth;
        $widthInInches = $newColumnWidth / 72.0;
        $cells->setColumnWidthInch($columnIndex, $widthInInches);
    }

    for ($i = 0; $i < $rowCount; $i++) {
        $rowIndex = $firstRow + $i;
        $rowHeight = java_values($cells->getRowHeight($rowIndex, false, CellsUnitType::POINT));
        $newRowHeight = $rowHeight * $height / $rangeHeight;
        $heightInInches = $newRowHeight / 72.0;
        $cells->setRowHeightInch($rowIndex, $heightInInches);
    }
}

이 미리 보기 도우미는 SheetRender::toImage을 사용하여 크기가 변경된 범위를 렌더링합니다. PageSetup::setPrintArea를 해당 범위로 제한하고, 여백, 머리글 및 바닥글을 제거한 뒤, 시작 위치에 배치된 PNG 스트림을 반환합니다.

use aspose\cells\ImageOrPrintOptions;
use aspose\cells\ImageType;
use aspose\cells\SheetRender;
use Java as JavaObject;

function CreateOleImage($cellRange, $imageResolution) {
    $pageSetup = $cellRange->getWorksheet()->getPageSetup();
    $pageSetup->setPrintArea($cellRange->getAddress());
    $pageSetup->setLeftMargin(0);
    $pageSetup->setRightMargin(0);
    $pageSetup->setTopMargin(0);
    $pageSetup->setBottomMargin(0);
    $pageSetup->clearHeaderFooter();

    $imageOptions = new ImageOrPrintOptions();
    $imageOptions->setImageType(ImageType::PNG);
    $imageOptions->setVerticalResolution($imageResolution);
    $imageOptions->setHorizontalResolution($imageResolution);
    $imageOptions->setOnePagePerSheet(true);
    $imageOptions->setOnlyArea(true);

    $worksheet = $cellRange->getWorksheet();
    $sheetRender = new SheetRender($worksheet, $imageOptions);
    $imageStream = new JavaObject("java.io.ByteArrayOutputStream");
    $sheetRender->toImage(0, $imageStream);
    $imageBytes = $imageStream->toByteArray();
    return new JavaObject("java.io.ByteArrayInputStream", $imageBytes);
}

결론

FAQ

왜 삽입된 Excel 워크시트가 PowerPoint에서 처음 활성화될 때 크기가 변경됩니까?

Excel이 활성화될 때 원래 창 크기를 유지하려고 하고, PowerPoint의 OLE 개체 프레임은 자체 차원을 가지고 있기 때문에 발생합니다. PowerPoint와 Excel가 크기를 협상하여 비율을 유지하려고 하며, 이 과정에서 크기 조정이 발생할 수 있습니다.

이 크기 조정 문제를 완전히 방지할 수 있습니까?

예. OLE 프레임을 Excel 셀 범위 크기에 맞게 스케일링하거나, 셀 범위를 원하는 OLE 프레임 크기에 맞게 스케일링함으로써 원치 않는 크기 조정을 방지할 수 있습니다.

어떤 스케일링 방법을 사용해야 합니까, OLE 프레임 스케일링인가 셀 범위 스케일링인가?

원래 Excel 행 및 열 크기를 유지하고 싶다면 OLE 프레임 스케일링을 선택하십시오. 고정된 OLE 프레임 크기를 원한다면 셀 범위 스케일링을 선택하십시오.

템플릿을 기반으로 한 프레젠테이션에서도 이러한 솔루션이 작동합니까?

예. 두 솔루션 모두 템플릿을 사용해 만든 프레젠테이션과 처음부터 만든 프레젠테이션 모두에 적용됩니다.

이러한 방법을 사용할 때 OLE 프레임 크기에 제한이 있습니까?

아니요. 스케일을 적절히 설정하면 OLE 개체 프레임을 원하는 크기로 만들 수 있습니다.

PowerPoint에서 “EMBEDDED OLE OBJECT” 자리 표시자 텍스트를 피하는 방법이 있습니까?

예. 대상 Excel 셀 범위의 스냅샷을 촬영하여 OLE 프레임의 자리 표시자 이미지로 설정하면 기본 자리 표시자 대신 사용자 지정 미리 보기 이미지를 표시할 수 있습니다.

관련 기사

Excel 차트를 생성하고 OLE 개체로 프레젠테이션에 삽입하기

MS PowerPoint 애드인으로 OLE 개체를 자동 업데이트하기