在做一个导入导出excel文件的程序,有ADO 的,下载了个刘海涛的《VC中实现Access与Excel类型的互相转换技术》PDF文档学着做,文档有很多问题
求编译好了的源代码,非常感谢~

解决方案 »

  1.   

    这是自己跟着写了的部分程序:
    void CTestExcelDlg::OnOpenaccess() 
    {
    // TODO: Add your control notification handler code here
    //-------------------连接数据库
    CString DBName;
    //实例化m_pConnection
    m_pConnection.CreateInstance("ADODB.Connection");
    CString m_strConnection;
    //用打开文件对话框来获取我们要连接的
    //数据库文件名以及数据库所在的路径
    CFileDialog dlg(TRUE,".mdb","MyDB.mdb",
    OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
    "Access文件(*.mdb)|*.mdb||",NULL);
    if(dlg.DoModal()==IDCANCEL)
    return;
    else
    //获取*.mdb的路径与名字
    DBName=dlg.GetPathName();
    delete dlg;
    //打开数据库
    try
    {
    m_strConnection.Format
    ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",DBName);
    m_pConnection->Open((_bstr_t)m_strConnection,"","",
    adConnectUnspecified);
    }
    catch(_com_error e)
    {
    AfxMessageBox("数据库连接失败!");
    return;
    }
    //打开表,获取表名,将表名添加到列表框//
    m_listTablename.ResetContent();
    _RecordsetPtr rsTableName=NULL;
    bstr_t bstrTable,bstrTableType;
    CString strTable,strTableType;
    try
    {
    rsTableName=m_pConnection->OpenSchema(adSchemaTables);
    while(!rsTableName->adoEOF)
    {
    bstrTable=(_bstr_t)rsTableName->Fields->Item[L"TABLE_NAME"]->Value;
    bstrTableType=(_bstr_t)rsTableName->Fields->Item[L"TABLE_TYPE"]->Value;
    strTable=bstrTable.copy();//batr_t->CString
    strTableType=bstrTableType.copy();
    //选出我们自己在数据库中建立的表
    if(strTableType=="TABLE")
    //注:Oracle数据库的if应为
    //strTableType=="SYSTEM TABLE"
    m_listTablename.AddString(strTable);
    rsTableName->MoveNext();
    }
    }
    catch(_com_error e)
    {
    AfxMessageBox("读取数据库表出错!");
    }
    if(m_pConnection==NULL)
    return;
    m_listTablename.SetCurSel(1);
    }void CTestExcelDlg::OnSaveasexcel() 
    {
    // TODO: Add your control notification handler code here
    /* int item;
    CString TableName;
    item=m_listTablename.GetCurSel();
    m_listTablename.GetText(item,TableName);
    CString SQLstr;
    _RecordsetPtr m_pRtemp;
    m_pRtemp.CreateInstance("ADODB.Recordset");
    SQLstr.Format("SELECT*FROM%s",TableName);
    m_pRtemp->Open((_variant_t)SQLstr,_variant_t((IDispatch*)m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText);
    FieldsPtr p_fields;
    FieldsPtr p_field;//??FieldsPtr
    p_fields=m_pRtemp->Fields;
    _variant_t var_index;
    _bstr_t bstr_field_name,vCol;
    int countfields;//字段数
    countfields=p_fields->GetCount();
    _Application m_app;
    Range m_range;
    Workbooks m_workbooks;
    _Workbook m_workbook;
    Worksheets m_worksheets;
    _Worksheet m_worksheet;
    LPDISPATCH pDisp;
    LPUNKNOWN punk;
    CLSID clsid;
    TRACE("Entering Excel Load\n");
    BeginWaitCursor();
    if(!m_app.CreateDispatch("Excel.Application"))
    {
    AfxMessageBox("Excel2003 Not found");
    }
    EndWaitCursor();
    LPDISPATCH pRange,pWorkbooks;
    m_app.SetSheetsInNewWorkbook(1);//??
    VERIFY(pWorkbooks=m_app.GetWorkbooks());//??
    m_workbooks.AttachDispatch(pWorkbooks);
    LPDISPATCH pWorkbook=NULL;
    if(m_workbooks.GetCount()==0)
    {
    pWorkbook=m_workbooks.Add();//Add函数为添加的第二个重载函数
    //(去掉函数部分,按EXCEL打开时默认的文件添加工作薄)
    }
    pWnd->BringWindowToTop();
    LPDISPATCH pWorksheets=m_app.GetWorksheets();
    ASSERT(pWorksheets!=NULL);
    m_worksheets.AttachDispatch(pWorksheets);
    LPDISPATCH pWorksheet=m_worksheets.GetItem(COleVariant((short)1));
    m_worksheet.AttachDispatch(pWorksheet);
    //将字段名导出到EXCEL中
    for (short int index=0;index<countfields;index++)
    {
    var_index.vt=VT_I4;
    var_index.IVal=index;
    p_field=p_fields->Item[var_index];
    bstr_field_name=p_field->GetName();
    CString field_name=(LPCSTR)bstr_field_name;
    VERIFY(pRange=m_worksheet.GetCells(COleVariant((long)1),COleVariant((long)(index+1))));
    m_range.AttachDispatch(pRange);
    m_range.SetValue(COleVariant(field_name));
    }//字段内容导出到EXCLE中
    int i=0;
    while(!m_pRtemp->adoEOF)
    {
    for(short int j=0;j<countfields;j++)
    {
    vCol=m_pRtemp->GetCollect((long)j);
    VERIFY(pRange=m_worksheet.GetCells(COleVariant((long)(i+2)),COleVariant((long)(j+1))));
    m_range.AttachDispatch(pRange);
    m_range.SetValue(COleVariant(vCol));
    }
    m_pRtemp->MoveNext();
    i++;
    }
    m_worksheet.SaveAs*("accessdata");//保存
    */
    }void CTestExcelDlg::OnImportexcel() 
    {
    // TODO: Add your control notification handler code here
    //获得Cell集合,记录数据表的行。(记录列方法一样)
    CString fieldn[30],str;
    int rows=0;
    do
    {
    rows=rows+1;
    VERIFY(pRange=m_worksheet.GetCells(COleVariant((long)(1)),COleVariant((long)(rows))));
    m_range.AttachDispatch(pRange);
    COleVariant vaResult=m_rang.GetValue();
    vaResult.ChangeType(VT_BSTR);
    fieldn[cols]=vaResult.bstrVal;
    str=vaResult.bstrVal;
    if(str.IsEmpty())
    break;
    }while(true);
    //建表
    _variant_t RecordAffected;
    CString sql,f;
    CString t="text(50)";
    int j;
    m_TBNameC.GetWindowText(m_TBName);
    sql="create table"+m_TBName+"(";
    j=1;
    for(j=1;j<cols-1;j++)
    {
    f=fieldn[j]+""+t;
    sql=sql+f+",";
    }
    f=fieldn[j]+""+t;
    sql=sql+f+")";
    m_pConnection->Execute((_bstr_t)sql,&RecordAffected,adCmdText);
    //读EXCEL数据,转为CString型添加到Access表中
    COleVariant vaResult1;
    CString CellStr;
    m_range.AttachDispatch(m_worksheet.GetCells(),true);
    vaResult1=m_ra.GetValue2();
    vaResult1.ChangeType(VT_BSTR);
    cellstr=vaResult.bstrVal;
    for(j=2;j<rows;j++)
    {
    sql="insert into"+m_TBName+"value(";
    for(int i=1;i<cols;i++)
    {
    m_ra.AttachDispatch(m_range.GetItem(_variant_t((long)j),_variant_t((long)i)).pdispVal,true);//??pdispVal.true
    vaResult1=m_raGetValue2();
    vaResult1.ChangeType(VT_BSTR);
    cellstr=vaResult.bstrVal;
    sql=sql+""+cellstr+",";
    }
    m_ra.AttachDispatch(m_range.GetItem(_variant_t((long)j),_variant_t((long)i)).pdispVal,true);
    vaResult1=m_ra.GetValue2();
    vaResult1.ChangeType(VT_BSTR);
    cellstr=vaResult.bstrVal;
    sql=sql+""+cellstr+")";
    m_pConnection->Execute((_bstr_t)sql,&RecordAffected.adCmdText);
    }
    }