Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript到Excel:由于缺少“;“范围”;方法 P>考虑到您只使用Internet Explorer(在大型企业中经常如此),您可以得出结论,您可以向用户提供将HTML GRIDVIEW转换成Excel文件的可能性:此外,您只需考虑到用户请求它,就必须这样做……/P>_Javascript_Excel - Fatal编程技术网

Javascript到Excel:由于缺少“;“范围”;方法 P>考虑到您只使用Internet Explorer(在大型企业中经常如此),您可以得出结论,您可以向用户提供将HTML GRIDVIEW转换成Excel文件的可能性:此外,您只需考虑到用户请求它,就必须这样做……/P>

Javascript到Excel:由于缺少“;“范围”;方法 P>考虑到您只使用Internet Explorer(在大型企业中经常如此),您可以得出结论,您可以向用户提供将HTML GRIDVIEW转换成Excel文件的可能性:此外,您只需考虑到用户请求它,就必须这样做……/P>,javascript,excel,Javascript,Excel,我从外部将表(或数组)写入Excel的第一次经验是使用Visual Basic(.net的服务器端)。因此,我编写了一个类,将VB 2D数组扩展到Excel工作表中: 1) 我使用的第一种方法乍一看似乎很好,顺便说一句,它非常简单:在行上的循环中设置列上的循环,然后将VB数组中的每个值写入Excel工作表。事情是这样的: Dim j, k as Integer Dim Valeur as String 'let us suppose the VB

我从外部将表(或数组)写入Excel的第一次经验是使用Visual Basic(.net的服务器端)。因此,我编写了一个类,将VB 2D数组扩展到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分钟,而第二种方法只需要半秒。p> 因此,当谈到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;                              
      }        
    } 
而且,正如预期的那样,这要快得多,但问题是它实际上不起作用,因为它没有将2D数组的每个值传输到Excel范围的相应单元格,而是将整个Javascript 2D数组写入Excel范围的每个单元格中

所以问题是:如何将Javascript 2D数组一次写入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
}
this.pcttEnTab=function()//数组(表2维)
{//convertit la pile PCTT en tableauá2维
变量j,k,s;
var biTab=新数组();
for(k=0;k对于(j=1;j来解释一下
ActiveSheet.Range
和JavaScript数组之间的一些交互。它们提到了“使用
SafeArray
的解决方法”…这可能会有所帮助。

您需要将JavaScript数组转换为本机数组。 一种方法是使用Dictionary对象,请参见:

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

如果您写入一行,ommit the Transpose()。

可能部分问题在于JavaScript没有2D数组(只有数组数组数组)嘿!你在发垃圾邮件,所以:是的,很抱歉,我第一次被骗得没有答案,我想我可能不够清楚,在复制代码的不同部分时也犯了一些错误。这个问题对我来说很重要,我决定再试一次。我现在正在考虑你的建议,希望最终能成功。…顺便问一下你有趣的答案。你能找到
[]
为什么不创建“真”数组的解释吗?当然可以
[]数组的instanceof Array
true
…我试图找到引用,但找不到。而且似乎原因是我的内存不好。从我现在的研究来看,这种差异可能发生在其他数据类型上,而不是数组上。特别是字符串可能会引起混淆,因为它们可能是字符串文字(原语)或字符串对象(实例)@nnnnnn:谢谢你的评论。我已经“重构”了我的答案!如果可以的话,这里是“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
}
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());