EXCEL自动化

来源:互联网 发布:dosbox优化 编辑:程序博客网 时间:2024/04/30 00:25

http://hi.baidu.com/%D0%A1%C0%EE%B7%C9%B5%B6%D4%D9%B7%C9%B5%B6/blog/item/5cf24817fb01fb10972b43a7.html

1.    概念

操作别的应用程序提供的对象的程序是automation client.而提供对象供别的应用程序操作的就是automation serverclientserver那里获取属性和方法来操作对象有两种方式:static bounddynamic bound。分别是在编译时和运行时获知。dynamic bound通过IDispach来实现,而static bound是通过COleDispachDriver来实现。

2.    步骤

2.1 Solution Explorer中右键点击工程,并且选择Add->Add Class,在对话框中选择MFC Class From TypeLib。在Available type libraries下拉列表中选择Microsoft Excel 11.0 Object Library.这时就可以从Interfaces列表中选择我们要生成的Class的接口。这里需要用到的接口有_Application _Workbook_WorksheetWorkbooksWorksheetsRange。对应的向导自动产生了CApplicationCWorkbookCWorksheetCWorkbooksCWorksheetsCRange这几个类。在程序中,我们就用这些类来完成对Excel文件的读入。

2.2 数据读取

   创建Excel app ---->获取books ---->获取sheet ---->获取range

 

 

 

    CApplication m_excelApp;

    CWorkbooks m_books;

    CWorkbook m_book;

    CWorksheets m_sheets;

    CWorksheet m_sheet;

    COleSafeArray m_data;

    CRange range;

    CRange row_range;

    CRange col_range;

 

    if (!m_excelApp.CreateDispatch(_T("Excel.Application"),NULL))

    {

        AfxMessageBox(_T("create Excel server fail!"));

        return FALSE;

    }

    m_books.AttachDispatch(m_excelApp.get_Workbooks());

    m_book.AttachDispatch(m_books.Add(_variant_t(lpszPathName)));

    m_sheets.AttachDispatch(m_book.get_Sheets());

    m_sheet.AttachDispatch(m_sheets.get_Item(_variant_t(1)));

    range.AttachDispatch(m_sheet.get_UsedRange());

    row_range.AttachDispatch(range.get_Rows());

    col_range.AttachDispatch(range.get_Columns());

    m_nRow = row_range.get_Count();

    m_nCol = col_range.get_Count();

    m_data = range.get_Value(COleVariant(DISP_E_PARAMNOTFOUND,VT_ERROR));

   

row_range.DetachDispatch();

    col_range.DetachDispatch();

    range.DetachDispatch();

    m_sheet.DetachDispatch();

    m_sheets.DetachDispatch();

    m_book.DetachDispatch();

    m_books.DetachDispatch();

    m_excelApp.Quit();//注意要先QuitReleaseDispatched,否则就会出现excel线程无法退出的情况。这是由于执行这个操作的时候回去查看它的dispatched情况,如果先release了,检查不到就不会执行任何操作。

    m_excelApp.ReleaseDispatch();

 

 

 

 

    COleVariant vData;

    long index[2];

    index[0] = iRow + 1;

    index[1] = iCol + 1;

    m_data.GetElement(index, vData);

    CString str(vData);

 

 

在实际使用过程中,如果导入的Excel文件过大,显示会很迟缓,13M的文件显示出来大概需要30sec的时间。

 

 

 

 

 

在上面的代码中m_data就存储着第一个sheet中所有的数据,如果要取得(ij)位置的字符串,就可以用下面的代码来获得:

原创粉丝点击