//   OLE   Variant   for   Optional.   
      COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);   
    
      _Application   objApp;   
      _Workbook   objBook;   
      Workbooks   objBooks;   
      Worksheets   objSheets;   
      _Worksheet   objSheet;    
      // Comments   comments;   
      // Comment     comment;   
      Range   objRange;   
      VARIANT   ret;  
      //LPDISPATCH objBook;
    
         
      objApp.CreateDispatch("Excel.Application");   
      objBooks = objApp.GetWorkbooks();         objBook = objBooks.Open("C:\\temp\\book.xls",   
                          VOptional,   VOptional,   VOptional,   VOptional,   
                          VOptional,   VOptional,   VOptional,   VOptional,   
                          VOptional,   VOptional,   VOptional,   VOptional, 
                          VOptional,   VOptional);   
      objSheets   =   objBook.GetWorksheets();   
      int   SheetsCount=objSheets.GetCount();//这里获得了sheet的数目,这里应当有一个循环,读取所有的sheet   
    
      FILE   *fp;  
      
      //if(access("C:\\temp\\t.txt",0) == -1)
      {
          fp=fopen("C:\\temp\\t.txt","wt");
      }
         
  
//    fp=fopen("C:\\temp\\t.txt","wt");   
    
      for(int sheet=1; sheet <= SheetsCount; sheet++)
      {     
        //注意:从1开始。   
        objSheet   =   objSheets.GetItem(COleVariant((short)sheet));   
        //开始把每一行转换为一个单独的记录,记录中的字段有用户指定   
        objRange   =   objSheet.GetUsedRange();//这里获得所有的已用的Cells   
        ret   =   objRange.GetValue();           if(ret.vt   ==   VT_EMPTY)
        {
          continue; 
        }
        
        //Create   the   SAFEARRAY   from   the   VARIANT   ret.   
        COleSafeArray   sa(ret); 
    
        //Determine   the   array's   dimensions.   
        //获得表格总的的行数和列数   
        long   lNumRows;   
        long   lNumCols;   
        sa.GetUBound(1,   &lNumRows);   
        sa.GetUBound(2,   &lNumCols);   
        //定义处理每行时要用到的变量   
        Range     objRange_curLine;   
        VARIANT   ret_curLine;   
        //获得本行的行数和列数   
        long   lNumRows_curLine;   
        long   lNumCols_curLine;   
    
        //Display   the   elements   in   the   SAFEARRAY.   
        long        index[2];   
        VARIANT     val;   
        int         r;
        int         c; 

解决方案 »

  1.   

    //按行处理   
            for(r=1; r<=lNumRows; r++)   
            {    
                //写入记录开始符号   
                fprintf(fp,"%s",RecFlag);???????????   
                fprintf(fp,"\n");   
        
                CString     contents;   
                bool        bEmpty = true;   
                CString     sText, sType, sTemp;   
                CString     sTitle;   
                bool        bText;   
                int         nCount   =   RecNames.GetSize();????????????   
                CString     sRecName;               for (int i=0; i<nCount; i++)   
                {   
                    //写入字段名   
                    if(fp)
                    {   
                       fprintf(fp, "<%s>=", RecNames[i]); ??????????  
                    }                   CString   contents;   
                    for(int   k=0; k < RecContents[i].GetSize(); k++)?????????   
                    {   
                        sType   =   RecContents[i][k]; 
                        
                        if   (CCELTools::IsFieldName(sType))   //不是字段名??????????   
                        {   
                            sType   =   sType.Mid(1, sType.GetLength()-2);   
                            //sRecName   =   RecNames[i];         //例如 sType="AC"   
                            int   len   =   sType.GetLength();                 //   len=2   
                            char   tail;   
                            tail   =   sType.GetAt(len-1);       // tail='C'   
                            char   tmp[8];   
                            CString   start=sType.GetAt(0);      //  start = "AC"   
                            itoa(r,tmp,10);             //   例如   r = 12   
                            start += tmp;                 //   start="AC12"   
                            CString   end=sType;   
                            end.SetAt(len-1,tail+1);                         //   end="AD"   
                            end += tmp;               //   end="AD12"   
        
                            objRange_curLine   =   objSheet.GetRange(COleVariant(start),   COleVariant(end));   
                            ret_curLine   =   objRange_curLine.GetValue(); 
                            
                            if(ret_curLine.vt   ==   VT_EMPTY)   
                            {
                                continue;
                            }
                            //Create   the   SAFEARRAY   from   the   VARIANT   ret.   
                            COleSafeArray   sa_curLine(ret_curLine);   
        
                            //Determine   the   array's   dimensions.   
                            //获得指定的区域   
                            sa_curLine.GetUBound(1,   &lNumRows_curLine);   
                            sa_curLine.GetUBound(2,   &lNumCols_curLine);   
                            //开始取出选中的区域的内容   
                            long   index[2];   
                            VARIANT   val;   
                            int   rr,   cc;   
                            for(rr=1; rr<=lNumRows_curLine; rr++)   
                            {   
                                 bool   bEmpty=true; 
                                 
                                 for(cc=1; cc<lNumCols_curLine; cc++)//注意不要用cc<=lNumCols_curLine   
                                 {   
                                      index[0] = rr;   
                                      index[1] = cc;   
                                      sa_curLine.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_R4://VT_UI4://unsigned   long   
                                          {   
                                              unsigned   long   value=val.ulVal;//.fltVal;//.ulVal;   
                                              char   buffer[30];   
                                              _ui64toa(value,buffer, 10);   
                                              contents+=buffer;   
                                              bEmpty=false;   
                                              contents+="         ";//tab   
                                              break;   
                                          }   
                                          case   VT_R8://数字   
                                          {   
                                              //fprintf(fp,"%1.2f",val.dblVal);   
                                              float   value=val.dblVal;   
                                              char   buffer[20];   
                                              //_ui64toa(value,buffer,10);   
                                              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; 
                                          
                                              //contents+=(CString)value;   
                                              bEmpty=false;   
                                              //if(1==cc)   Ar=contents.GetLength();   
                                              contents+="         ";//tab   
                                              break;   
                                          }   
                                          case   VT_BSTR://文字   
                                          {   
                                              contents+=(CString)val.bstrVal;   
                                              //if(1==cc)   Ar=contents.GetLength();   
                                              contents+="         ";//tab   
                                              bEmpty=false;   
                                              break;   
                                          }   
                                          default:   break;   
                                      }//end   of   switch   
                                   }//end   of   col   
                                 }   
                                 //结束处理选中的区域内容   
                               }   
                            }   
                if(fp)
                {  
                     fprintf(fp,"%s", contents);   
                     fprintf(fp,"\n");   
                }   
            }//完成一条记录   
         }//结束行的处理   
          //结束处理   
      }//end   of   deal   with   different   sheet. 
      
      if(fp)   
      {
         fclose(fp);
      }
          
       objBook.Close(COleVariant((short)FALSE), VOptional, VOptional);   
       objApp.Quit();
    }