1. 程式人生 > >在VS2010中利用MFC讀取word、ppt、excel格式檔案

在VS2010中利用MFC讀取word、ppt、excel格式檔案

void ReadExcel(CString filename)
{
LPDISPATCH lpDisp = NULL;
//
COleVariant vResult;
COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        vtMissing((long)DISP_E_PARAMNOTFOUND, VT_ERROR);    
 
//開啟指定路徑檔案
CString FileName=filename;
if (!excelApp.CreateDispatch(_T("Excel.Application"),NULL)) {
AfxMessageBox(_T("Excel failed to start!"));
return ;
}
//設定excel表不可見
excelApp.put_Visible(FALSE);

//建立一個文字檔案
CFile   file;
file.Open(_T("tmp.txt"),CFile::modeCreate|CFile::modeWrite);
WORD unicode = 0xFEFF;
file.Write(&unicode,2);


try
    {

        //開啟一個工作簿
books.AttachDispatch(excelApp.get_Workbooks());

        lpDisp = books.Open(FileName, 
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, 
            vtMissing, vtMissing, vtMissing, vtMissing);


        book.AttachDispatch(lpDisp);


//得到Worksheets  
sheets.AttachDispatch(book.get_Worksheets());


//如果有單元格正處於編輯狀態中,此操作不能返回,會一直等待  
lpDisp=book.get_ActiveSheet();  
sheet.AttachDispatch(lpDisp); 

//得到工作簿中的Sheet的容器
// sheets.AttachDispatch(book.get_Sheets());
 
//讀取已經使用區域的資訊,包括已經使用的行數、列數、起始行、起始列
CRange0 usedRange;
usedRange.AttachDispatch(sheet.get_UsedRange());
excelRange.AttachDispatch(usedRange.get_Rows());
long iRowNum=excelRange.get_Count();                   //已經使用的行數
 
excelRange.AttachDispatch(usedRange.get_Columns());
long iColNum=excelRange.get_Count();                   //已經使用的列數
  
long iStartRow=usedRange.get_Row();               //已使用區域的起始行,從1開始
long iStartCol=usedRange.get_Column();            //已使用區域的起始列,從1開始
//
long i,j;
for(i=iStartRow;i<=iRowNum;i++)
for(j=iStartCol;j<=iColNum;j++)
{
//讀取第一個單元格的值
excelRange.AttachDispatch(sheet.get_Cells()); 
excelRange.AttachDispatch(excelRange.get_Item(COleVariant((long)i),COleVariant((long)j)).pdispVal );
COleVariant vResult =excelRange.get_Value2();
CString str;
if(vResult.vt == VT_BSTR)       //字串
{
 str=vResult.bstrVal;
}
else if (vResult.vt==VT_R8)     //8位元組的數字 
{
 str.Format(_T("%f"),vResult.dblVal);
}
else 
str="";
//AfxMessageBox(str);
file.Write(str,wcslen(str)*sizeof(wchar_t));
}
}
    catch(...)
    {
       AfxMessageBox(_T("開啟檔案失敗!"));
    }



//關閉文件
file.Flush();
file.Close();
    /*釋放資源*/
    sheet.ReleaseDispatch();
    sheets.ReleaseDispatch();
    book.ReleaseDispatch();
    books.ReleaseDispatch();
    excelApp.Quit();
    excelApp.ReleaseDispatch();


//AfxMessageBox(aRange.get_Text());
}