ACCESS和EXCEL之间的互操作

VC对数据库的操作,通常就是通过ADO、ODBC或DAO方式访问。在最近的工程中,对ADO和ODBC操作数据库有了一定的了解,DAO方式还没有尝试。
下面是通过ODBC访问数据库的操作,ADO方式建立连接时会出现异常。
一、ACCESS->EXCEL
主要思想就是通过CDatabase操作数据库,将ACCESS中的数据读取出来,然后再插入到EXCEL中。代码如下:
//将access数据导入到excel中
void ExportToExcel(CString filename, _RecordsetPtr &resultlist, CWnd *wnd,CString tableName)
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile,sPath;
CString sSql;
_variant_t var;
CString strName,strAge,strWealth;

TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, filename, filename);

// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
// 创建表结构
sSql = "CREATE TABLE TestSheet(姓名 TEXT,分数 TEXT,权值 TEXT)";//"CREATE TABLE Sheet1 (序号 TEXT,原始分数 TEXT,人数 TEXT,以下累加人数 TEXT,RP TEXT,Z TEXT,T=10Z+50 TEXT)";
database.ExecuteSQL(sSql);
// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Wealth");
if(var.vt != VT_NULL)
strWealth = (LPCSTR)_bstr_t(var);

sSql = "INSERT INTO TestSheet(姓名,分数,权值)VALUES ('" + strName +"','" +strAge+"','"+strWealth+"')";
database.ExecuteSQL(sSql);

m_pRecordset->MoveNext();
}
//插入数据
// sSql = "INSERT INTO 名单(姓名,分数,权值)VALUES ('ldj','57','28')";
// database.ExecuteSQL(sSql);
}

// 关闭数据库
database.Close();

// AfxMessageBox("数据保存成功!");
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
AfxMessageBox("Excel驱动没有安装!");
}
END_CATCH_ALL;

}

二、EXCEL->ACCESS
主要思想是通过CSpreadSheet类读取EXCEL数据,然后将数据插入到ACCESS中,代码如下。其中CSpreadSheet类是专门操作EXCEL数据的类。
void CExcelAccessDlg::OnOK() 
{
CString sExcelFile,sPath,filename = ".\\Demo.mdb",sql;
//弹出对话框选择路径
CFileDialog fileDlg(TRUE, NULL, filename,OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, _T("Excel files (*.xls)|*.xls|"),this);
if( fileDlg.DoModal()==IDOK)
{
sExcelFile = fileDlg.GetPathName(); // 要建立的Excel文件
CFileFind finder;
BOOL bWorking = finder.FindFile(sExcelFile);//寻找文件
}
else return;
CSpreadSheet SS(sExcelFile, "TestSheet");

CStringArray Rows, Column;

//清空列表框
m_AccessList.ResetContent();
for (int i = 2; i <= SS.GetTotalRows(); i++)
{
// 读取一行
SS.ReadRow(Rows, i);
CString strName = "" ,strAge = "", strWealth = "";
strName = Rows.GetAt(0);
strAge = Rows.GetAt(1);
strWealth = Rows.GetAt(2);
sql = "INSERT INTO DemoTable(Name,Age,Wealth)VALUES ('" + strName +"','" +strAge+"','"+strWealth+"')";
insertToAcces(sql,filename);
}
Sleep(2 * 1000);
CDialog::OnOK();
}
void CExcelAccessDlg::insertToAcces(CString sql, CString filename)
{
CDatabase database;
CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)"; // Excel安装驱动
CString sExcelFile,sPath;
CString sSql;
CString strName,strAge,strWealth;

TRY
{
// 创建进行存取的字符串
sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, filename, filename);

// 创建数据库 (既Excel表格文件)
if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
{
database.ExecuteSQL(sql);
}

// 关闭数据库
database.Close();

// AfxMessageBox("数据保存成功!");
}
CATCH_ALL(e)
{
TRACE1("Excel驱动没有安装: %s",sDriver);
AfxMessageBox("Excel驱动没有安装!");
}
END_CATCH_ALL;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值