`
codsoul
  • 浏览: 212417 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

vbscript、javascript快速导出Excel,并能任意设置格式,不支持合并单元格

 
阅读更多

以前用Javascript做了个导出函数,但速度很慢,后来采用粘贴的方式,速度提高了不少,
但是,刚开始时很快,到后面越来越慢,是因为占用内存的缘故,占用内存越来越多,速度就越来越慢,
找了一些回收内存的方式,但没有一个奏效的,无奈之下换成用VBScript来实现,因为VBScript有erase

换成用VBSCript后,却也没有变化,一直调试了几天,某天忽然发现导出特别快了,后面和前面一样的快,
跟踪内存,内存一直保持稳定,没有一直飑升,算法优化特别重要,比如一行:t.rows[i].cells[j] ,我把它拆开,避免每次都要从集合里取,速度也提高了一倍,效果图:进度条展示:

 

 

 



'快速导出,不支持合并单元格
isProgressErr = false
pageCount = 150   '每页记录数(一次粘贴一页的数据)。
function vbExportExcelFast(tabId,sTitle,sHeader,arrStrs,hasInput)
    window.event.returnValue = false
    tBegin = Timer()
    set t = document.getElementById(tabId).firstChild
    rows = t.childNodes.length
    cols = t.childNodes(0).childNodes.length
    'on error resume next '容错处理
    set oXL = createObject("Excel.Application")
    if (err.number>0) then
        msgbox("请确认已经安装了Excel并允许运行Excel!")
        exit function
    end if
    oXL.Workbooks.Add
    set obook = oXL.ActiveWorkBook
    set osheets = obook.Worksheets
    set osheet = obook.Sheets(1)
    xlrow = 1
   
    '设置第二列为文本
    if(arrStrs<>"") then
        sStrs = split(arrStrs,",")
        for i=0 to ubound(sStrs)
            nStr = CInt(sStrs(i))
            osheet.Range(osheet.Cells(xlrow, nStr),osheet.Cells(rows+xlrow,nStr)).Select
            oXL.Selection.NumberFormatLocal = "@"
        next
    end if
    '   
    '添加标题
    osheet.Cells(1, 1) = sTitle
    osheet.Range(osheet.Cells(xlrow, 1),osheet.Cells(xlrow,cols)).Select
    oXL.Selection.HorizontalAlignment = 3
    oXL.Selection.MergeCells = true
    xlrow = xlrow + 1
    '添加小标题
    if(sHeader <> "") then
        osheet.Cells(2, 1) = sHeader
        osheet.Range(osheet.Cells(xlrow, 1),osheet.Cells(xlrow,cols)).Select
        oXL.Selection.MergeCells = true
        xlrow = xlrow + 1
    end if
    '进度条
    winX = (screen.width - 300) / 2
    winY = (screen.height - 120) / 2
    set win = window.open("","","directories=0,location=0,memubar=0,scrollbars=0,status=0,toolbar=0,width=230,height=75,left=" + cstr(winX) + ",top=" + cstr(winY))
    sProcess = vbmkProcessTxt(sTitle,rows)
    win.document.write(sProcess)
    set osx = win.document.getElementById("sx")
    set cells = win.document.getElementById("m_pub_wzs_progress_tab").rows(0).cells

    isProgressErr = false
    pages = (rows - (rows mod pageCount)) / pageCount
    if((rows mod pageCount) > 0) then
        pages = pages + 1
    end if
    'dim scs()

    for i = 0 to pages-1
        call vbExportExcelPage(i,cols,rows,osx,cells,t,osheet,xlrow,hasInput)
        call CollectGarbage()       
        xlrow = xlrow + pageCount '不能用pageCount,因为有不满页的情况。
    next
    tEnd = Timer()
    ix = cint(tEnd-tBegin)
    if(not isProgressErr) then
        win.document.getElementById("info").innerText = "导出完毕,正在格式化... (" + cstr(ix) + "秒)"
    end if

    osheet.Range(osheet.Cells(1, 1),osheet.Cells(1,1)).Select '选择第一个单元格列
    osheet.Columns.AutoFit
    for i=1 to xlrow
        osheet.Rows(i).RowHeight = osheet.Rows(i).RowHeight + 6   '自动大小后上下无边距,需要增加高度,要不太挤。
    next   
    if(not isProgressErr) then         '关闭进度条
        win.close()
    end if
      
    oXL.Visible = true
    oXL.UserControl = true
   
    set oXL = nothing
    set obook = nothing
    set osheets = nothing
    set osheet = nothing
end function

function vbExportExcelPage(i,cols,rows,osx,cells,t,osheet,xlrow,hasInput)
        dim scs()
        redim scs(pageCount-1,cols-1)
        'redim scs(pageCount*cols-1)
        for j=0 to pageCount-1
            iRow = i*pageCount+j
            if(iRow >= rows) then
                exit for
            end if
            set tr = t.childNodes(iRow)           
            if(not isProgressErr) then
                'on error resume next
                call vb_progress_show(osx,cells,rows,iRow+1)
                if err.number > 0 then
                    isProgressErr = true
                end if
            end if
            for h=0 to cols-1
                set td = tr.childNodes(h) 't.childNodes(iRow).cells(h)
                s = ""
                if hasInput then
    '                if( (h=colMileage) and (iRow>0) and (iRow<rows-1) )then
                    if(td.hasChildNodes()) then
                        if (lcase(td.firstChild.nodeName)="input") then
                            if (lcase(td.firstChild.type)="text") then
                                s = td.firstChild.value
                    'elseif((h=colWay) and (iRow>0) and (iRow<rows-1)) then
                            elseif (lcase(td.firstChild.type) = "radio") then
                                if (td.firstChild.checked) then
                                    s = "1"
                                else
                                    s = "2"
                                end if
                            end if
                        else
                            s = td.innerText
                        end if
                    else
                        s = td.innerText
                    end if
                else
                    s = td.innerText
                end if
          
                scs(j, h) = s
            next
        next
        osheet.Range(osheet.Cells(xlrow, 1),osheet.Cells(xlrow+pageCount-1,cols)).value = scs
        erase scs
        call CollectGarbage()
end function

function vbmkProcessTxt(sTitle,rows)
    s = "<html><title>" + sTitle + "导出Excel</title><body><div id='m_pub_wzs_progress_x' style='background:white;font-size:9pt;overflow:hidden;padding-top:0;position:absolute;left:10px;top:16px;'>{0}<table id='m_pub_wzs_progress_tab' border=0 cellspacing=1 bgcolor='#CCCCCC' style='border-width:1px;border-style:solid;border-left-color:#333333;border-top-color:#333333;border-right-color:#EEEEEE;border-bottom-color:#EEEEEE;'><tr height=17>"
    dim ss(19)
    for i=0 to 19
        ss(i) = "<td width=16 bgcolor='#CCCCCC'></td>"
    next
    s = s + join(ss,"")
    skeydu = "<img src='../../js/kedu.jpg'>"
    s = replace(s,"{0}",skeydu)
    s = s + "</tr></table><span id='m_pub_wzs_progress_percent' style='font-size:10pt;vertical-align:middle;color:black;font-family:宋体'>总计" + cstr(rows) + "行,已导出<font id='sx' color='#cc0000'></font>行!<br /><font id='info' color='#008800'></font></span></div><br /><br /><br /></body></html>"
    vbmkProcessTxt= s
end function
dim m_progressNum
m_progressNum = 0
function vb_progress_show(osx,pCells,pTotalCount,pCurrCount)
    osx.innerText = cstr(pCurrCount)
    m = Int(pCurrCount / pTotalCount * 20)
    if((m<>m_progressNum) and (m>0)) then
        pCells(m-1).bgColor="#000088"
    end if
    m_progressNum = m
end function

分享到:
评论

相关推荐

    IE下面table导出excel

    CSV是最简单且广泛支持的格式,只需将单元格内容用逗号分隔即可。 5. **Blob对象**: 在JavaScript中,可以使用Blob对象来创建二进制大型对象,这可以用于存储即将导出的数据。 6. **URL.createObjectURL**: 这个...

    asp导出EXCEL

    客户端脚本方法主要是通过JavaScript或者VBScript来操作DOM元素,获取表格数据,并利用ActiveX对象(如Excel对象)来创建新的Excel文件并填充数据。这种方法的优点是实现简单,不需要服务器端做过多处理,缺点是对...

    asp中表格导出到EXCEL的方法[归类].pdf

    1. **客户端JavaScript导出到Excel** 这种方法通过创建一个ActiveXObject来启动Excel应用程序,并与之交互。以下是一个简单的示例: ```javascript function AutomateExcel() { // 创建Excel对象 var oXL = new ...

    程序天下:JavaScript实例自学手册

    15.29 用JavaScript导出图像到Excel 15.30 使用VML打造可改变大小的圆框 15.31 JavaScript实现文档结构图 15.32 判断一副图片是否加载完毕 第16章 页面数据的验证 16.1 验证字符串是否全由数字组成 16.2 验证表单项...

    asp将table生成excel文件(xls)

    ### ASP将Table生成Excel(XLS)...这种方法不仅适用于简单的数据导出,还可以根据需求进行扩展,比如增加更多的数据处理逻辑、支持更复杂的表格格式等。对于从事Web开发的技术人员来说,掌握这一技能是非常有价值的。

    《程序天下:JavaScript实例自学手册》光盘源码

    15.29 用JavaScript导出图像到Excel 15.30 使用VML打造可改变大小的圆框 15.31 JavaScript实现文档结构图 15.32 判断一副图片是否加载完毕 第16章 页面数据的验证 16.1 验证字符串是否全由数字组成 16.2 验证表单项...

    获取网页信息的小工具

    最终,它能够将这些有价值的信息导出为Excel格式,便于进一步的数据管理和分析。 在网页信息获取的过程中,首先涉及到的是HTML解析。HTML(HyperText Markup Language)是构成网页的基本语言,包含了各种标签来定义...

    asp程序开发范例宝典(光盘原码码)

    在报表与打印的场景下,ASP能够生成复杂的数据报表,包括图表、表格、统计分析等,且支持导出为PDF、Excel等常见格式,方便用户进一步处理或打印。 在第11章中,可能涵盖以下几个关键知识点: 1. **数据连接与查询...

    asoft在线表格处理系统

    5. **导出导入**:支持将表格数据导出为常见的格式,如CSV、Excel,也可以导入已有的Excel文件。 6. **数据过滤与排序**:提供筛选和排序功能,帮助用户快速查找和整理数据。 7. **图表制作**:根据表格数据自动生成...

    2021-2022计算机二级等级考试试题及答案No.13049.docx

    24. Access中不能将查询结果直接保存为Excel文件,但可以通过导出功能将其转换为Excel格式。 以上就是计算机二级考试中涉及的一些核心知识点,涵盖了网络基础、编程概念、操作系统、数据库管理、Web服务等多个方面...

    《Dreamweaver-CC实例教程》教学教案.docx

    此外,单元格的合并和拆分、表格数据的导入和导出,以及数据的排序和表格的嵌套是提高网页布局复杂性的关键。通过课堂案例和实际操作,学习者可以深化理解并提高实际应用能力。 第三部分涉及的是ASP服务器端编程,...

    2021-2022计算机二级等级考试试题及答案No.5253.docx

    6. Word2000段落设置:在Word中,设置行间距的操作是通过“格式”-&gt;“段落”来实现的。 7. Windows窗体事件:窗体加载时,首先触发的事件是Load事件。 8. Word表格操作:在Word中,可以插入和删除单元格,所以这个...

    《Dreamweaver-CC实例教程》教学大纲.docx

    表格在布局中起着至关重要的作用,课程涵盖表格的插入、属性设置,以及在表格中输入内容、复制、粘贴、删除和缩放表格,单元格的合并和拆分,数据的导入导出和排序,以及表格的嵌套。 ASP(Active Server Pages)...

    大学网页设计考试(富含答案).docx

    24. **查看源代码能学习到**:代码结构、布局特点等,但不包括Script程序,因为源代码中可能包含服务器端脚本。 25. **LOGO的标准尺寸**:88*31 Pixels,常见于网站的横幅广告。 26. **客户机向服务器请求信息的...

    动态网站开发试题

    1. **IIS服务器安全性管理**:包括但不限于设置访问权限、安装安全更新、限制不必要的服务、启用身份验证、使用SSL证书、定期备份等。 2. **ASP.Net**:ASP.Net是微软的Web应用程序框架,支持C#、Visual Basic.NET...

    2021-2022计算机二级等级考试试题及答案No.15330.docx

    5. **常量类型说明符**:在某些编程语言中,如VBScript,常量的声明中不能使用等于号(`=`)表示赋值,而是使用`Const`关键字,如`Const A1 = 2000`。 6. **Word工具提示**:在Word中,当鼠标悬停在工具栏按钮上时...

Global site tag (gtag.js) - Google Analytics