gpt4 book ai didi

Javascript 到 Excel : bad performance for lack of "range" method

转载 作者:行者123 更新时间:2023-11-30 05:59:32 24 4
gpt4 key购买 nike

考虑到您只使用 Internet Explorer(这在大型企业中很常见),您得出结论,您可以为用户提供将 HTML GridView 转换为 Excel 文件的可能性:此外,您只是认为您有按照用户的要求去做...

我第一次从外部向 Excel 写入表格(或数组)是使用 Visual Basic(.net 的服务器端)。所以我写了一个类来将 VB 二维数组传播到 Excel 工作表中:

1) 我使用的第一种方法乍一看似乎不错,顺便说一下,它非常简单:在行循环中设置列循环,然后将 VB 数组中的每个值写入 Excel 工作表。就这样:

        Dim j, k as Integer
Dim Valeur as String
'let us suppose the VB 2D-array is "Tab(10,20)", containing 11 rows of 21 columns of strings
'let us suppose the upper left corner of the Excel range is line 7, column 3:
For j = 0 to 10
For k = 0 to 20
Valeur = Tab(j, k)
Cells(j + 7, k + 3).Value = valeur
Next
Next

2) 对上述方法进行编程后,我最终意识到,尽管它简单且合乎逻辑,但它是一种糟糕的方法,原因只有一个:它非常慢!所以我找到了一个更好的方法,包括一次写入整个单元格范围:

                Feuil.Range("C7:W17").Value = Tab

第一种和第二种方法有什么区别?好吧,这两种方法都可以正常工作,但是如果你考虑一个 300 行 20 列(或 6000 个单元格)的表格,第一种方法花费的时间约为 1 分钟,而第二种方法只需要半秒!

因此,当谈到 JavaScript 时,我尝试了相同的方法:首先,打开一个 Excel-ActiveX 对象(当然是在 MS-IE 中),它可以访问 Excel 对象模型引用 (http://msdn .microsoft.com/en-us/library/bb149081(v=office.12).aspx) 我可以通过它应用第一种方法,使用名为“ap”的对象中的 CSV 堆栈集:

   // 'ap' is a Javascript object holding a table of CSV strings (natural index: 1..n)
var valCell;
var lim = ap.nbChamps; // 'nbChamps'= number of csv columns in 'ap' object
var curLig = 6; // the datas are written to lines 7 and under
for (var j = 1; j <= ap.nbelem; j++) // ap.nbelem= number of lines in 'ap'
{ // lines loop
curLig += 1;
for (var k = 1; k <= lim; k++) // N.B: 'ap' uses natural index: 1 to n and not 0 to n-1
{ // columns loop
valCell = ap.litEnLC(j, k); // 'ap' method reading column k from line j
classeur.ActiveSheet.Cells(curLig, k + 2 ).value = valCell;
}
}

用了那个方法,我又发现了同样的慢: 于是,我想把第二种方法转成javascript,如下:.首先,向“ap”对象添加一个方法,将 CSV 堆栈转换为 Javascript 二维数组.其次,将此二维数组写入“范围”对象,就像我在 Visual Basic 中所做的那样。所以:

    // 'zone' is the range. For example: zone= "C7:W17"
var biTab = ap.pcttEnTab(); // converts CSV stack into a 2D-array
classeur.ActiveSheet.Range(zone).value = biTab;

而且,正如预期的那样,速度要快得多,但问题是它并没有真正起作用,因为它没有将二维数组的每个值传输到 Excel 范围的相应单元格,它写入了Excel 范围的每个单元格中的整个 Javascript 二维数组!

所以问题是:如何一次将 Javascript 二维数组写入 Excel 范围?

感谢任何能给我答案的人...

顺便说一句,我正在添加 pcttEnTab 方法,以防万一有人可以用该方法很好地解释我的问题:

this.pcttEnTab = function ()    // Array (tableau à 2 dimensions)
{ // convertit la pile PCTT en tableau à 2 dimensions
var j, k, s;
var biTab = new Array();
for (k = 0; k < this.nbelem; k++) // create a columns Array for each line
{
biTab[k] = new Array();
}
for (j = 1; j <= this.nbelem; j++) // lines loop (natural index)
{
for (k = 1; k <= this.nbChamps; k++) // columns loop
{
s = this.litEnLC(j, k);
biTab[j - 1][k - 1] = s;
}
}
return biTab
}

最佳答案

您需要将 JavaScript 数组转换为原生数组。一种方法是使用 Dictionary 对象,参见 http://cwestblog.com/2011/10/24/javascript-snippet-array-prototype-tovbarray :

var dict = new ActiveXObject('Scripting.Dictionary');
for (var i=0;i < 5; i++ ) dict.add(i,i);
sheet.cells(1,1).resize(5, 1).value = sheet.application.Transpose(dict.items());

如果您写入一行,请省略 Transpose()

关于Javascript 到 Excel : bad performance for lack of "range" method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9508582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com