25. Automatización con datos de Excel

Cuando los datos se proporcionan en Excel, puedes utilizar las funciones UpdateChart y PresentationFromTemplate para controlar mediante programación utilizando esa información.

Con UpdateChart intercambia la hoja de datos de un elemento específico con sus datos de Excel. Con PresentationFromTemplate utiliza sus datos para crear una nueva presentación basada en una plantilla de PowerPoint con elementos de think-cell vinculados a rangos de datos en Excel que se describen en Enlaces de datos de Excel.

La interfaz para ambas funciones está integrada en el modelo de automatización de Office, de manera que puede accederse a ella en cualquier lenguaje en el que se programa Office, como Visual Basic para Aplicaciones (VBA) o C#. Consulte Primeros pasos para ver las instrucciones detalladas.

El punto de entrada a think-cell es el objeto de complemento think-cell. Puede accederse a él por medio de la colección Application.COMAddIns. Las llamadas a think-cell son siempre enlazadas en tiempo de ejecución. Consulte la base de conocimientos de Microsoft siguiente para obtener más información:

Uso de la vinculación temprana y la vinculación tardía en la automatización

Así pues, el tipo de objeto de complemento de think-cell es sencillamente Object, y no debe añadirse ningún tipo de biblioteca ni referencia. No tienen más que adquirir el objeto para poder realizar llamadas. Por ejemplo, en VBA en Excel:

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

En C#, puede conseguir la vinculación tardía declarando la referencia al objeto de complemento de think-cell como dynamic; este es también el tipo inferido por el compilador al declarar la referencia como var, de modo que puede escribir simplemente:

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

Aquí, xlapp es una referencia a un objeto de Excel.Application en el que se ha cargado think-cell.

25.1
UpdateChart
25.2
PresentationFromTemplate

25.1 UpdateChart

25.1.1 Firma

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 Descripción

Esta función actualiza todos los elementos en target llamados strName con los datos contenidos en rgData. Para que los datos se interpreten correctamente en los gráficos, el intervalo rgData debe ajustarse a su diseño predeterminado en la hoja de datos, o a su versión transpuesta, consulte también Creación de un gráfico con Excel y Ajuste del diseño de datos. Si se va a utilizar la versión predeterminada o la transpuesta se indica ajustando bTransposed en false o true, respectivamente. Para elementos distintos de gráficos, como, por ejemplo, tablas, se ignora el valor de bTransposed.

target debe ser una Presentation o SlideRange, o un única Slide, Master o CustomLayout.

El nombre strName se comprueba sin distinguir entre mayúsculas y minúsculas. Debe haberse asignado previamente en PowerPoint utilizando el control de propiedad Nombre de UpdateChart como se describe en Introducción a la automatización.

Para asegurarse de que se seleccionan los elementos correctos, asegúrese de que son los únicos que tienen su Nombre de UpdateChart establecido en strName en el objeto pasado como pres.

Si el elemento objetivo está vinculado a un intervalo de datos de Excel, el vínculo se rompe al invocar esta función. Posteriormente, el elemento no quedará vinculado a ningún intervalo de Excel.

25.1.3 Ejemplos

Para utilizar estas muestras, prepare una presentación como se describe en Introducción a la automatización, y guárdela como C:\Samples\UpdateChart\template.pptx.

VBA

Para usar este ejemplo, añádalo a un módulo en un libro de Excel.

Requiere una referencia a la biblioteca de objetos de Microsoft PowerPoint 16.0 (consulte Visual Basic para Aplicaciones para ver más detalles).

Ejecutar UpdateChart_Sample en un libro actualizará el gráfico en la plantilla de la presentación con los datos contenidos en el intervalo A1:D5 de su primera hoja.

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#

Para usar esta plantilla, sustituya el código en Program.cs de la plantilla del proyecto C# aplicación de consola por este.

Requiere referencias a la biblioteca de objetos de Microsoft PowerPoint 16.0, a la biblioteca de objetos de Microsoft Excel 16.0 y a la biblioteca de objetos de Microsoft Office 16.0 (consulte C# para ver más detalles).

Ejecutar la aplicación resultante actualizará el gráfico de la plantilla de presentación para que contenga una única serie llamada “Serie 1” con los valores 1, 2, 3, y guardará el resultado como 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 Firma

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 Descripción

Esta función utiliza los vínculos de datos entre el libro de Excel wb y la plantilla con nombre de archivo strTemplate para instanciar dicha plantilla actualizando los elementos vinculados con los datos de los rangos a los que están vinculados. El resultado es una nueva presentación dentro de la instancia de PowerPoint ppapp.

strTemplate puede ser una ruta de acceso completa o relativa, que se toma respecto a la ubicación del archivo del libro de Excel wb.

Todos los elementos de strTemplate que están vinculados al libro de Excel wb están actualizados (independientemente de que tengan actualización automática o no). En la presentación resultante, sus vínculos de datos se rompen para evitar que se produzcan más cambios en estos elementos.

Los elementos de strTemplate que están vinculados a libros Excel diferentes de wb no sufren cambios y continúan vinculados, de manera que es posible actualizar los vínculos a partir de varios libros de Excel guardando el resultado de esta función como plantilla nueva y, a continuación, llamando de nuevo esta función con el libro siguiente.

Si quiere controlar los colores de segmentos del gráfico o el formato de las celdas de la tabla con el vínculo de Excel, puede establecer la combinación de colores en las opciones Usar relleno de hoja de datos en parte superior (consulte Combinación de colores) o Usar hoja de datos... (consulte Formato de una tabla), respectivamente. De igual forma, para controlar el formato de número con el vínculo de Excel, defínalo como Usar formato de Excel (consulte Formato de número).

Asegúrese de definir las opciones de formato relevantes y el formato de número de las celdas correspondientes en Excel antes de llamar a PresentationFromTemplate.

25.2.3 Ejemplos

Para utilizar estos ejemplos, cree primero una presentación que contenga un gráfico apilado vinculado al intervalo de la primera hoja de un libro de Excel, como se explica en G1:K4. Guarde la presentación resultante como C:\Samples\PresentationFromTemplate\template.pptx y el libro de trabajo como data.xlsx en el mismo directorio.

VBA

Para utilizar este ejemplo, añádalo a un módulo del libro de Excel data.xlsx preparado como se ha explicado anteriormente.

Requiere una referencia a la biblioteca de objetos de Microsoft PowerPoint 16.0 (consulte Visual Basic para Aplicaciones para ver más detalles).

Ejecutar PresentationFromTemplate_Sample cambiará el valor de la celda Sheet1!H3, que está vinculado al primer valor de la primera serie del gráfico contenido en template.pptx, de i=1 a 10, creará una nueva presentación con el gráfico de la plantilla actualizado para contener ese valor, y que ya no está vinculado al libro, y la guardará como output_i.pptx en el mismo directorio que la plantilla.

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#

Para usar esta plantilla, sustituya el código en Program.cs de la plantilla del proyecto C# aplicación de consola por este.

Requiere referencias a la biblioteca de objetos de Microsoft PowerPoint 16.0, a la biblioteca de objetos de Microsoft Excel 16.0 y a la biblioteca de objetos de Microsoft Office 16.0 (consulte C# para ver más detalles).

Ejecutar la aplicación resultante abrirá visiblemente Excel, cargará el libro data.xlsx, cambiará el valor de la celda H3, que está vinculado al primer valor de la primera serie del gráfico contenido en template.pptx, de i=1 a 10, creará una nueva presentación con el gráfico de la plantilla actualizado para contener ese valor, y que ya no está vinculado al libro, y la guardará como output_i.pptx en el mismo directorio que la plantilla.

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

Compartir