25. Excel 데이터를 이용한 자동화

Excel로 데이터가 제공되는 경우 UpdateChart와(과) PresentationFromTemplate 기능을 사용하여 해당 데이터를 프로그래밍 방식으로 제어할 수 있습니다.

UpdateChart을(를) 사용하여 특정 엘리먼트의 데이터시트를 Excel 데이터와 교환할 수 있습니다. PresentationFromTemplate을(를) 사용하면 데이터를 사용하여 Excel 데이터 링크에서 설명한 대로 Excel의 데이터 범위에 연결된 think-cell 엘리먼트가 있는 PowerPoint 템플릿을 기반으로 새 프레젠테이션을 만들 수 있습니다.

두 기능에 대한 인터페이스는 Office 자동화 모델에 통합되어 있으므로 VBA(Visual Basic for Applications) 또는 C#과 같이 Office를 프로그래밍할 수 있는 모든 언어에서 액세스할 수 있습니다. 상세 지침은 시작하기을(를) 참조하십시오.

think-cell의 진입점은 think-cell 추가 기능 개체입니다. Application.COMAddIns 컬렉션을 통해 액세스할 수 있습니다. think-cell에 대한 호출은 항상 늦어집니다. 자세한 설명은 Microsoft의 기술 문서

자동화에서 조기 바인딩과 늦은 바인딩 사용

따라서, think-cell 추가 기능 개체의 유형은 Object로 단순하며, 추가할 유형 라이브러리 또는 참조는 없습니다. 개체를 획득하면 호출 준비가 완료됩니다. 예를 들면 Excel의 VBA에서:

Dim tcXlAddIn As Object 
Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object

C#에서, think-cell 추가 기능 개체에 대한 참조를 dynamic(으)로 선언하면 늦게 바인딩할 수 있습니다. 이 유형은 참조를 var(으)로 선언할 때 컴파일러가 추론한 것이기도 하기 때문에 다음과 같이 간단하게 작성할 수 있습니다:

var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;

여기서 xlapp은(는) think-cell이 로드되는 Excel.Application 개체에 대한 참조입니다.

25.1
차트 업데이트
25.2
템플릿에서 프레젠테이션

25.1 차트 업데이트

25.1.1 서명

VBA
tcXlAddIn.UpdateChart( _ 
    target As Object, _ 
    strName As String, _ 
    rgData As Excel.Range, _ 
    bTransposed As Boolean _ 
)
C#
void tcXlAddIn.UpdateChart(
    object target,
    string strName,
    Excel.Range rgData,
    bool bTransposed
);

25.1.2 설명

이 함수는 target의 모든 엘리먼트를 rgData에 포함된 데이터를 사용하여 이름 strName(으)로 업데이트합니다. 차트에서 데이터를 올바르게 해석하려면 범위 rgData은(는) 기본 데이터시트 레이아웃 또는 데이터 행/열을 바꾸기한 버전을 준수해야 합니다(Excel에서 차트 만들기데이터 레이아웃 맞추기 참조). 기본 버전 또는 데이터 행/열을 바꾸기한 버전이 사용될 것인지 여부는 각각 bTransposed을(를) false 또는 true(으)로 설정하여 표시합니다. 차트 이외의 엘리먼트, 예를 들어, 테이블에서 bTransposed 값은 무시됩니다.

target은(는) Presentation 또는 SlideRange, 단일 Slide, Master 또는 CustomLayout이어야 합니다.

이름 strName은(는) 대소문자를 구분하여 일치해야 합니다. 자동화 소개에 설명된 대로 차트 이름 업데이트 속성 컨트롤을 사용하여 이전에 PowerPoint에서 할당되어 있어야 합니다.

올바른 엘리먼트가 타겟팅되도록 하려면 pres(으)로 전달된 개체에서 UpdateChart 이름strName(으)로 설정된 유일한 엘리먼트여야 합니다.

이 함수를 호출할 때 타겟팅된 엘리먼트가 Excel 데이터 범위에 연결된 경우 연결이 해제됩니다. 이후 엘리먼트는 어떤 Excel 범위와도 연결되지 않습니다.

25.1.3 예시

이러한 샘플을 사용하려면 자동화 소개에서 설명한 대로 프레젠테이션을 준비하고 이를 C:\Samples\UpdateChart\template.pptx(으)로 저장하십시오.

VBA

이 샘플을 사용하려면 Excel 통합 문서의 모듈에 추가하십시오.

Microsoft PowerPoint 16.0 개체 라이브러리에 대한 참조가 필요합니다(자세한 내용은 Visual Basic for Applications 참조).

통합 문서에서 UpdateChart_Sample을(를) 실행하면 첫 번째 시트의 범위 A1:D5에 포함된 데이터를 사용하여 프레젠테이션 템플릿의 차트가 업데이트됩니다.

Option Explicit 
 
Sub UpdateChart_Sample() 

    ' Get the range containing the new data 
    Dim rng As Excel.Range 
    Set rng = ActiveWorkbook.Sheets(1).Range("A1:D5") 

    ' Get the think-cell add-in object 
    Dim tcXlAddIn As Object 
    Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object 

    ' Get a PowerPoint instance. Hold on to this 
    ' object as long as you want to access the 
    ' generated presentations. There can only be a 
    ' single PowerPoint instance. If there is no 
    ' PowerPoint running, one will be started. 
    ' Otherwise the existing one is used.

    Dim ppapp As Object 
    Set ppapp = New PowerPoint.Application 

    Dim pres As PowerPoint.Presentation 

    ' PowerPoint window visible 
    ' Set pres = ppapp.Presentations.Open( _ 
    '  Filename:="C:\\Samples\\UpdateChart\\template.pptx", _
    '  Untitled:=msoTrue) 

    ' PowerPoint window invisible 

    Set pres = ppapp.Presentations.Open( _
    Filename:="C:\\Samples\\UpdateChart\\template.pptx", _
    Untitled:=msoTrue, _
    WithWindow:=msoFalse)

    Call tcXlAddIn.UpdateChart(pres, "Chart1", rng, False) 

    ' Save the updated presentation 
    pres.SaveAs ("C:\\Samples\\UpdateChart\\template_updated.pptx") 
    pres.Close 

    ppapp.Quit 
End Sub

C#

이 샘플을 사용하려면 C# 콘솔 앱 프로젝트 템플릿의 Program.cs에 있는 코드를 샘플로 바꾸십시오.

Microsoft PowerPoint 16.0 개체 라이브러리, Microsoft Excel 16.0 개체 라이브러리Microsoft Office 16.0 개체 라이브러리에 대한 참조가 필요합니다(자세한 내용은 C# 참조).

결과 응용 프로그램을 실행하면 프레젠테이션 템플릿의 차트가 1, 2, 3 값을 가진 "시리즈 1"이라고 이름이 지정된 단일 시리즈를 포함하도록 업데이트되고 결과가 template_updated.pptx(으)로 저장됩니다.

using Excel = Microsoft.Office.Interop.Excel;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core;

namespace ConsoleApplication_UpdateChart
{
    class Program
    {
        static void Main()
        {
            Excel.Application xlapp = new Excel.Application { Visible = true };

            Excel.Workbook workbook = xlapp.Workbooks.Add(1);
            Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Sheets[1];
            worksheet.Cells[3, 1] = "Series 1";
            worksheet.Cells[3, 2] = 1;
            worksheet.Cells[3, 3] = 2;
            worksheet.Cells[3, 4] = 3;

            PowerPoint.Application ppapp = new PowerPoint.Application();
            PowerPoint.Presentation presentation = ppapp.Presentations.Open(
                    "C:\\Samples\\UpdateChart\\template.pptx",
                    Office.MsoTriState.msoFalse,
                    Office.MsoTriState.msoTrue
            );

            var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
            tcXlAddIn.UpdateChart(
                presentation,
                "Chart1",
                worksheet.get_Range("A1", "D3"),
                false
            );

            presentation.SaveAs("C:\\Samples\\UpdateChart\\template_updated.pptx");
            presentation.Close();
            ppapp.Quit();

            workbook.Close(false);
            xlapp.Quit();
        }
    }
}

25.2 템플릿에서 프레젠테이션

25.2.1 서명

VBA
tcXlAddIn.PresentationFromTemplate( _ 
    wb As Excel.Workbook, _ 
    strTemplate As String, _ 
    ppapp As PowerPoint.Application _ 
) As PowerPoint.Presentation
C#
PowerPoint.Presentation tcXlAddIn.PresentationFromTemplate(
    Excel.Workbook wb,
    string strTemplate,
    PowerPoint.Application ppapp
);

25.2.2 설명

이 함수는 Excel 통합 문서 wb와(과) 파일 이름이 strTemplate인 템플릿 사이의 데이터 연결을 사용하여 연결된 엘리먼트를 연결된 범위의 데이터로 업데이트하여 해당 템플릿을 인스턴스화합니다. 그 결과 PowerPoint 인스턴스 ppapp 내에 새 프레젠테이션이 표시됩니다.

strTemplate은 전체 경로 또는 상대 경로가 될 수 있으며, Excel 통합 문서 파일 의 위치에 상대적인 경로가 됩니다.wb

Excel 통합 문서 wb에 연결된 strTemplate의 모든 엘리먼트가 업데이트됩니다(자동 업데이트 설정 여부와 무관). 결과 프레젠테이션에서, 이러한 엘리먼트에 대한 추가 변경을 방지하기 위해 데이터 링크가 끊어집니다.

wb 이외의 Excel 통합 문서에 연결된 strTemplate의 엘리먼트는 변경되지 않고 계속 연결되어 있으므로 이 기능의 결과를 새 템플릿으로 저장한 후 다음 통합 문서로 이 기능을 다시 호출하여 여러 Excel 통합 문서의 링크를 업데이트할 수 있습니다.

Excel 링크를 사용하여 차트 세그먼트의 색상이나 테이블 셀의 형식을 조정하려는 경우 색 구성표를 상단에 데이터 시트 채우기 사용(색 구성표 참조) 또는 데이터시트... 사용 옵션(표 서식 지정 참조)으로 각각 설정하면 됩니다. 마찬가지로 Excel 링크로 숫자 형식을 제어하려면 Excel 형식 사용으로 설정합니다(숫자 형식 참조).

PresentationFromTemplate을(를) 호출하기 전에 Excel에서 각 셀의 해당 형식 옵션과 숫자 형식을 설정해야 합니다.

25.2.3 예시

이러한 샘플을 사용하려면 먼저 Excel에서 차트 만들기에서 설명한 대로 Excel 통합 문서 첫 번째 시트의 범위 G1:K4에 연결된 누적 차트가 포함된 프리젠테이션을 만드십시오. 결과 프레젠테이션을 C:\Samples\PresentationFromTemplate\template.pptx(으)로, 통합 문서를 data.xlsx(으)로 같은 디렉토리에 저장합니다.

VBA

이 샘플을 사용하려면 위에서 설명한 대로 작성된 Excel 통합 문서 data.xlsx의 모듈에 샘플을 추가합니다.

Microsoft PowerPoint 16.0 개체 라이브러리에 대한 참조가 필요합니다(자세한 내용은 Visual Basic for Applications 참조).

PresentationFromTemplate_Sample을(를) 실행하면 template.pptx에 포함된 차트 첫 번째 시리즈의 첫 번째 값에 연결된 셀 Sheet1!H3의 값을 i=1에서 10(으)로 변경하고, 해당 값을 포함하도록 업데이트된 템플릿의 차트를 사용하여 새 프리젠테이션을 만들고, 이제 통합 문서에 연결되지 않고 템플릿과 동일한 디렉토리에서 이를 output_i.pptx(으)로 저장합니다.

Option Explicit

Sub PresentationFromTemplate_Sample()
    ' Get the range to modify. It is more efficient
    ' to do this once rather than within the loop.
    Dim rng As Excel.Range
    Set rng = ActiveWorkbook.Sheets(1).Cells(3, 8)

    ' Get the think-cell add-in object
    Dim tcXlAddIn As Object
    Set tcXlAddIn = Application.COMAddIns("thinkcell.addin").Object

    ' Get a PowerPoint instance. Hold on to this
    ' object as long as you want to access the
    ' generated presentations. There can only be a
    ' single PowerPoint instance. If there is no
    ' PowerPoint running, one will be started.
    ' Otherwise the existing one is used.
    Dim ppapp As Object
    Set ppapp = New PowerPoint.Application

    Dim i As Integer
    For i = 1 To 10
        ' Modify the range value.
        ' Note: Avoid selecting the cell prior to
        ' changing it. It is very slow and has
        ' undesirable side-effects.
        ' BAD:
        ' rng.Select
        ' ActiveWindow.Selection.Value = 0
        ' GOOD:
        rng.Value = i

        ' Generate a new presentation based on the
        ' linked template.
        Dim pres As PowerPoint.Presentation
        Set pres = tcXlAddIn.PresentationFromTemplate( _
            Excel.ActiveWorkbook, "template.pptx", ppapp _
        )

        ' If you want to modify the new presentation
        ' before saving it this is the place to do it.
        
        ' Save the new presentation
        pres.SaveAs "C:\Samples\PresentationFromTemplate\output_" & i & ".pptx"
        
        ' Explicitly close the presentation when we
        ' are done with it to free its memory.
        ' Letting the object go out of scope is not
        ' sufficient.
        pres.Close
    Next
End Sub

C#

이 샘플을 사용하려면 C# 콘솔 앱 프로젝트 템플릿의 Program.cs에 있는 코드를 샘플로 바꾸십시오.

Microsoft PowerPoint 16.0 개체 라이브러리, Microsoft Excel 16.0 개체 라이브러리Microsoft Office 16.0 개체 라이브러리에 대한 참조가 필요합니다(자세한 내용은 C# 참조).

결과 응용 프로그램을 실행하면 Excel이 열리고 통합 문서 data.xlsx이(가) 로드되며 template.pptx에 포함된 차트 첫 번째 시리즈의 첫 번째 값에 연결된 셀 H3의 값을 i=1에서 10(으)로 변경하고, 해당 값을 포함하도록 업데이트된 템플릿의 차트를 사용하여 새 프리젠테이션을 만들고, 이제 통합 문서에 연결되지 않고 템플릿과 동일한 디렉토리에서 이를 output_i.pptx(으)로 저장합니다.

using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApplication_PresentationFromTemplate
{
    class Program
    {
        static void Main()
        {
            var xlapp = new Excel.Application { Visible = true };
            var tcXlAddIn = xlapp.COMAddIns.Item("thinkcell.addin").Object;
            var workbook = xlapp.Workbooks.Open("C:\\Samples\\PresentationFromTemplate\\data.xlsx");
            var ppapp = new PowerPoint.Application();
            for (var i = 1; i <= 10; ++i)
            {
                workbook.Sheets[1].Cells[3, 8] = i;

                PowerPoint.Presentation presentation = tcXlAddIn.PresentationFromTemplate(
                    workbook,
                    "C:\\Samples\\PresentationFromTemplate\\template.pptx",
                    ppapp
                );

                presentation.SaveAs("C:\\Samples\\PresentationFromTemplate\\output" + i + ".pptx");
                presentation.Close();
            }
            ppapp.Quit();
            workbook.Close(false);
            xlapp.Quit();
        }
    }
}

공유