Avatar billede andersbl Nybegynder
18. februar 2010 - 11:16 Der er 8 kommentarer og
1 løsning

Tabel eksport til Excel med RANGE

Hej Eksperter
Har brug for:
Det jeg har brug for at et "bi-dimensional object array", som bliver udfyldt af JS funktionen(med rigtige formater), og giver mulighed for at kopirer det hele ind på en gang.

Jeg har et lille problem. Jeg har lavet en funktion som taget indholdet af en HTML tabel og indsætter det, celle for celle i Excel. Det virker fint, men er ikke tilfreds med hastigheden, da der i mig tilfælde kan forekomme over 500x10 celler(tager 3 min).
Derfor har jeg søgt på nettet for fundet denne side der med C# og VBA, taget et array og indsætter det hele på en gange, ved hjælp af "range".
http://www.codeproject.com/KB/office/FastExcelExporting.aspx

Jeg programmerer i HTML, JavaScript og JSP.
Som jeg forstår det taget de et "bi-dimensional object array", som de står får mulighed for at sætte ind på et område. Har prøvet med et normalt array, men der sætter det hele arrayet ind i hver celle.



===================== KODE ======================
<HTML>
<HEAD>
<TITLE>index.html</TITLE>
</HEAD>
<BODY>
<script>
function CreateExcelSheet()
{
  var x=myTable.rows
  var someArray = new Array;
  var xls = new ActiveXObject("Excel.Application")
  xls.visible = true
  xls.Workbooks.Add
  for (i = 0; i < x.length; i++)
  {
    var y = x[i].cells

    for (j = 0; j < y.length; j++) {
        var tempVal = y[j].innerText;
        tempVal = tempVal.replace(/\./g,"");
        tempVal = tempVal.replace(/\,/g,".");
           
        if (!isNaN(tempVal)) {
            xls.Cells( i+1, j+1).Value = parseFloat(tempVal)
            xls.Cells( i+1, j+1).NumberFormat = "#,##0.00"
        }
        else {
            xls.Cells( i+1, j+1).Value = tempVal
        }
       
        xls.Cells(1, j+1).Interior.ColorIndex = 25
        xls.Cells(1, j+1).Font.FontStyle = "Bold"
        xls.Cells(1, j+1).Font.ColorIndex = 2

        // Evt. udfyld af array her..
    }
  }
  for (j = 0; j < y.length; j++) {
        xls.Cells(j+1).EntireColumn.AutoFit       
  }
  //xls.range('a12:d14').Value = y
  xls.Worksheets(1).Name="Deors table"
}
</script>

<table style="display: true" id="myTable" border="1">
  <tr>
    <td>Celle 1</td>
    <td>Celle 2</td>
    <td>Celle 3</td>
    <td>Celle 4</td>
  </tr>
  <tr>
    <td>Celle 5</td>
    <td>Celle 6</td>
    <td>Celle 7</td>
    <td>Celle 8</td>
  </tr>
  <tr>
    <td>Celle 9</td>
    <td>Celle 10</td>
    <td>Celle 11</td>
    <td>Celle 12</td>
  </tr>
  <tr>
    <td>Celle 13</td>
    <td>Celle 14</td>
    <td>Celle 15</td>
    <td>Celle 16</td>
  </tr>
</table>

<form action="#" method="post"><input type="submit" onclick="CreateExcelSheet(); return false;" value="Open as Excel spreadsheet" /></form>

</BODY>
</HTML>
Avatar billede tjens Nybegynder
18. februar 2010 - 19:10 #1
Hvordan påvirker det hastigheden, hvis du flytter
    xls.visible = true
til efter du er færdig med at sætte data ind?
Avatar billede tjens Nybegynder
18. februar 2010 - 21:19 #2
Efter en del bøvlen, må jeg konkludere at jeg ikke kan tilgå Range fra javascript.

Men man kan fra VBscript. Dog kun en linie ad gangen.

Prøv at indsætte følgende i din testside
<script language="VBScript">
sub testVB (byRef xls)
    dim i, j
    dim linie(10)
    for i = 10 to 20
        for j = 0 to 10
            linie(j) = "Test " & i & ":" & j
        next
    xls.Range("A"&i,"K"&i).Value2 = linie
    next
end sub
</script>

og kald den med
  testVB(xls);
i din nuværende javascript funktion.
Avatar billede andersbl Nybegynder
19. februar 2010 - 10:22 #3
Tak for jeres svar.. jeg har nu selv bøvlet lidt med koden selv har er noget længere, men er støt på et nyt, men nok lettere problem at løse for jer.

Jeg har nu fået alle værdierne ind i et dobbelt-array i javascript. Det skal nu overføres til VBScript som sætter det ind i et nyt array. På den måde virker det hele.

Her er hvad jeg er kommet frem til:
<script type="text/vbscript">
Function CreateArray()
' Create an array to set multiple values at once.
Dim saNames(5, 2)
saNames(0, 0) = "John"
saNames(0, 1) = "Smith"
saNames(1, 0) = "Tom"
saNames(1, 1) = "Brown"
saNames(2, 0) = "Sue"
saNames(2, 1) = "Thomas"
saNames(3, 0) = "Jane"
saNames(3, 1) = "Jones"
saNames(4, 0) = "Adam"
saNames(4, 1) = "Johnson"

CreateArray = saNames
End Function
</script>

<script type="text/javascript">
function CreateExcelSheet()
{
  var x=myTable.rows
  var val = new Array();

  var xls = new ActiveXObject("Excel.Application")
 
  xls.Workbooks.Add
  for (i = 0; i < x.length; i++)
  {
    var y = x[i].cells
    val[i] = new Array();
   
    for (j = 0; j < y.length; j++) {
            var tempVal = y[j].innerText;
            tempVal = tempVal.replace(/\./g,"");
            tempVal = tempVal.replace(/\,/g,".");
           
            if (!isNaN(tempVal)) {           
                xls.Cells( i+1, j+1).Value = parseFloat(tempVal)
                xls.Cells( i+1, j+1).NumberFormat = "#,##0.00"
                val[i][j] = parseFloat(tempVal);
            }
            else {
                xls.Cells( i+1, j+1).Value = tempVal
                val[i][j] = tempVal;
            }
            xls.Cells(1, j+1).Interior.ColorIndex = 25
            xls.Cells(1, j+1).Font.FontStyle = "Bold"
            xls.Cells(1, j+1).Font.ColorIndex = 2
    }
  }
  for (j = 0; j < y.length; j++) {
                xls.Cells(j+1).EntireColumn.AutoFit
  }
//alert(val[2][0]);
  xls.Range("A10", "B15").Value = CreateArray()
  xls.Worksheets(1).Name="Deors table"
  xls.visible = true
}
</script>

Det er så til sidst hvor der står:
  xls.Range("A10", "B15").Value = CreateArray()
hvor jeg skal have sendt mig array "val[i][j]" over og få VBScript til at bruge værdierne til at sætte ind i et nyt array.

Så skulle problemet være løst. :)
Kan i hjælpe med den mindre ting?
Avatar billede tjens Nybegynder
19. februar 2010 - 10:49 #4
En anden tilgang er at skrive det hele i VBscript:
Det er ikke væsentligt forskelligt fra javascript når man lige har studeret syntaksforskellene.
Avatar billede andersbl Nybegynder
19. februar 2010 - 21:02 #5
Kender intet til VBScript, så der har jeg brug for hjælp. Kan man tage indholdet fra en HTML-tabel som i JavaScript?
Avatar billede tjens Nybegynder
21. februar 2010 - 12:49 #6
Som VBScript med begge metoder til skriving af celle:
<HTML>
<HEAD>
<TITLE>index.html</TITLE>

<script language="VBScript">

Sub CreateExcelSheet()

    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = True
    Set objWorkbook = objExcel.Workbooks.Add()

    dim myRows
    dim myCells
    dim i, j
    set myRows=myTable.rows
    set myCells=myRows(0).cells
    i = myRows.length-1
    j = myCells.length-1
    dim myArray()
    redim preserve myArray( i, j )

    for i = 0 to myRows.length-1
        set myCells=myRows(i).cells
        for j = 0 to myCells.length-1 
            objExcel.Cells( i+1, j+1).Value = myCells(j).firstChild.nodeValue
        next
    next

    for i = 0 to myRows.length-1
        set myCells=myRows(i).cells
        for j = 0 to myCells.length-1 
            myArray( i, j ) = myCells(j).firstChild.nodeValue
        next
    next
    objExcel.Range("A"&(10),"D"&(10+myRows.length-1)).Value2 = myArray
 
End Sub

</script>
</HEAD>
<BODY>

<table id="myTable" border="1">
  <tr>
    <td>Celle 1</td>
    <td>Celle 2</td>
    <td>Celle 3</td>
    <td>Celle 4</td>
  </tr>
  <tr>
    <td>Celle 5</td>
    <td>Celle 6</td>
    <td>Celle 7</td>
    <td>Celle 8</td>
  </tr>
  <tr>
    <td>Celle 9</td>
    <td>Celle 10</td>
    <td>Celle 11</td>
    <td>Celle 12</td>
  </tr>
  <tr>
    <td>Celle 13</td>
    <td>Celle 14</td>
    <td>Celle 15</td>
    <td>Celle 16</td>
  </tr>
</table>

<button onclick="CreateExcelSheet()" >Open as Excel spreadsheet</button>

</BODY>
</HTML>
Avatar billede andersbl Nybegynder
21. februar 2010 - 14:02 #7
Havde faktisk fundet et svar,i VBScript, men der tog den hele style for tabellen også med, hvilket ikke var så hensigtsmæssigt.

Men Tak for alt hjælp..

Smider du lige et svar så du kan modtage nogle point?
Avatar billede andersbl Nybegynder
21. februar 2010 - 14:03 #8
Du må også gerne lige fortælle hvordan du giver din kode den blå boks?
Avatar billede tjens Nybegynder
21. februar 2010 - 18:35 #9
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester