Cómo automatizar Excel desde MFC y Visual C++ 2005 o Visual C++ .NET para rellenar u obtener datos de un rango utilizando matrices

Seleccione idioma Seleccione idioma
Id. de artículo: 308407 - Ver los productos a los que se aplica este artículo
Para obtener una versión de Microsoft C# .NET de este artículo, consulte 302096.
Para obtener una versión de Microsoft Visual Basic .NET de este artículo, consulte 302094.
Nota Microsoft Visual C++ 2005, Visual C++ .NET 2003 y Visual C++ .NET 2002 admiten tanto el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows. La información de este artículo sólo se aplica al código no administrado de Visual C++.
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se muestra cómo automatizar Microsoft Excel desde Visual C++ 2005 o Visual C++ .NET para rellenar y recuperar valores de un rango de varias celdas utilizando matrices.

Crear a un cliente de automatización para Excel

Para rellenar un rango de varias celdas sin rellenar celdas uno a la vez, puede establecer la propiedad Value de un objeto Range en una matriz bidimensional. Igualmente, puede recuperar una matriz bidimensional de valores para varias celdas a la vez mediante la propiedad Value . Los pasos siguientes muestran este proceso de establecer y recuperar datos utilizando matrices bidimensionales.
  1. Siga los pasos de la sección "Crear a un cliente de automatización" del artículo de Knowledge Base siguiente para crear a un cliente de automatización básico:
    307473Cómo utilizar una biblioteca de tipos para automatización de Office desde Visual C++ .NET
    En el paso 3, agregar un segundo botón y una casilla de verificación al formulario. Cambiar el ID del botón a IDC_GETVALUES y el título a obtener . Cambiar el ID de la casilla de verificación a IDC_CHECK y el título a rellenar con cadenas .

    En el paso 4 del artículo, seleccione "Biblioteca de objetos de Microsoft Excel 10.0" Si está automatizando Excel 2002 desde Office XP. La ubicación predeterminada para Excel 2002 es c:\Archivos programa\Microsoft Office\Office10\Excel.exe. O bien, seleccione "Biblioteca de objetos de Microsoft Excel 11.0" Si está automatizando Microsoft Office Excel 2003. La ubicación predeterminada para Excel 2003 es c:\Archivos programa\Microsoft Office\Office11\Excel.exe. Seleccione las siguientes interfaces de Microsoft Excel:
    • _Application
    • _Workbook
    • _Worksheet
    • Intervalo
    • Libros
    • Hojas de cálculo
    En el paso 6, agregue las siguientes instrucciones # include directamente después de la directiva # pragma once autoprojectdlg.h:
    #include "CApplication.h"
    #include "CRange.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    					
  2. Agregue las siguientes dos variables de miembro público a la clase CAutoProjectDlg :
    CApplication oExcel;
    CWorkbook oBook;
    					
  3. En el cuadro de diálogo, haga clic con el botón secundario del mouse en IDC_CHECK y seleccione Agregar Variable . Nombre de la variable m_bFillWithStrings y haga clic en Finalizar .
  4. En el cuadro de diálogo, haga doble clic en Ejecutar y reemplace el código siguiente
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    con:
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	CWorkbooks oBooks;
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// If you have not created Excel, create a new instance.
    	if (oExcel.m_lpDispatch == NULL) {
    		oExcel.CreateDispatch("Excel.Application");
    	}
    	// Show Excel to the user.
    	oExcel.put_Visible(TRUE);
    	oExcel.put_UserControl(TRUE);
    
    	// Add a new workbook and get the first worksheet in that book.
    	oBooks = oExcel.get_Workbooks();
    	oBook = oBooks.Add(covOptional);
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    
    	// Get a range of data.
    	oRange = oSheet.get_Range(COleVariant("A1"),covOptional);
    	oRange = oRange.get_Resize(COleVariant((short)5),COleVariant((short)5));
    
    	COleSafeArray saRet;
    	DWORD numElements[2];
    	numElements[0] = 5;
    	numElements[1] = 5;
    
    	long index[2];
    	// Create a BSTR or double safe array.
    	if (m_bFillWithStrings.GetCheck())
    		saRet.Create(VT_BSTR,2,numElements);
    	else
    		saRet.Create(VT_R8,2,numElements);
    
    	// Fill the array with data.
    	for (int iRow = 1; iRow <= 5; iRow++) {
    		for (int iCol = 1; iCol <= 5; iCol++) {
    			index[0]=iRow-1;
    			index[1]=iCol-1;
    			if (m_bFillWithStrings.GetCheck()) {
    				CString szTemp;
    				szTemp.Format("%d|%d",iRow,iCol);
    				BSTR bstr = szTemp.AllocSysString();
    				saRet.PutElement(index,bstr);
    				SysFreeString(bstr);
    			} else {
    				double d = iRow * iCol;
    				saRet.PutElement(index,&d);
    			}
    		}
    	}
    	// Send the array to Excel.
    	oRange.put_Value(covOptional,COleVariant(saRet));
    }
    					
    Nota en Visual C++ 2005, debe agregar la opción compatibilidad con compilador de common language runtime ( / clr: oldSyntax ) para compilar correctamente el ejemplo de código anterior. Para agregar la opción de compilador de compatibilidad de common language runtime, siga estos pasos:
    1. Haga clic en proyecto y, a continuación, haga clic en propiedades ProjectName.

      Nota ProjectName es un marcador de posición para el nombre del proyecto.
    2. Expanda Propiedades de configuración y, a continuación, haga clic en General .
    3. En el panel derecho, haga clic para seleccionar compatible con Common Language Runtime, sintaxis antigua (/ CLR: oldSyntax) en Common Language Runtime admite la configuración del proyecto.
    4. Haga clic en Aplicar y, a continuación, haga clic en Aceptar .
    Para obtener más información acerca de common language runtime admiten opciones de compilador, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
    Estos pasos se aplican el artículo completo.
  5. Vuelva al cuadro de diálogo y haga doble clic en Obtener valores . Reemplace el código siguiente
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	// TODO: Add your control notification handler code here
    }
    					
    con:
    void CAutoProjectDlg::OnBnClickedGetvalues()
    {
    	CWorksheets oSheets;
    	CWorksheet oSheet;
    	CRange oRange;
    	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);
    
    	// Make sure that Excel has been started.
    	if (oExcel.m_lpDispatch == NULL) {
    		AfxMessageBox("Excel has not been started.  Press button1 to start Excel.");
    		return;
    	}
    	// Get the first worksheet.
    	oSheets = oBook.get_Worksheets();
    	oSheet = oSheets.get_Item(COleVariant((short)1));
    	// Set the range of data to retrieve
       	oRange = oSheet.get_Range(COleVariant("A1"),COleVariant("E5"));
    
    	// Get the data.
    	COleSafeArray saRet(oRange.get_Value(covOptional));
    
            long iRows;
            long iCols;
            saRet.GetUBound(1, &iRows);
            saRet.GetUBound(2, &iCols);
    
    	CString valueString = "Array Data:\r\n";
    	long index[2];
    	// Loop through the data and report the contents.
    	for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {
    		for (int colCounter = 1; colCounter <= iCols; colCounter++) {
    			index[0]=rowCounter;
    			index[1]=colCounter;		   
    			COleVariant vData;
    			saRet.GetElement(index,vData);
    			CString szdata(vData);
                valueString += szdata;
    			valueString += "\t";		
    		}
    		valueString += "\r\n";
    	}
    	AfxMessageBox(valueString,MB_SETFOREGROUND,NULL);
    }
    					

El cliente de automatización de prueba

  1. Presione F5 para generar y ejecutar el programa de ejemplo.
  2. Haga clic en Ejecutar . El programa iniciará Excel con un nuevo libro y rellena las celdas a1: E5 de la primera hoja de cálculo con datos numéricos de la matriz.
  3. Haga clic en obtener valores . El sistema recupera los datos de las celdas a1: E5 en una nueva matriz y muestra los resultados en un cuadro de mensaje.
  4. Seleccione Relleno con cadenas y haga clic en Ejecutar para rellenar las celdas a1: E5 con datos de cadena.
  5. Haga clic en Obtener valores para mostrar los valores de cadena en un cuadro de mensaje.

Solución de problemas

Si agrega mediante la opción de archivo en Asistente la para agregar clases de biblioteca de tipos de contenedores de clase para la biblioteca de objetos de Excel, puede recibir un mensaje de error cuando explora la biblioteca de objeto. Para evitar este problema, escriba el nombre completo de ruta de acceso y para la biblioteca de objeto instead of buscando el archivo. Para obtener información adicional, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
311408Error: 'Es de sólo lectura' Advertencia al agregar la clase MFC de biblioteca
Si recibe el siguiente mensaje de error al generar la aplicación de ejemplo, cambie "DialogBox Variant" en CRange.h "Variant _DialogBox":
Advertencia C4003: no hay suficientes parámetros reales para la macro 'DialogBoxA'
Para obtener más información sobre la causa de este error, consulte el siguiente artículo de Knowledge Base:
311407Error: Asistente para MFC no Resolve conflictos con macros de la API de nombres

Referencias

Para obtener más información, vea el programador de Microsoft siguiente sitio Web de Network (MSDN):
Desarrollo de Microsoft Office con Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Para obtener más información acerca del uso matrices para establecer y recuperar datos con versiones anteriores de Visual Studio de Excel, consulte los artículos de Knowledge Base siguientes:
186120Cómo usar MFC para automatizar Excel y rellenar un rango con una matriz
186122Cómo usar MFC para automatizar Excel y obtener una matriz desde un rango
247412INFORMACIÓN: Métodos para transferir datos a Excel desde Visual Basic

Propiedades

Id. de artículo: 308407 - Última revisión: miércoles, 17 de enero de 2007 - Versión: 6.3
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard
  • Microsoft Visual C++ .NET 2002 Standard
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
Palabras clave: 
kbmt kbautomation kbhowtomaster KB308407 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 308407

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com