找回密码
 加入
搜索
查看: 25995|回复: 13

[效率算法] 【已解决】如何提高从listview导出到excel的效率

[复制链接]
发表于 2013-10-3 15:09:10 | 显示全部楼层 |阅读模式
本帖最后由 flysky1222 于 2013-10-5 13:47 编辑

我写了一段从listview导出到excel的代码,测试了一下发觉效率实在是很低,在论坛了查了一下有人提出来说用复制剪贴板的速度很快,又有人说直接读成二维数组再写入速度很快。,但是我照着方法试验了很久都没能成,不知道哪位能给在下指点一下。
最好是能给在下写一个列子
listview内容如:
订单编号   商品名称   收货人姓名   省份   地级市   收货地址             联系电话              联系手机
10000       大米       张三        湖北省  武汉市   站前路209号   027-00000000             13898281111
10000       大米       李四        湖北省  武汉市   站前路208号   027-00000000             13898281111
                Local $excnum = _GUICtrlListView_GetItemCount($ListView1),$y,$x
                If $excnum = 0 Then
                MsgBox(64, "提示", "没有记录可被输出.")
                Else
                Local $oExcel = _ExcelBookNew(1)
                For $y = 0 To $excnum
                        $excret = _GUICtrlListView_GetItemTextString($ListView1, $y)
                        $excarray = StringSplit($excret, "|")
                        $oExcel.workbooks(1).activesheet.cells.numberformatlocal="@"
                                For $x = 0 To $excarray[0]
                                        _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, $excarray[$x], $y + 2, $x)
                                Next
                        Next
                EndIf
发表于 2013-10-4 12:37:46 | 显示全部楼层
Local $oExcel, $2Array = "你的二维数组"
        Local $iSubMax = UBound($2Array, 1)
        Local $iUBound = UBound($2Array, 2)

        $oExcel = ObjCreate("Excel.Application")
        $oExcel.WorkBooks.Add
        $oExcel.activesheet.range("a1").resize($iSubMax,$iUBound).value = $2Array
        $oExcel.Visible = True
 楼主| 发表于 2013-10-5 13:39:06 | 显示全部楼层
本帖最后由 flysky1222 于 2013-10-5 13:43 编辑

谢谢楼上的兄台指点,但是我试过了感觉效率还是不高,最后我还是选择把listview中的数组转换为带TAB和换行格式的字符串,然后调用剪切板复制粘贴到excel中。
我测试了一下这样的效率是否比一行一行的写数据要高很多,顺便把我的方法贴出来,供大家参考一下。免得以后还有人像我一样走弯路。
                                        Local $oExcel = _ExcelBookNew(0)
                                        For $y = 0 To $excnum
                                                $excret = _GUICtrlListView_GetItemTextString($ListView1, $y)
                                                $excarray = StringSplit($excret, "|")
                                                For $x = 1 To $excarray[0]
                                                        $text = $text & $excarray[$x] &@TAB
                                                Next
                                                $text = $text&@CRLF
                                                Next
                                                        _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)
                                        With $oExcel.activesheet
                                        ClipPut('')
                                        ClipPut($text)
                                        .paste(.range("a2"))
                                        EndWith
                                        _ExcelBookSaveAs($oExcel,@ScriptDir & "" &@YEAR&@MON&@MDAY&@HOUR&@MIN&@SEC, "xls", 0, 1)
                                        _ExcelBookClose($oExcel)
发表于 2013-10-8 13:29:08 | 显示全部楼层
发表于 2013-10-9 11:24:15 | 显示全部楼层
我以前都是LISTVIEW读取出来后直接保存为csv文本,然后再调用EXCEL把csv转换成XLS!
 楼主| 发表于 2013-10-10 08:05:12 | 显示全部楼层
我以前都是LISTVIEW读取出来后直接保存为csv文本,然后再调用EXCEL把csv转换成XLS!
benkel 发表于 2013-10-9 11:24

AU3可以直接LISTVIEW读取出来后直接保存为csv文本吗?用的是什么方法,可否交流一下。
发表于 2013-10-10 14:51:07 | 显示全部楼层
回复 6# flysky1222
N久前写的UDF,你试试吧
Func Listview2XLS($_listview,$_XLS)
        Local $iSeparatorChar = Opt('GUIDataSeparatorChar')
        Opt('GUIDataSeparatorChar',",")
        FileDelete(@TempDir & "\tmp.csv")
        FileWrite(@TempDir & "\tmp.csv",_GUICtrlListView_GetColumntxt($_listview) & @CRLF)
        Local $items = _GUICtrlListView_GetItemCount($_listview)
        ConsoleWrite($items & @CRLF)
        For $x = 0 To $items -1
                FileWrite(@TempDir & "\tmp.csv",_GUICtrlListView_GetItemTextString($_listview,$x) & @CRLF)
        Next
        $oExcel = ObjCreate("Excel.Application")
        $oExcel.Visible = 0
        $oExcel.WorkBooks.Open(@TempDir & "\tmp.csv",Default,False)
        $oExcel.Cells.Select
        $oExcel.Selection.Columns.AutoFit
        $oExcel.Range("a1").Select
        $oExcel.ActiveWorkBook.Save
        $oExcel.ActiveWorkBook.SaveAs($_XLS,-4143, Default, Default, Default, Default,1,2)
        $oExcel.Quit
        FileDelete(@TempDir & "\tmp.csv")
        Opt('GUIDataSeparatorChar',$iSeparatorChar)
EndFunc
发表于 2013-12-11 16:29:59 | 显示全部楼层
不错,做个记号以后使用
发表于 2014-1-8 21:20:45 | 显示全部楼层
刚试了,很有用,谢谢
发表于 2014-1-11 09:36:07 | 显示全部楼层
标记一下,后续研究
发表于 2014-6-14 14:32:13 | 显示全部楼层
试试效率怎么样
发表于 2014-7-10 13:54:15 | 显示全部楼层
支持一下支持一下
发表于 2014-7-31 21:43:09 | 显示全部楼层
谢谢,先试一下
发表于 2015-6-12 14:46:53 | 显示全部楼层
感谢,感谢,学习了,非常感谢。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 09:00 , Processed in 0.083490 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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