免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 2902|回复: 8
收起左侧

【walkscript】方便快速的导入导出属性——脚本构建Excel数据库

[复制链接]

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
发表于 2012-10-25 12:50 | 显示全部楼层 |阅读模式
    walk脚本中提供了com组件编程技术后,可以很方便的把excel作为数据库,直接使用sql语句,做insert、update、delete等操作。对于大量数据、mdb表到excel表的操作变得非常方便!

CreateSqlConnection()

      com_excel_ado_filesystemObject_1.png

结果如下图所示:
com_excel_ado_filesystemObject_0.png

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
 楼主| 发表于 2012-10-25 12:52 | 显示全部楼层
//创建excel连接对象
//使用后,需要调用者free
wkCom CreateSqlConnection(string strExcelPath, array flds)
{
        //使用Scripting.FileSystemObject判断文件是否存在
        wkCom fs;
        fs.create("Scripting.FileSystemObject");
        bool bExist = fs.FileExists(strExcelPath);
        fs.free();
       
        //不存在,则创建
        if (!bExist)
        {
                wkCom excel;
                //创建Excel组件对象
                excel.create("Excel.Application");
                excel.putProperty("visible", false); //设为不可见
               
                //新建Excel表
                wkCom workBook1 = excel.Workbooks().Add(true);
                //把字段填到表格的第一行中
                wkCom sheets = workBook1.WorkSheets();
                wkCom sheet1 = sheets.Item(1);
                int i = 0;
                for (i = 0; i < flds.getSize(); ++i)
                {
                        sheet1.Cells().Item(1, i+1).putProperty("Value", flds[ i ]); //excel表格下标从1开始,所以i+1
                }
                //保存并关闭
                workBook1.Close(true, strExcelPath, 0);
                //退出
                excel.Quit();
                //别忘记释放新建的Excel对象
                excel.free();
        }
       
        //通过adodb连接
        wkCom conn;
        conn.create("Adodb.Connection");
        conn.putProperty("ConnectionString", "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" + strExcelPath);
        return conn;
}



string GetFlds(array& flds)
{
        string sr;
        for (int ic = 0; ic < flds.getSize(); ++ic)
        {
                if (ic) sr += ",";
                sr += flds[ ic ];
        }
        return sr;
}

void main()
{
        string path = "F:\\atest.xls";
        array flds = {"layerID", "layerName"};
        wkCom conn = CreateSqlConnection(path, flds);
       
        conn.Open();//打开数据库连接
       
        string sql1 = "insert into [Sheet1$](" + GetFlds(flds) + ")";
        string sql;       
        //插入10条记录
        int i = 0;
        for (i = 0; i < 10; ++i)
        {
                string sql2;
                sql2.format("'%d', 'test%d'", i+1, i+1);
                sql = sql1 + " values (" + sql2 + ")";
                //trace("\n" + sql);
                conn.execute(sql);
        }
               
        wkCom rs;
        rs.create("ADODB.RecordSet");
        sql = "select * from [Sheet1$]";
        rs.Open(sql,conn,3,3);
       
        //遍历
        while(!rs.Eof())
        {  
                   string sId = rs.Collect(0);
                string sName = rs.Collect(1);
                trace("LayerId: %s, LayerName: %s\n", sId, sName);
                rs.MoveNext();
        }
        rs.close();        
        conn.close();//关闭数据库连接
       
        rs.free();
        conn.free();       
}




回复 支持 反对

使用道具 举报

7711

主题

31万

铜板

892

好友

超级版主

地信网论坛贵宾

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

积分
128764

宣传勋章优秀斑主灌水勋章活跃勋章贡献勋章童话节勋章

QQ
发表于 2012-10-25 14:00 | 显示全部楼层
谢谢楼主分享,支持了
该会员没有填写今日想说内容.
回复 支持 反对

使用道具 举报

17

主题

5723

铜板

14

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2608
发表于 2012-10-25 16:31 | 显示全部楼层
感谢 楼主 啊
  
回复 支持 反对

使用道具 举报

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
 楼主| 发表于 2012-10-26 09:12 | 显示全部楼层

//创建excel连接对象
//使用后,需要调用者free
wkCom CreateSqlConnection(string strExcelPath, array flds)
{
        //使用Scripting.FileSystemObject判断文件是否存在
        wkCom fs;
        fs.create("Scripting.FileSystemObject");
        bool bExist = fs.FileExists(strExcelPath);
        fs.free();
       
        //不存在,则创建
        if (!bExist)
        {
                wkCom excel;
                //创建Excel组件对象
                excel.create("Excel.Application");
                excel.putProperty("visible", false); //设为不可见
               
                //新建Excel表
                wkCom workBook1 = excel.Workbooks().Add(true);
                //把字段填到表格的第一行中
                wkCom sheets = workBook1.WorkSheets();
                wkCom sheet1 = sheets.Item(1);
                int i = 0;
                for (i = 0; i < flds.getSize(); ++i)
                {
                        sheet1.Cells().Item(1, i+1).putProperty("Value", flds[i]); //excel表格下标从1开始,所以i+1
                }
                //保存并关闭
                workBook1.Close(true, strExcelPath, 0);
                //退出
                excel.Quit();
                //别忘记释放新建的Excel对象
                excel.free();
        }
       
        //通过adodb连接
        wkCom conn;
        conn.create("Adodb.Connection");
        conn.putProperty("ConnectionString", "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" + strExcelPath);
        return conn;
}


回复 支持 反对

使用道具 举报

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
 楼主| 发表于 2012-10-26 09:12 | 显示全部楼层
string GetFlds(array& flds)
{
        string sr;
        for (int ic = 0; ic < flds.getSize(); ++ic)
        {
                if (ic) sr += ",";
                sr += flds[ic];
        }
        return sr;
}

void main()
{
        string path = "F:\\atest.xls";
        array flds = {"layerID", "layerName"};
        wkCom conn = CreateSqlConnection(path, flds);
       
        conn.Open();//打开数据库连接
       
        string sql1 = "insert into [Sheet1$](" + GetFlds(flds) + ")";
        string sql;       
        //插入10条记录
        int i = 0;
        for (i = 0; i < 10; ++i)
        {
                string sql2;
                sql2.format("'%d', 'test%d'", i+1, i+1);
                sql = sql1 + " values (" + sql2 + ")";
                //trace("\n" + sql);
                conn.execute(sql);
        }
               
        wkCom rs;
        rs.create("ADODB.RecordSet");
        sql = "select * from [Sheet1$]";
        rs.Open(sql,conn,3,3);
       
        //遍历
        while(!rs.Eof())
        {  
            string sId = rs.Collect(0);
                string sName = rs.Collect(1);
                trace("LayerId: %s, LayerName: %s\n", sId, sName);
                rs.MoveNext();
        }
        rs.close();        
        conn.close();//关闭数据库连接
       
        rs.free();
        conn.free();       
}

回复 支持 反对

使用道具 举报

27

主题

1856

铜板

2

好友

版主

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
1022
发表于 2012-10-26 10:38 | 显示全部楼层
多谢分享 顺便学习!
回复 支持 反对

使用道具 举报

3

主题

1216

铜板

1

好友

助理工程师

Rank: 5Rank: 5

积分
339
发表于 2013-6-27 14:51 | 显示全部楼层
这个不错!!!
回复 支持 反对

使用道具 举报

头像被屏蔽

0

主题

3258

铜板

0

好友

禁止发言

积分
1892
发表于 2025-1-14 14:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表