简单代码如下:
bool CTVMSADMApp::ParseXLS(CString szPath,PYZWLinkArray & yzwLinkArray)
{
// TODO: Add your command handler code here
_Application excelApp;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
// Range xlsCells,xlsCol;
LPDISPATCH lpDisp;
COleVariant covTrue((short)TRUE),covFalse((short)FALSE),covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//创建Excel 2000服务器(启动Excel)
if (!excelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("创建Excel服务失败!");
return false;
}
excelApp.SetVisible(FALSE); //使Excel可见 true
excelApp.SetUserControl(FALSE); //允许其它用户控制Excel true
books.AttachDispatch(excelApp.GetWorkbooks());
try
{
lpDisp = books.Open(szPath,
covOptional, covTrue, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional);
}
catch (...)
{
books.Close();
excelApp.Quit();
CoUninitialize();
return false;
}
//Get work book
book.AttachDispatch(lpDisp);
//Get work sheets
sheets.AttachDispatch(book.GetWorksheets());
lpDisp=book.GetActiveSheet();
sheet.AttachDispatch(lpDisp);
// 读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
Range usedRange;
usedRange.AttachDispatch(sheet.GetUsedRange());
range.AttachDispatch(usedRange.GetRows());
int iRowUsed=range.GetCount(); //已经使用的行数
range.AttachDispatch(usedRange.GetColumns());
int iColNum=range.GetCount(); //已经使用的列数
int iStartRow=usedRange.GetRow(); //已使用区域的起始行,从1开始
int iStartCol=usedRange.GetColumn(); //已使用区域的起始列,从1开始
int nStartRow; ///有用的数据开始的行
COleVariant vResult;
///寻找起始行
for(int i=iStartRow; i<iStartRow+iRowUsed; i++)
{
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch(range.GetItem (COleVariant((long)(i)),COleVariant((long)1)).pdispVal );
vResult=range.GetValue2();
vResult.ChangeType(VT_BSTR);
CString strResult=vResult.bstrVal;
if(strResult=="序号")
{
nStartRow=i+1;
break;
}
}
//int rightDataCount=0;
for(i=nStartRow; i<iStartRow+iRowUsed; i++)
{
YStruct *pYXYZWS=new YStruct;
bool bHasUsefulData=false;
for(int j=1; j<8; j++)
{
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch(range.GetItem (COleVariant((long)(i)),COleVariant((long)(j))).pdispVal);
vResult=range.GetValue2();
vResult.ChangeType(VT_BSTR);
CString str=vResult.bstrVal;
pYXYZWS->nSerialNo=-1;
}
if(bHasUsefulData)
{
yzwLinkArray.Add(pYXYZWS);
}
else delete pYXYZWS;
}
//release
book.Close(covOptional,COleVariant(szPath),covOptional);
books.Close();
excelApp.Quit();
return true;
}
初始化Com组件:
BOOL CTVMSADMApp::InitInstance()
{
AfxEnableControlContainer();
if(!SUCCEEDED(::CoInitialize(NULL)))
{
AfxMessageBox("Init Com Failed!");
return false;
}
记得最后释放:
CoUninitialize();没有不知道什么结果。
注意:excel.h excel.cpp