以下函数是将数据写入到EXCEL文件.可是只是个试例.我想将我的数据.逐行逐行写入
到EXCEL文件中.不知道如果改写下列代码.
里面的类型看了好晕啊.请指导.
void CTestDoc::OnExportExcel()
    
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
// 初始化COM库
 CoInitialize(NULL); // 获得EXCEL的CLSID
 CLSID clsid;
 HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid); if(FAILED(hr)) {
AfxMessageBox(_T("CLSIDFromProgID() 函数调用失败!"));
  return;
 } // 创建实例
 IDispatch *pXlApp;
 hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
 if(FAILED(hr)) {
  AfxMessageBox(_T("请检查是否已经安装EXCEL!"));
  return ;
 }
 
 // 显示,将Application.Visible属性置0
 VARIANT x;
 x.vt = VT_I4;
 x.lVal = 0;
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x); // 获取Workbooks集合
 IDispatch *pXlBooks;
 {
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
 pXlBooks = result.pdispVal;
 }
 
 // 调用Workbooks.Add()方法,创建一个新的Workbook
 IDispatch *pXlBook;
 {
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
 pXlBook = result.pdispVal;
 }
 
 // 创建一个15x15的数组,用于填充表格
 VARIANT arr;
 WCHAR szTmp[32];
 arr.vt = VT_ARRAY | VT_VARIANT;
 SAFEARRAYBOUND sab[2];
 sab[0].lLbound = 1; sab[0].cElements = 15;
 sab[1].lLbound = 1; sab[1].cElements = 15;
 arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab); // 初始化数组内容
 for(int i=1; i<=15; i++) {
  for(int j=1; j<=15; j++) {
   VARIANT tmp;
   tmp.vt = VT_BSTR;
   wsprintfW(szTmp,L"%i,%i",i,j);
   tmp.bstrVal = SysAllocString(szTmp);
   // 添加数据到数组中
   long indices[] = {i,j};
   SafeArrayPutElement(arr.parray, indices, (void *)&tmp);
  }
 }
 
 // 从Application.ActiveSheet属性获得Worksheet对象
 IDispatch *pXlSheet;
 {
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
 pXlSheet = result.pdispVal;
 } // 选择一个15x15大小的Range
 IDispatch *pXlRange;
 {
 VARIANT parm;
 parm.vt = VT_BSTR;
 parm.bstrVal = ::SysAllocString(L"A1:O15"); VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
 VariantClear(&parm); pXlRange = result.pdispVal;
 } //AfxMessageBox(_T("我要填充数据了哈!")); // 用我们的数组填充这个Range
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
 pXlRange->Release(); // 另外再选择一个Range
 {
 VARIANT parm;
 parm.vt = VT_BSTR;
 parm.bstrVal = ::SysAllocString(L"A11:O25");
  
 VARIANT result;
 VariantInit(&result);
 AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
 VariantClear(&parm);
  
 pXlRange = result.pdispVal;
 }
 
//AfxMessageBox(_T( "我还要填充一次哈!")); // 用我们的数组再次填充这个Range
 AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);//AfxMessageBox(_T("好了,我们该保存文件了!")); // 接下来我们该保存文件了,利用Worksheet.SaveAs()方法(我这里忽略了其他所有参数,除了文件名)
 {
 VARIANT filename;
 filename.vt = VT_BSTR;
 CString strPath;
        TCHAR szFull[_MAX_PATH];
        TCHAR szDrive[_MAX_DRIVE];
        TCHAR szDir[_MAX_DIR];
        ::GetModuleFileName(NULL, szFull, sizeof(szFull)/sizeof(TCHAR));
        _tsplitpath(szFull, szDrive, szDir, NULL, NULL);
        _tcscpy(szFull, szDrive);
        _tcscat(szFull, szDir);
        strPath = CString(szFull);        strPath+="test.xls";
USES_CONVERSION;  filename.bstrVal = SysAllocString(T2COLE(strPath));
 AutoWrap(DISPATCH_METHOD, NULL, pXlSheet, L"SaveAs", 1, filename);
 }// AfxMessageBox(_T( "哈哈,收工了!")); // 退出,调用Application.Quit()方法
 AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
 
 // 释放所有的接口以及变量
 pXlRange->Release();
 pXlSheet->Release();
 pXlBook->Release();
 pXlBooks->Release();
 pXlApp->Release();
 VariantClear(&arr);
 
 // 注销COM库
 CoUninitialize();
}

解决方案 »

  1.   

    你把“//  选择一个15x15大小的Range ”下面的代码改成你需要的范围就可以了,也可以是一行,SysAllocString(L"A11:O25"); 的参数代表的就是Excel里面的单元格范围。另外,Excel编程可以用VC的向导导入Excel的类库,更加方便。
      

  2.   

    Excel编程可以用VC的向导导入Excel的类库,更加方便?
    如何处理??
    还有如何输出到WORD。
    能否给个实例代码参考下。
    多谢!
      

  3.   

    用COM接口读写Excel太麻烦了,不如直接用数据库的方式操作,速度比这个快很多哦,代码也比这个简单多了。
      

  4.   

    操作EXCEL有三种方式:
    1 COM
    2 ODBC
    3 TEXT如果你对所操作的EXCEL文件没有格式和样式要求,也不是多SHEET的,那么建议你直接使用文本操作的方式,即按照每行由回车分割,每格由'\t'分割,最后将文件存成*.xls即可。
      

  5.   

    直接写文本进excel的还是比较少的,ODBC可能比较多点吧.
      

  6.   

    这是将查出的数据导入到excel 的方法。可以在数据库里边执行INSERT INTO
    OPENDATASOURCE('Microsoft.JET.OLEDB.4.0','Extended Properties=Excel 8.0;Data source=d:\2010分单明细.xls')...[测试]
    select top 10  UserID, UserName, PassWord, EmployeeID, PassWordType, PassWordTerm, PassWordLeastLengh, convert(varchar(20),PWDLastUpdateTime,120), PhotoURL, 
                          Status, LonginStatus, convert(varchar(20),LastLonginActive,120), SysFlag, UserType, convert(varchar(20),LastFlushTime,120), SessionID, LoginCode, LoginIp, RegTime, Reg_AipPower, UserPy,  LastLonginIP
     from users
      

  7.   

    INSERT INTO
    OPENDATASOURCE('Microsoft.JET.OLEDB.4.0','Extended Properties=Excel 8.0;Data source=d:\2010分单明细.xls')...[测试]
    select top 10  UserID, UserName, PassWord, EmployeeID, PassWordType, PassWordTerm, PassWordLeastLengh, convert(varchar(20),PWDLastUpdateTime,120), PhotoURL, 
                          Status, LonginStatus, convert(varchar(20),LastLonginActive,120), SysFlag, UserType, convert(varchar(20),LastFlushTime,120), SessionID, LoginCode, LoginIp, RegTime, Reg_AipPower, UserPy,  LastLonginIP
     from users