找回密码
 加入
搜索
查看: 2187|回复: 8

[网络通信] [已解決]MDB 匯出 指定表數據 到 xls

  [复制链接]
发表于 2017-12-20 12:09:01 | 显示全部楼层 |阅读模式
本帖最后由 w60711 于 2017-12-26 19:12 编辑

请教一下
我从MDB读取数据,要汇出到xls
以下为代码
但是出现一个问题
只汇出了一笔数据,且是MDB最后一笔
请教如何修改才能汇出MDB指定表全部的数据
感谢
Func SaveWorkerTable();;汇出资料
        $MyDocsFolder = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
        $FileSavePath = FileSaveDialog("选择储存位置", $MyDocsFolder, "Excel档 (*.xls)|所有档 (*.*)" , 2 + 16 , "人员资料_"&@YEAR&@MON&@MDAY&'-'&@HOUR&@MIN&@SEC)

        $addfld = ObjCreate("ADODB.Connection")
        $addfld.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $DBName & ";Jet Oledb:Database Password="&$mdb_data_pwd)
        $RS =ObjCreate("ADODB.Recordset")
        $RS.ActiveConnection = $addfld
        $RS.Open ("Select * From " & $DBEnterpriseTable )

        Local $oExcel = _ExcelBookNew(0);;Create new book, make it visible

        ; Write something into cell
        _ExcelWriteCell($oExcel,'索引号',1,1)
        _ExcelWriteCell($oExcel,'统一编号',1,2)
        _ExcelWriteCell($oExcel,'厂商名称',1,3)
        _ExcelWriteCell($oExcel,'人员姓名',1,4)
        _ExcelWriteCell($oExcel,'市话',1,5)
        _ExcelWriteCell($oExcel,'传真',1,6)
        _ExcelWriteCell($oExcel,'手机',1,7)
        _ExcelWriteCell($oExcel,'地址',1,8)
        _ExcelWriteCell($oExcel,'备注事项',1,9)

        while Not $RS.eof And Not $RS.bof
                if @error =1 Then ExitLoop
                $i = 1
                $n = $i + 1
                _ExcelWriteCell($oExcel,$RS.Fields(0).value,$n,1)
                _ExcelWriteCell($oExcel,$RS.Fields(1).value,$n,2)
                _ExcelWriteCell($oExcel,$RS.Fields(2).value,$n,3)
                _ExcelWriteCell($oExcel,$RS.Fields(3).value,$n,4)
                _ExcelWriteCell($oExcel,$RS.Fields (4).value&"-"& $RS.Fields (5).value&"-"& $RS.Fields (6).value&"#"& $RS.Fields (7).value,$n,5)
                _ExcelWriteCell($oExcel,$RS.Fields (8).value&"-"& $RS.Fields (9).value&"-"& $RS.Fields (10).value,$n,6)
                _ExcelWriteCell($oExcel,$RS.Fields (11).value&"-"& $RS.Fields (12).value&"-"& $RS.Fields (13).value&"#"& $RS.Fields (7).value,$n,7)
                _ExcelWriteCell($oExcel,$RS.Fields(14).value,$n,8)
                _ExcelWriteCell($oExcel,$RS.Fields(15).value,$n,9)
                $rs.movenext
        WEnd
        $rs.close
        $addfld.Close

        _ExcelBookSaveAs($oExcel,$FileSavePath,'xls',0,1)
        _ExcelBookClose($oExcel)

        MsgBox (64,"完成","已成功储存档案!" & @CRLF & @CRLF & "档案路径为:" & $FileSavePath)
        Return
EndFunc
发表于 2017-12-20 13:09:23 | 显示全部楼层
回复 1# w60711
AutoIt3\autoit3.exe用的是什么版本?
发表于 2017-12-20 13:30:06 | 显示全部楼层
本帖最后由 chzj589 于 2017-12-20 13:56 编辑

回复 1# w60711
这样试试:

Func SaveWorkerTable();;汇出资料
        $MyDocsFolder = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
        $FileSavePath = FileSaveDialog("选择储存位置", $MyDocsFolder, "Excel档 (*.xls)|所有档 (*.*)" , 2 + 16 , "人员资料_"&@YEAR&@MON&@MDAY&'-'&@HOUR&@MIN&@SEC)

        $addfld = ObjCreate("ADODB.Connection")
        $addfld.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $DBName & ";Jet Oledb:Database Password="&$mdb_data_pwd)
        $RS =ObjCreate("ADODB.Recordset")
        $RS.ActiveConnection = $addfld
        $RS.Open ("Select * From " & $DBEnterpriseTable )

        Local $oExcel = _ExcelBookNew(1);;Create new book, make it visible
            $L = "|||||报表|||||"
            $L1 = '索引号|统一编号|厂商名称|人员姓名|市话|传真|手机|地址|备注事项'
            Local $htesta = StringSplit($L, '|') 
            Local $htest = StringSplit($L1, '|') 
            $oExcel.activesheet.cells(1, 5).value = $htesta[6];.name
            For $id = 0 To $htest[0]
                    $oExcel.activesheet.cells(2, $id).Value = $htest[$id]
            Next

            $oExcel.activesheet.cells(3, 1).CopyFromRecordset($RS)
            $RS.close
            $addfld.Close
        MsgBox (64,"完成","已成功储存档案!" & @CRLF & @CRLF & "档案路径为:" & $FileSavePath)
        Return
EndFunc

评分

参与人数 1金钱 +10 收起 理由
w60711 + 10 感謝,可以用,但這方法導出後格式不合需求 ...

查看全部评分

发表于 2017-12-21 16:38:37 | 显示全部楼层
循环有问题。把$i=1 拿到循环前面去。你是始终往同一行写,覆盖掉了

评分

参与人数 1金钱 +10 收起 理由
w60711 + 10 感谢,除了$i = 1 要拿到循环外,我将$n = ...

查看全部评分

 楼主| 发表于 2017-12-26 19:11:21 | 显示全部楼层
修正後可以用的源碼
Func SaveWorkerTable();;汇出资料
        $MyDocsFolder = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
        $FileSavePath = FileSaveDialog("选择储存位置", $MyDocsFolder, "Excel档 (*.xls)|所有档 (*.*)" , 2 + 16 , "人员资料_"&@YEAR&@MON&@MDAY&'-'&@HOUR&@MIN&@SEC)

        $addfld = ObjCreate("ADODB.Connection")
        $addfld.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $DBName & ";Jet Oledb:Database Password="&$mdb_data_pwd)
        $RS =ObjCreate("ADODB.Recordset")
        $RS.ActiveConnection = $addfld
        $RS.Open ("Select * From " & $DBEnterpriseTable )

        Local $oExcel = _ExcelBookNew(0);;Create new book, make it visible

        ; Write something into cell
        _ExcelWriteCell($oExcel,'索引号',1,1)
        _ExcelWriteCell($oExcel,'统一编号',1,2)
        _ExcelWriteCell($oExcel,'厂商名称',1,3)
        _ExcelWriteCell($oExcel,'人员姓名',1,4)
        _ExcelWriteCell($oExcel,'市话',1,5)
        _ExcelWriteCell($oExcel,'传真',1,6)
        _ExcelWriteCell($oExcel,'手机',1,7)
        _ExcelWriteCell($oExcel,'地址',1,8)
        _ExcelWriteCell($oExcel,'备注事项',1,9)

        Dim $i = 1
        while Not $RS.eof And Not $RS.bof
                $i = $i + 1
                if @error =1 Then ExitLoop
                _ExcelWriteCell($oExcel,$RS.Fields(0).value,$i,1)
                _ExcelWriteCell($oExcel,$RS.Fields(1).value,$i,2)
                _ExcelWriteCell($oExcel,$RS.Fields(2).value,$i,3)
                _ExcelWriteCell($oExcel,$RS.Fields(3).value,$i,4)
                _ExcelWriteCell($oExcel,$RS.Fields(4).value&"-"& $RS.Fields(5).value&"-"& $RS.Fields(6).value&"#"& $RS.Fields(7).value,$i,5)
                _ExcelWriteCell($oExcel,$RS.Fields(8).value&"-"& $RS.Fields(9).value&"-"& $RS.Fields(10).value,$i,6)
                _ExcelWriteCell($oExcel,$RS.Fields(11).value&"-"& $RS.Fields(12).value&"-"& $RS.Fields(13).value&"#"& $RS.Fields(7).value,$i,7)
                _ExcelWriteCell($oExcel,$RS.Fields(14).value,$i,8)
                _ExcelWriteCell($oExcel,$RS.Fields(15).value,$i,9)
                        $rs.movenext
        WEnd
        $rs.close
        $addfld.Close

        _ExcelBookSaveAs($oExcel,$FileSavePath,'xls',0,1)
        _ExcelBookClose($oExcel)

        MsgBox (64,"完成","已成功储存档案!" & @CRLF & @CRLF & "档案路径为:" & $FileSavePath)
        Return
EndFunc
发表于 2017-12-27 10:00:24 | 显示全部楼层
回复 5# w60711
导出的速度如何呢?
我对导出要改变数据库数据的处理方法是:
从ListView列表导出。在3.3.14.2版本上导出速度也很快。
 楼主| 发表于 2018-1-1 14:09:55 | 显示全部楼层
本帖最后由 w60711 于 2018-1-1 14:27 编辑

回复 6# chzj589

我是3.3.14.2
我那个方法
数据大的话效率不佳...
汇出5000多笔而已就花了很长时间

您的方法很快
但有办法汇出后如下面图片一样格式吗?

感谢您

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2018-1-1 17:20:03 | 显示全部楼层
用chzj589 的方法。使用excel的CopyFromRecordset方法速度应当快
发表于 2018-1-1 20:41:30 | 显示全部楼层
本帖最后由 chzj589 于 2018-1-1 20:50 编辑

回复 7# w60711
回答是恳定的,只要你将数据库读取显示在ListView是什么样式,导出就是什么样式。
查看短信
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-24 07:49 , Processed in 0.075238 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表