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 server。client从server那里获取属性和方法来操作对象有两种方式:static bound和dynamic 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,_Worksheet,Workbooks,Worksheets,Range。对应的向导自动产生了CApplication,CWorkbook,CWorksheet,CWorkbooks,CWorksheets,CRange这几个类。在程序中,我们就用这些类来完成对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();//注意要先Quit在ReleaseDispatched,否则就会出现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中所有的数据,如果要取得(i,j)位置的字符串,就可以用下面的代码来获得: