Cómo: Utilizar MFC para copiar un conjunto de registros a Excel con automatización

Seleccione idioma Seleccione idioma
Id. de artículo: 243394 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

Microsoft Excel expone el método CopyFromRecordset para un objeto Range copiar el contenido de un objeto Recordset de objetos de acceso a datos (DAO) en una hoja de cálculo. En este artículo muestra cómo se puede utilizar DAO de MFC para crear un conjunto de registros, a continuación, puede copiar a una hoja de cálculo de Excel utilizando la automatización.

Más información

Los pasos siguientes demuestran cómo puede obtener un conjunto de registros de todos los registros de la tabla "Products" en el ejemplo de acceso base de datos Neptuno.mdb y, a continuación, automatizar Excel para copiar el contenido de ese conjunto de registros en una hoja de cálculo. Aunque este ejemplo utiliza una base de datos para su conjunto de registros, puede utilizar cualquier base de datos para el que puede proporcionar un ODBC cadena de conexión. Para más detalles sobre el uso de orígenes de datos ODBC con DAO, consulte la Ayuda de DAO de MFC en pantalla.

Código de ejemplo

  1. Inicie un nuevo proyecto EXE de MFC AppWizard que está basada en cuadros de diálogo y denominado AutoExcel .
  2. En el menú Ver , haga clic en ClassWizard (o presione CTRL+W ). En la ficha automatización , haga clic en Agregar clase y elija "Desde una biblioteca de tipos". Desplácese para buscar la biblioteca de tipo de Excel (Excel8.olb para Excel 97), Excel9.olb para Excel 2000 o Excel.Exe de Excel 2002 Excel 2003.
    Nota : la biblioteca de tipo se encuentra en el mismo directorio como el ejecutable de Excel.
  3. Agregar todas las clases en la biblioteca de tipo de Excel que presenta ClassWizard.
  4. Agregue un botón denominado IDC_RUN al recurso de cuadro de diálogo IDD_AUTOEXCEL_DIALOG y agregue el código siguiente al controlador del botón.
    
    void CAutoExcelDlg::OnRun() 
    {
        //For optional arguments
        COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
    
        CDaoDatabase db;
        CDaoRecordset rs;
        CString sConn;
        long lNumCols;
    
        //Get a recordset that represents all the records in the Products 
        //table of the sample Northwind database
        sConn = 
         "C:\\Program Files\\Microsoft Office\\Office\\Samples\\Northwind.mdb";
        db.Open(sConn, FALSE, FALSE);
        rs.m_pDatabase = &db;    
        rs.Open(AFX_DAO_USE_DEFAULT_TYPE, "Select * From Products", 0);
        lNumCols = rs.GetFieldCount();
    
        //Start a new workbook in Excel
        _Application oApp;
        oApp.CreateDispatch("Excel.Application");
        if (!oApp)
        {
            AfxMessageBox("Cannot start Excel");
            return;
        }
    
        Workbooks oBooks = oApp.GetWorkbooks();
        _Workbook oBook = oBooks.Add(vOpt);
        Worksheets oSheets = oBook.GetWorksheets();
        _Worksheet oSheet = oSheets.GetItem(COleVariant((short)1));
        Range oRange;
    
        //Transfer the data in the recordset to the worksheet
        COleDispatchDriver rs2;
        rs2.AttachDispatch((LPDISPATCH) rs.m_pDAORecordset);
        oRange = oSheet.GetRange(COleVariant("A2"), vOpt);
        oRange.CopyFromRecordset((LPUNKNOWN) rs2.m_lpDispatch, vOpt, vOpt);
        rs2.DetachDispatch();
        rs2.ReleaseDispatch();
    
        //Add the field names to row 1
        CDaoFieldInfo FieldInfo;
        for(long i=0; i<=lNumCols-1;i++)
        {
            oRange = oSheet.GetRange(COleVariant("A1"), vOpt);
            oRange = oRange.GetOffset(vOpt, COleVariant(i));
            rs.GetFieldInfo(i, FieldInfo, AFX_DAO_PRIMARY_INFO);
    
            oRange.SetValue(COleVariant(FieldInfo.m_strName));
            // For Excel 2003, SetValue takes two parameters.
           // oRange.SetValue(COleVariant(FieldInfo.m_strName),COleVariant());
        }
    
        //Format the worksheet
        oRange = oSheet.GetRange(COleVariant("A1"), vOpt);
        oRange = oRange.GetResize(COleVariant((short)1), 
                                  COleVariant(lNumCols));
        Font oFont = oRange.GetFont();
        oFont.SetBold(COleVariant((short)TRUE));
        oRange = oRange.GetEntireColumn();
        oRange.AutoFit();
    
        //Make Excel visible and give the user control
        oApp.SetVisible(TRUE);
        oApp.SetUserControl(TRUE);
    }
    
    						
  5. Incluya el archivo de encabezado pero generado desde la biblioteca de tipos de Excel a CAutoExcelDlg.cpp. Por ejemplo:
        #include "excel8.h" /// For Excel 2003, use #include "excel.h"
    						
    Nota : agregar esta directiva después de inclusión para "Stdafx.h" evitar errores del compilador.
  6. Incluir el archivo de encabezado para DAO de MFC en StdAfx.h:
        #include <afxdao.h>
    						
  7. Modificar CAutoExcelApp::InitInstance en AutoExcel.cpp de modo que los servicios de COM se inicializan cuando se inicia la aplicación:
        if(!AfxOleInit())
        {
            AfxMessageBox("Cannot initialize COM services.");
            return FALSE;
        }    
    						
    Nota : Agregue este código antes de la llamada a DoModal().
  8. Genere y ejecute la aplicación.
  9. Haga clic en el cuadro de diálogo en el botón. Cuando finaliza el controlador del botón, verá el contenido de la tabla productos de Neptuno en la primera hoja de un libro en Excel.

Propiedades

Id. de artículo: 243394 - Última revisión: jueves, 25 de enero de 2007 - Versión: 4.5
La información de este artículo se refiere a:
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual C++ 5.0 Professional
Palabras clave: 
kbmt kbautomation kbhowto KB243394 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): 243394

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