代码如下:Range rgMyRge;rgMyRge.AttachDispatch(ExcelSheet.GetColumns(),true);   //得列数 
nCols = rgMyRge.GetCount();               //nClos = 256rgMyRge.AttachDispatch(ExcelSheet.GetRows(),true);   //得行数 
nRows = rgMyRge.GetCount();                          //nRows = 655536

解决方案 »

  1.   

    请看我完整的Excel读取代码:void CTestExcelDlg::OnButton1() 
    {

    CString sFilter="Excel文件(*.xls;*.xlw)|*.xls;*.xlw";
    if (!sFilter.IsEmpty()) sFilter+="|所有文件(*.*)|*.*||";
    else sFilter="所有文件(*.*)|*.*||";


    CFileDialog dlg(TRUE,NULL,NULL,0,(LPCSTR)sFilter, this);
    dlg.m_ofn.Flags|=OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_LONGNAMES|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY;//OFN_SHOWHELP|

    CString sInitPath = "c:\\";
    char buf[20480]="";
    dlg.m_ofn.lpstrFile=buf;
    dlg.m_ofn.nMaxFile=2048;
    dlg.m_ofn.lpstrTitle="选择源文件";
    dlg.m_ofn.lpstrInitialDir=(LPCTSTR)sInitPath;//初始化最初的路径。
    int nRet=dlg.DoModal();
    if(nRet==IDCANCEL)
    {
    return;
    }
    POSITION pos=dlg.GetStartPosition();
    if(pos==NULL)return ;
    CStringArray arrSourPath;
    arrSourPath.SetSize(0, 10);
    while(pos!=NULL)
    {
    arrSourPath.Add(dlg.GetNextPathName(pos));
    }
    int nFileCount = arrSourPath.GetSize();
    if(nFileCount<=0)
    {
    AfxMessageBox("No file choiced!");
    return;
    }

    // TODO: Add your control notification handler code here
    // OLE Variant for Optional.
    //初始化COM
    if (CoInitialize(NULL)!=0) 
    {
    AfxMessageBox("Can't initialize COM");
    }

    COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    _Application objApp;
    _Workbook objBook;
    Workbooks objBooks;
    Worksheets objSheets;
    _Worksheet objSheet;
    Range objRange;
    VARIANT ret;


    // 下面生成Excel实例并打开一个存在的工作簿:
    objApp.CreateDispatch("Excel.Application");
    objBooks = objApp.GetWorkbooks();

    nFileCount = arrSourPath.GetSize();
    for(int nIndex=0; nIndex<nFileCount; nIndex++)
    {
    CString sSourFile = arrSourPath.GetAt(nIndex);
    CString sDestFile;
    int nPos = sSourFile.ReverseFind('.');
    sDestFile = sSourFile.Left(nPos);
    sDestFile += ".txt";

    objBook = objBooks.Open(sSourFile,
    VOptional, VOptional, VOptional, VOptional,
    VOptional, VOptional, VOptional, VOptional,
    VOptional, VOptional, VOptional, VOptional);
    objSheets = objBook.GetWorksheets();
    int SheetsCount=objSheets.GetCount();//这里获得了sheet的数目

    FILE *fp; //创建一个txt文件用来存放从Excel文件中抽取的文本内容
    //fp=fopen("c:\\book1.txt","wt"); //将文件打开
    fp=fopen(sDestFile, "wt");
    //for(int sheet=1;sheet<=SheetsCount;sheet++)
    //既然只要一个sheet,这是设置一下即可。 
    SheetsCount =1;
    for(int sheet=1;sheet<=SheetsCount;sheet++)
    {//注意:从1开始。
    objSheet = objSheets.GetItem(COleVariant((short)sheet));//获得指定的工作表

    CString SheetName = objSheet . GetName();//获得当前工作表名称
    fprintf(fp,"工作表%d:%s\n",sheet,SheetName); //将这个名称输出
    objRange = objSheet.GetUsedRange();//这里获得所有的已用的Cells(单元格)
    //objRange = objSheet.GetRange(COleVariant("A1"), COleVariant("D20"));
    ret = objRange.GetValue();
    if(ret.vt == VT_EMPTY) continue; //碰到空的工作表就返回
    COleSafeArray sa(ret);
    //判断数组的维数
    long lNumRows;
    long lNumCols;
    sa.GetUBound(1, &lNumRows);
    sa.GetUBound(2, &lNumCols);
    //输出中的SAFEARRAY元素
    long index[2];
    VARIANT val;
    int r, c;
    CString contents;
    for(r=1;r<=lNumRows;r++)
    {
    bool bEmpty=true;
    for(c=1;c<=lNumCols;c++)
    {
    if(c==1)
    {
    contents="IDC_";
    }
    else{
    contents+=" ";//tab
    }
    if(c>=8 && c<=13) //G-M
    {
    continue;
    }
    index[0]=r;
    index[1]=c;
    sa.GetElement(index, &val);
    switch(val.vt)
    {
    case VT_BOOL: //如果单元格中的值为布尔值
    {
    bool flag=val.boolVal;
    if(flag==true) contents+="TRUE"; //输出的内容进行转换
    else contents+="FALSE";
    bEmpty=false;
    break;
    }
    case VT_R8:  //如果单元格中的值为数字
    {//这里将整数从实数中分离出来,防止整数后面有一串'0'。
    float value=val.dblVal; char buffer[20];
    sprintf(buffer,"%f",value);
    if(c==17) //Q
    {
    CString tmp=buffer;
    int dot=tmp.Find('.');
    CString Left=tmp.Left(dot+2);
    contents+=Left;
    }
    else
    {
    CString tmp=buffer;
    int dot=tmp.Find('.');
    CString Left=tmp.Left(dot);
    tmp=tmp.Mid(dot+1);
    if(tmp=="000000") contents+=Left;
    else contents+=buffer;
    bEmpty=false;
    }
    bEmpty=false;
    /*
    char buffer[20];
    sprintf(buffer,"%f",value);
    CString tmp=buffer;
    int dot=tmp.Find('.');
    CString Left=tmp.Left(dot);
    tmp=tmp.Mid(dot+1);
    if(tmp=="000000") contents+=Left;
    else contents+=buffer;
    bEmpty=false;
    */
    /*CString sTmp;
    if(c==17) //Q
    {
    sTmp.Format("%.1f", val.dblVal);
    }
    else{
    sTmp.Format("%.0f", val.dblVal);
    }
    contents += sTmp;*/
    contents+="    ";//tab,用于格式控制
    break;
    }
    case VT_BSTR://文字
    {
    contents+=(CString)val.bstrVal;
    //if(1==c) Ar=contents.GetLength();
    contents+="    ";//tab
    bEmpty=false;
    break;
    }
    case VT_EMPTY:
    {
    break;
    }//end of case Empty
    }//end of switch
    }//end of col
    if(fp){
    //if(  !contents.IsEmpty()  )   //内容不为空,就输出
    {
    fprintf(fp,"%s",contents);
    fprintf(fp,"\n");
    }
    }
    }//end of rows
    fprintf(fp,"\n");
    }//end of deal with different sheet.
    if(fp) fclose(fp);  //关闭打开的文件
    }
    objBook.Close(COleVariant((short)FALSE), VOptional, VOptional);
    objApp.Quit(); 

    CoUninitialize();
    AfxMessageBox("处理结束!");
    }