创建DOM表行,然后插入以提高效率

时间:2019-04-19 04:12:12

标签: javascript dom hta

我正在尝试将某些工作程序从excel转换为HTA,因此与VBA相比,我可以利用浏览器GUI和javascript的速度。不过,我的第一个测试是在HTML中添加表格。但是,执行大约1000行似乎需要大约30秒,考虑到它导致我的HTA浏览器窗口在30秒内没有响应,这似乎要花很多时间。从我在这里的研究看来,我需要进行行创建,然后一次附加所有表,以减少流向DOM的次数。我这样做很麻烦。这是我到目前为止的代码:

function myFunction() {
var today = new Date();
var t0 =  today.getSeconds();
var connection = new ActiveXObject("ADODB.Connection") ;
var table = document.getElementById("myTable");

var connectionstring="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbPATH\\test.accdb;Jet OLEDB:Engine Type=5;Persist Security Info=False;Mode=Share Exclusive;"

connection.Open(connectionstring);
var rs = new ActiveXObject("ADODB.Recordset");

rs.Open("SELECT * FROM TABLE1", connection);
rs.MoveFirst

while(!rs.eof)
{
    var row = table.insertRow(1);

    var cell1 = row.insertCell(0);
    var cell2 = row.insertCell(1);
    var cell3 = row.insertCell(2);
    cell1.innerHTML = rs.fields(1);
    cell2.innerHTML = rs.fields(2);
    cell3.innerHTML = rs.fields(3);
    rs.movenext;
}

rs.close;
connection.close; 
var today2 = new Date();
var t1 =  today2.getSeconds();
alert(t1-t0);
}

*编辑: 我以为我会尝试将代码更新为现在仅追加一次DOM,但我的代码仍然花费了很长时间,使其无法响应,但我认为它要好一些。我知道这不可能是整个循环,因为如果我只循环浏览并且不尝试将任何内容写入屏幕,程序将在不到一秒钟的时间内完成创建htmlSTR变量。所以它的.after太慢了。

function myFunction() {
var today = new Date();
var t0 =  today.getSeconds();
var connection = new ActiveXObject("ADODB.Connection") ;
var table = document.getElementById("myTable");
var htmlSTR;
var connectionstring="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=dbPATH\\test.accdb;Jet OLEDB:Engine Type=5;Persist Security Info=False;Mode=Share Exclusive;"

connection.Open(connectionstring);
var rs = new ActiveXObject("ADODB.Recordset");

rs.Open("SELECT * FROM TABLE1", connection);
rs.MoveFirst

while(!rs.eof)
{
htmlSTR = htmlSTR + '<tr><td>' + rs.fields(1) + '</td>'
    + '<td>' + rs.fields(2) + '</td>'
    + '<td>' + rs.fields(3) + '</td></tr>'
rs.movenext;
}

$('#myTable tr:last').after(htmlSTR);


rs.close;
connection.close; 
var today2 = new Date();
var t1 =  today2.getSeconds();
alert(t1-t0);
}

1 个答案:

答案 0 :(得分:1)

据我了解,实际问题可能是查询而不是DOM操作。

另一种优雅的解决方案是使用GetString,它将完全消除while循环;

recordset.GetString(,,"</td><td>","</td></tr><tr><td>","&nbsp;");