hur.cn - 华软网

 热门搜索

vc2008操作office2003中excel表格,想读取单元格内容,myRange.get_Value();出错

  作者:未知    来源:网络    更新时间:2009/3/27
vs2008对话框
操作office2003
已经import excel.exe
include成功,增加以下:
#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"  成功。

定义以下变量:
CApplication myExcel;
CWorkbook myBook;
CWorkbooks myBooks;
    CWorksheets mySheets;
    CWorksheet mySheet;
    CRange myRange;
    VARIANT ret;

措置惩罚函数中是这样写的,不过编译不过去:

void Cquess_importDlg::OnBnClickedExcelTest()
{
// TODO: 在此增加控件通知措置惩罚程序代码


   // Start Excel and get Application object.

   if(!myExcel.CreateDispatch("Excel.Application"))
   {
      AfxMessageBox("你电脑上装office2003电子表格软件了吗?");
      return;
   }
   else
   {
      //Make the application visible and give the user control of
      //Microsoft Excel.
      myExcel.put_Visible(TRUE);
      myExcel.put_UserControl(TRUE);
   }
   COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  myBooks = myExcel.get_Workbooks();
      myBook = myBooks.Open("C:\\Documents and Settings\\Administrator\\桌面\\book1.xls",
                VOptional, VOptional, VOptional, VOptional,
                VOptional, VOptional, VOptional, VOptional,
                VOptional, VOptional, VOptional, VOptional, VOptional, VOptional);
  mySheets = myBook.get_Worksheets();
  mySheet = mySheets.get_Item(COleVariant((short)1));

      //data and then retrieve the data (as a variant array, ret).
  myRange = mySheet.get_Range(COleVariant("A1"), COleVariant("A8"));
  ret = myRange.get_Value(???????);

      //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);

      //Display the elements in the SAFEARRAY.
      long index[2];
      VARIANT val;
      int r, c;
      TRACE("Contents of SafeArray\n");
      TRACE("=====================\n\t");
      for(c=1;c<=lNumCols;c++)
      {
         TRACE("\t\tCol %d", c);
      }
      TRACE("\n");
      for(r=1;r<=lNumRows;r++)
      {
         TRACE("Row %d", r);
         for(c=1;c<=lNumCols;c++)
         {
            index[0]=r;
            index[1]=c;
            sa.GetElement(index, &val);
            switch(val.vt)
            {
            case VT_R8:
               {
                  TRACE("\t\t%1.2f", val.dblVal);
                  break;
               }
            case VT_BSTR:
               {
                  TRACE("\t\t%s",(CString)val.bstrVal);
                  break;
               }

            case VT_EMPTY:
               {
                  TRACE("\t\t<empty>");
                  break;
               }
            }
         }
         TRACE("\n");
      }

      //Close the workbook without saving changes
      //and quit Microsoft Excel.
      myBook.Close(COleVariant((short)FALSE), VOptional, VOptional);
      myExcel.Quit();

}

已经能够打开表格资料,然则ret = myRange.get_Value(???????);这句编译通不过,提醒:
i:\quess_import_dlg\quess_import\quess_importdlg.cpp(185) : error C2660: “CRange::get_Value”: 函数不接受 0 个参数

查看CRange.h中其定义以下:
VARIANT get_Value(VARIANT& RangeValueDataType)
{
VARIANT result;
static BYTE parms[] = VTS_VARIANT ;
InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, parms, &RangeValueDataType);
return result;
}
请问这个参数是什么?要读出单元格中内容(字符型)的,代码应该怎么写啊!!!
要给资料连接不要给office2002以下的,那里面这个函数定义不同,谢谢。
---华软 网友回答---
推荐看VBA的帮助文档VBAXL10.CHM。 读出来的只是 xlRangeValueDataType数据类型

xlRangeValueDataType 可为以下 xlRangeValueDataType 常量之一。 
xlRangeValueDefault      default 如果指定的 Range 对象为空,则前往值“空”(可用 IsEmpty 函数尝试这类情况)。如果 Range 对象包括多个单元格,则将前往一个值的数组(可用 IsArray 函数尝试这类情况)。 
xlRangeValueMSPersistXML      前往以 XML 格式表示的指定 Range 对象的记录集代表。 
xlRangeValueXMLSpreadsheet      前往以 XML 电子表格格式表示的数值、格式设置、公式和指定 Range 对象的名称。 

---华软网友回复---
发现有:
ret = myRange.get_Value2()
这个参数,能够不要参数。哪有这个类的函数说明?
---华软网友回复---
不太懂,帮顶
---华软网友回复---
get_Value(vtMissing)
---华软网友回复---
 AfxMessageBox("要向表格A1单元格写入一个东西尝试了");
 myRange.put_Value2(COleVariant("First Name"));    // 这句能够写入数据。

 AfxMessageBox("要从表格B3单元格读出点啥?");
 ret=myRange.get_Value(vtMissing);         //读出数据怎么才能取得?比如用AfxMessageBox() 输出单元格里的值(字符串)。
---华软网友回复---
CString str = ret.bstrVal;
AfxMessageBox(str);
---华软网友回复---
顶~~~~~~~~~
---华软网友回复---
谢谢jameshooo 
最后解决:CString shirt="E5";
 myRange = mySheet.get_Range(COleVariant(shirt), COleVariant(shirt));
 ret=myRange.get_Value(vtMissing);

 CString   str1;   
 if (ret.vt!=VT_NULL)   
 str1=(LPCTSTR)(_bstr_t)ret; 
 AfxMessageBox(str1);


---华软网友回复---
thanks a lot      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。