25. Автоматизация с использованием данных Excel

Если данные представлены в Excel, можно использовать функции UpdateChart и PresentationFromTemplate для программного управления применением этих данных.

С помощью UpdateChart можно заменить таблицу определенного элементами вашими данными Excel. С помощью PresentationFromTemplate можно использовать данные для создания новой презентации на основе шаблона PowerPoint с элементами think-cell, связанными с диапазонами данных в Excel, как описано в 21. Ссылки на данные Excel.

Интерфейс обеих функций интегрирован в модель автоматизации Office, что позволяет использовать его на любом языке, который поддерживает Office, таком как Visual Basic for Applications (VBA) и C#. См. подробные инструкции в Начало работы.

Точка входа в think-cell — это объект надстройки think-cell. Доступ к нему можно получить через коллекцию Application.COMAddIns. Вызовы think-cell всегда являются вызовами с поздним связыванием. Описание см. в статье базы знаний Microsoft:

Использование раннего связывания и позднего связывания в Автоматизации

Таким образом, объект надстройки think-cell — это просто Object, поэтому не требуется добавлять библиотеку типов или ссылку. Просто получите объект, вы сможете совершать вызовы. Например, в VBA в Excel:

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 является ссылкой на объект Excel.Application, куда загружается think-cell.

25.1
UpdateChart
25.2
PresentationFromTemplate

25.1 UpdateChart

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 именем strName с данными, содержащимися в rgData. Для правильной интерпретации данных для диаграмм диапазон rgData должен соответствовать их макету таблицы по умолчанию или переставленной версии. См. также Создание диаграммы на основе данных Excel и Настройка макета данных. То, какую версию использовать — по умолчанию или переставленную, — указывается установкой bTransposed на false или true соответственно. В случае с элементами, которые не являются диаграммами, например, с таблицами, значение bTransposed игнорируют.

target должен быть Presentation или SlideRange, или один Slide, Master или CustomLayout.

При сопоставлении имени strName регистр не учитывается. Оно должно было быть назначено ранее в PowerPoint с использованием элемента управления свойством Имя UpdateChart, как описано в разделе 24. Введение в автоматизацию.

Для выбора правильных элементов в качестве целей убедитесь в том, что только у них Имя UpdateChart установлено на strName в объекте, передаваемом как pres.

Если целевой элемент связан с каким-либо диапазоном данных Excel во время вызова этой функции, связь будет нарушена. После этого элемент не будет связан ни с каким диапазоном Excel.

25.1.3 Примеры

Чтобы использовать эти образцы, составьте презентацию, как описано в 24. Введение в автоматизацию, и сохраните ее как 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#

Чтобы использовать этот образец, замените им код в шаблоне проекта Program.cs C# Консольное приложение.

Для этого требуется ссылка на библиотеку объектов Microsoft PowerPoint 16.0, библиотеку объектов Microsoft Excel 16.0 и библиотеку объектов Microsoft Office 16.0 (см. сведения в C#).

При запуске получившегося в результате приложения диаграмма в шаблоне презентации обновится и будет содержать один ряд под названием «Ряд 1» со значениями 1, 2, 3. Результат сохранится как 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 PresentationFromTemplate

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.

Все элементы в strTemplate, которые связаны с книгой Excel wb, обновляются (независимо от того, обновляются они автоматически или нет). В полученной в результате презентации связи данных разбиты для того, чтобы избежать изменения этих элементов в будущем.

Элементы в strTemplate, которые связаны с книгами Excel, отличными от wb, не меняются и остаются связанными, поэтому можно обновить ссылки из множества книг Excel, сохранив результат этой функции как новый шаблон и вызвав эту функцию снова для следующей рабочей книги.

Если вы хотите управлять цветами сегментов диаграммы или форматированием ячеек таблицы со связью Excel, вы можете задать цветовую схему в опциях Использовать заливку таблицы сверху (см. раздел Цветовая схема) или Использовать таблицу... (см. раздел Форматирование таблицы) соответственно. Чтобы контролировать формат чисел с помощью ссылки на Excel, выберите параметр Использовать формат Excel (см. раздел Формат чисел).

Установите соответствующие опции форматирования и формат чисел соответствующих ячеек в Excel перед вызовом PresentationFromTemplate.

25.2.3 Примеры

Чтобы использовать эти образцы, сначала создайте презентацию, содержащую диаграмму с накоплением, связанную с диапазоном G1:K4 первого листа в рабочей книге Excel, как объясняется в разделе Создание диаграммы на основе данных Excel. Сохраните получившуюся в результате презентацию как C:\Samples\PresentationFromTemplate\template.pptx, а рабочую книгу как data.xlsx в одной и той же директории.

VBA

Чтобы использовать этот образец, добавьте его в модуль в рабочей книге Excel data.xlsx, подготовленный, как разъясняется выше.

Требуется ссылка на библиотеку объектов Microsoft PowerPoint 16.0 (см. сведения в Visual Basic for Applications).

При запуске PresentationFromTemplate_Sample изменится значение в ячейке Sheet1!H3, которая связана с первым значением первого ряда диаграммы, содержащимся в template.pptx, с 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#

Чтобы использовать этот образец, замените им код в шаблоне проекта Program.cs C# Консольное приложение.

Для этого требуется ссылка на библиотеку объектов Microsoft PowerPoint 16.0, библиотеку объектов Microsoft Excel 16.0 и библиотеку объектов Microsoft Office 16.0 (см. сведения в C#).

При запуске получившегося в результате приложения явно откроется Excel, загрузится рабочая книга data.xlsx изменится значение в ячейке H3, которая связана с первым значением первого ряда диаграммы, содержащимся в template.pptx, с 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();
        }
    }
}

Еще не пользуетесь нашим продуктом?

Поделиться