这个程序就是把Excel当作一个数据库,使用sql语句进行操作。这个程序通用性不强,不能够处理任意的Excel文件,大概是因为把Excel文件当成数据库,对于文件格式要求的比较严格。
程序参考自:http://www.programfan.com/club/showtxt.asp?id=252948
环境是:VC6.0 + Excel2003
过程如下:
用支持MFC的控制台程序来做个简单的实验。
首先,要在stdafx.h头文件中引入ODBC的头文件:
#include <afxdb.h>
#include <odbcinst.h>
然后,写函数。生成一个demo.xls文件,并插入数据,然后从demo.xls中读取数据,将call price前面几行求和,结果写到call price后面单元格内。
void CalculateExcel()
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile = "demo.xls";
TRY
{
// 创建进行存取的字符串
CString strSql;
strSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s",sDriver, sExcelFile, sExcelFile);
// 创建数据库 (即Excel表格文件)
if(!database.OpenEx(strSql,CDatabase::noOdbcDialog))
{
printf("Excel表格打开失败\n");
return;
}
// 创建表,并插入值
strSql = "create table demo(A char(20), B double)";
database.ExecuteSQL(strSql);
strSql = "insert into demo(A, B) values('asd', 23)";
database.ExecuteSQL(strSql);
strSql = "insert into demo(A, B) values('sfs', 564.2)";
database.ExecuteSQL(strSql);
strSql = "insert into demo(A, B) values('asfe', 42)";
database.ExecuteSQL(strSql);
strSql = "insert into demo(A) values('call price')"; // call price 计算结果写到它后面
database.ExecuteSQL(strSql);
// 读取所有的值,并将前三项数据求和,将结果写入到call price后面的单元格中
CRecordset rs(&database);
// 设置读取的查询语句
strSql = "SELECT * FROM demo";
// 执行查询语句
rs.Open(CRecordset::forwardOnly, strSql);
printf("begin……\n");
// 获取查询结果,并计算
CString strValue1, strValue2;
float sum = 0.0f;
while (!rs.IsEOF())
{
//读取Excel内部数值
rs.GetFieldValue("A", strValue1);
rs.GetFieldValue("B", strValue2);
if (strValue1 != "call price")
{
sum += atof(strValue2);
printf("%s\t\t%s\n", strValue1, strValue2);
}
// 移到下一行
rs.MoveNext();
}
rs.Close();
// 插入数值
strValue2.Format("%.2f", sum);
strSql = "UPDATE demo SET B='" + strValue2 + "' WHERE A='call price'";
database.ExecuteSQL(strSql);
printf("\nthe result:\n%s\t%s\n", strValue1, strValue2);
printf("\nupdate file end!\n\n");
// 关闭数据库
database.Close();
}
CATCH_ALL(e)
{
printf("Excel驱动没有安装: %s\n", sDriver);
}
END_CATCH_ALL;
}
程序执行结果如下图:
控制台上:
创建了Excel表格,并将结果写入: