想用DAO将MDB中的数据导出成XLS格式,该如何做?

sentang 2000-03-12 01:54:00
想用DAO将MDB中的数据导出成XLS格式,在创建DaoTaleDef时用ConnectString,可是
创建后却是个MDB中的Table,ConnectString根本不起作用.作用SetConnect()后,再用
RefreshLink()却出错,Why?
...全文
182 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jackzhu 2000-03-13
  • 打赏
  • 举报
回复
BOOL MdbToXls(LPCSTR lpszSrcName, LPCSTR lpszDestName)
//把MDB文件转换成XLS(Excel 5.0)文件
//lpszSrcName:源文件名, 格式:"drive:\\path\\filename.ext"
//lpszDestName:目标文件名, 格式:"drive:\\path\\filename.ext"
//XLS中的页标=MDB中的表名
{
ASSERT( lpszSrcName && lpszSrcName[0] != 0);
if( !( lpszSrcName && lpszSrcName[0] != 0))
return FALSE;
ASSERT( lpszDestName && lpszDestName[0] != 0);
if( !( lpszDestName && lpszDestName[0] != 0))
return FALSE;

try
{
//1* Open Source Database
CDaoDatabase dbSrc;
dbSrc.Open(lpszSrcName, FALSE, TRUE);
CDaoDatabase dbDest;

//2* Create Connect to Destination Database
CFileStatus Status;
if(CFile::GetStatus(lpszDestName,Status) !=
FALSE)
CFile::Remove(lpszDestName);

dbDest.Open(lpszDestName, FALSE, FALSE, _T("EXCEL 5.0;"));

// Repeat for all Table
for (int nTable = 0; nTable < dbSrc.GetTableDefCount(); nTable++)
{
// Get DaoTableDefInfo
CDaoTableDefInfo info;
dbSrc.GetTableDefInfo(nTable, info);
// Skip System Object and Hiddend Object
if (info.m_lAttributes & (dbSystemObject and dbHiddenObject))
continue;

//3* Create Source Recordset
CDaoRecordset rsSrc(&dbSrc);
rsSrc.Open(dbOpenTable, info.m_strName);

//4* Create Destination DaoTableDef
CDaoTableDef tdfDest(&dbDest);
CString strTableName = ValidTableName(info.m_strName);
tdfDest.Create(strTableName, info.m_lAttributes);
// Create Destination DaoTableDef's Fields
for (int nField = 0; nField < rsSrc.GetFieldCount(); nField++)
{
CDaoFieldInfo finfo;
rsSrc.GetFieldInfo(nField, finfo);
tdfDest.CreateField(finfo.m_strName, finfo.m_nType, finfo.m_lSize);
}
// Append DaoTableDef to Destination Database
tdfDest.Append();
//*4 Close Destination DaoTableDef
tdfDest.Close();

//5* Create Destination Recordset
CDaoRecordset rsDest(&dbDest);
rsDest.Open(dbOpenTable, strTableName);
// Duplacate all records
// if Record Number is more than 16383(16384-1(Field Name))
// the rest records will be cut
for (long i = 0; !rsSrc.IsEOF() && i < 16383; i++)
{
rsDest.AddNew();
for (int nField = 0; nField < rsSrc.GetFieldCount(); nField++)
{
COleVariant var;
var = rsSrc.GetFieldValue(nField);
rsDest.SetFieldValue(nField, var);
}
rsDest.Update();
rsSrc.MoveNext();
}
//*5 Close Destination Recordset
rsDest.Close();

//*3 Close Source Recordset
rsSrc.Close();
}

//*2 Close Destination Database
dbDest.Close();

//*1 Close Source Database
dbSrc.Close();
}
catch( CDaoException* e )
{
// Report Convert Error

int p=e->GetErrorCount();
for(int e1=0;e1<p;e1++){
e->GetErrorInfo(e1);
#ifdef _DEBUG
SayToStatusBar(e->m_pErrorInfo->m_strDescription);
#endif
}
SayToStatusBar("转换"/*MDB 文件到 XLS*/"文件失败!请查是否有相应的ODBC驱动程序");
e->Delete( );
return FALSE;
}

return TRUE;
}

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧