16,548
社区成员




void CExcelTestADODlg::OnBnClickedOk()
{
_ConnectionPtr m_pConnection = NULL;
_RecordsetPtr m_pRecordset = NULL;
CString m_SinFile;
CString m_TableName;
long lFiledCount = 0;
long lRowCount = 0; // 表的记录数目,不包括表格的表头行
CoInitialize(NULL);
CFileDialog dlg(TRUE,_T(".xls"),NULL,OFN_OVERWRITEPROMPT,_T("Excel2003 Files (*.xls)|*.xls|Excel2007 Files (*.xlsx)|*.xlsx||"),NULL,NULL);
if(dlg.DoModal()==IDOK)
{
BeginWaitCursor();
CString FileExt=dlg.GetFileExt();
m_SinFile=dlg.GetPathName();
m_pConnection.CreateInstance("ADODB.Connection");
m_pRecordset.CreateInstance("ADODB.Connection");
CString adoinfo;
if(FileExt=="xlsx")
adoinfo.Format(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties=Excel 12.0"),m_SinFile);
else
adoinfo.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties=Excel 8.0"),m_SinFile);
try
{
//打开excel文件
m_pConnection->Open((_bstr_t)adoinfo,"","",adModeUnknown);
////读取表名
//_RecordsetPtr pRstSchema = NULL;
//pRstSchema = m_pConnection->OpenSchema(adSchemaTables);
//_bstr_t table_name;
//// 循环读取excel文件中的所有表的名字
//while(!pRstSchema->adoEOF)
//{
// table_name = pRstSchema->Fields->GetItem("TABLE_NAME")->Value;
// m_TableName=(LPCSTR)table_name;
// pRstSchema->MoveNext();
//}
//pRstSchema->Close();
//pRstSchema.Release();
//pRstSchema=NULL;
////打开表
//char conntchar[150];
//sprintf(conntchar,"SELECT * FROM [yueanzhi$]",m_TableName);//(LPCSTR)m_TableName.GetBuffer()
//_bstr_t sqltext(conntchar);
_RecordsetPtr pRecordset;
pRecordset.CreateInstance (__uuidof(Recordset));
try
{
// [Feature$]代表Excel表格的某个工作表的名称
pRecordset->Open("SELECT * FROM [Feature$]", // 查询DemoTable表中所有字段
m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenStatic,//adOpenDynamic,adOpenKeyset
adLockOptimistic,
adCmdText);
//得到字段数目
lFiledCount = pRecordset->GetFields()->GetCount();
//得到记录条数
lRowCount = pRecordset->GetRecordCount();
//获取字段名
_bstr_t *filedName = new _bstr_t[lFiledCount]; // 存储字段名
for (int filedIndex = 0;filedIndex < lFiledCount;filedIndex++)
{
filedName[filedIndex] = pRecordset->GetFields()->GetItem(_variant_t(long(filedIndex)))->GetName();
}
//Suffiled=pRecordset->GetFields()->GetItem(_variant_t(long(0)))->GetName();//GetItem(_variant_t(0));
//XCorfiled=pRecordset->GetFields()->GetItem(_variant_t(long(1)))->GetName();
//YCorfiled=pRecordset->GetFields()->GetItem(_variant_t(long(2)))->GetName();
//Elevfiled=pRecordset->GetFields()->GetItem(_variant_t(long(3)))->GetName();
long lRowIndex = 0;
float *fFeatureData = new float[lFiledCount*lRowCount]; // 存储表格中的所有数据
pRecordset->MoveFirst();
while(!pRecordset->adoEOF)
{
for (int filedIndex = 0;filedIndex < lFiledCount;filedIndex++)
{
// 按行,然后对每条数据的各个字段进行存储
fFeatureData[lRowIndex*lFiledCount+filedIndex] = pRecordset->GetFields()->GetItem(_variant_t(filedName[filedIndex]))->Value;
}
//revNum=pRecordset->GetFields()->GetItem(_variant_t(Suffiled))->Value;
//x=pRecordset->GetFields()->GetItem(_variant_t(XCorfiled))->Value;
//y=pRecordset->GetFields()->GetItem(_variant_t(YCorfiled))->Value;
//Elev=pRecordset->GetFields()->GetItem(_variant_t(Elevfiled))->Value;
pRecordset->MoveNext();
lRowIndex++;
}
pRecordset->Close();
pRecordset.Release();
pRecordset = NULL;
if (filedName != NULL)
{
delete []filedName;
filedName = NULL;
}
if (fFeatureData != NULL)
{
delete []fFeatureData;
fFeatureData = NULL;
}
}
catch(_com_error e)
{
EndWaitCursor();
AfxMessageBox(e.Description());
}
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
EndWaitCursor();
return;
}
}
}