您的位置:首页 > 数据库

vc 通过ODBC 方式操作EXCEL

2011-11-25 09:40 441 查看
 天一个朋友让帮忙写段程序,关于VC操作Excel的,还挺着急。我没做过这个,网上查吧,讲解的倒是不少,不过比较乱,整了两个多小时才弄出来。基于ODBC的,程序有bug,不过为了应付差事,先交了。
这个程序就是把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表格,并将结果写入:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息