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

标签 javascript excel

考虑到您只使用 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/

相关文章:

javascript - “变量”: function(req, res){} 是什么意思?

javascript - 从库访问函数

javascript - 使用 ajax 时数据表搜索输入的 Keyup 事件不会触发

javascript - 使用 Tween JS 进行动画 - 无法读取未定义的属性 'apply'

Excel CurDir() 函数返回错误的目录

javascript - 测试 JQuery 中的单选按钮选中状态无法正常工作

excel - Clojure excel交互(公式)

c# - Excel 选择更改事件触发了两次 C#

r - 使用 RSelenium 下载 Excel 文件

vba - 从给定单元格右侧的范围中选择值,并从中迭代创建子文件夹