在做一个导入导出excel文件的程序,有ADO 的,下载了个刘海涛的《VC中实现Access与Excel类型的互相转换技术》PDF文档学着做,文档有很多问题
求编译好了的源代码,非常感谢~
求编译好了的源代码,非常感谢~
解决方案 »
- GDAL读写图像问题
- 请教:在制作非可视化activex控件时,如何使用SetTimer?急!
- 请问我要自己来画CListView中的CListCtrl该怎么做?
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~对面的高手瞧过来~~~~~~~~~~~~~~~~~~~~~~~
- 在2000、XP刚刚启动时系统要加载个人设置。请问它加载了哪些文件哪?
- 为什么使用capPreview捕捉视频会出现图像丢失,黑色
- 很急的问题!!!ado访问access数据类型问题! 第一个答对全拿100
- 请教怎样通过DcomLaunch启动word等进程?
- 怎样用vc自动生成word文档?
- VC知识库发布最新电子刊物《VC知识库八》欢迎访问。
- 如何在sdk下实现自己的datagrid(有特殊功能)
- 讨论帖:空间换速度的查表法,是否会清空当前的缓存,反而影响速度。
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);
}
}