以前用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
分享到:
相关推荐
CSV是最简单且广泛支持的格式,只需将单元格内容用逗号分隔即可。 5. **Blob对象**: 在JavaScript中,可以使用Blob对象来创建二进制大型对象,这可以用于存储即将导出的数据。 6. **URL.createObjectURL**: 这个...
客户端脚本方法主要是通过JavaScript或者VBScript来操作DOM元素,获取表格数据,并利用ActiveX对象(如Excel对象)来创建新的Excel文件并填充数据。这种方法的优点是实现简单,不需要服务器端做过多处理,缺点是对...
1. **客户端JavaScript导出到Excel** 这种方法通过创建一个ActiveXObject来启动Excel应用程序,并与之交互。以下是一个简单的示例: ```javascript function AutomateExcel() { // 创建Excel对象 var oXL = new ...
15.29 用JavaScript导出图像到Excel 15.30 使用VML打造可改变大小的圆框 15.31 JavaScript实现文档结构图 15.32 判断一副图片是否加载完毕 第16章 页面数据的验证 16.1 验证字符串是否全由数字组成 16.2 验证表单项...
### ASP将Table生成Excel(XLS)...这种方法不仅适用于简单的数据导出,还可以根据需求进行扩展,比如增加更多的数据处理逻辑、支持更复杂的表格格式等。对于从事Web开发的技术人员来说,掌握这一技能是非常有价值的。
15.29 用JavaScript导出图像到Excel 15.30 使用VML打造可改变大小的圆框 15.31 JavaScript实现文档结构图 15.32 判断一副图片是否加载完毕 第16章 页面数据的验证 16.1 验证字符串是否全由数字组成 16.2 验证表单项...
最终,它能够将这些有价值的信息导出为Excel格式,便于进一步的数据管理和分析。 在网页信息获取的过程中,首先涉及到的是HTML解析。HTML(HyperText Markup Language)是构成网页的基本语言,包含了各种标签来定义...
在报表与打印的场景下,ASP能够生成复杂的数据报表,包括图表、表格、统计分析等,且支持导出为PDF、Excel等常见格式,方便用户进一步处理或打印。 在第11章中,可能涵盖以下几个关键知识点: 1. **数据连接与查询...
5. **导出导入**:支持将表格数据导出为常见的格式,如CSV、Excel,也可以导入已有的Excel文件。 6. **数据过滤与排序**:提供筛选和排序功能,帮助用户快速查找和整理数据。 7. **图表制作**:根据表格数据自动生成...
24. Access中不能将查询结果直接保存为Excel文件,但可以通过导出功能将其转换为Excel格式。 以上就是计算机二级考试中涉及的一些核心知识点,涵盖了网络基础、编程概念、操作系统、数据库管理、Web服务等多个方面...
此外,单元格的合并和拆分、表格数据的导入和导出,以及数据的排序和表格的嵌套是提高网页布局复杂性的关键。通过课堂案例和实际操作,学习者可以深化理解并提高实际应用能力。 第三部分涉及的是ASP服务器端编程,...
6. Word2000段落设置:在Word中,设置行间距的操作是通过“格式”->“段落”来实现的。 7. Windows窗体事件:窗体加载时,首先触发的事件是Load事件。 8. Word表格操作:在Word中,可以插入和删除单元格,所以这个...
表格在布局中起着至关重要的作用,课程涵盖表格的插入、属性设置,以及在表格中输入内容、复制、粘贴、删除和缩放表格,单元格的合并和拆分,数据的导入导出和排序,以及表格的嵌套。 ASP(Active Server Pages)...
24. **查看源代码能学习到**:代码结构、布局特点等,但不包括Script程序,因为源代码中可能包含服务器端脚本。 25. **LOGO的标准尺寸**:88*31 Pixels,常见于网站的横幅广告。 26. **客户机向服务器请求信息的...
1. **IIS服务器安全性管理**:包括但不限于设置访问权限、安装安全更新、限制不必要的服务、启用身份验证、使用SSL证书、定期备份等。 2. **ASP.Net**:ASP.Net是微软的Web应用程序框架,支持C#、Visual Basic.NET...
5. **常量类型说明符**:在某些编程语言中,如VBScript,常量的声明中不能使用等于号(`=`)表示赋值,而是使用`Const`关键字,如`Const A1 = 2000`。 6. **Word工具提示**:在Word中,当鼠标悬停在工具栏按钮上时...