在VS2010中利用MFC讀取word、ppt、excel格式檔案
阿新 • • 發佈:2019-02-05
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());
}
{
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());
}