2014-07-08 5 views
5

Ich habe eine Webseite, die 3 Tabellen hat und ich möchte alle 3 von ihnen in dieselbe Excel-Datei exportieren. Ich hätte gerne jeden Tisch in einem eigenen Blatt, aber alle auf dem gleichen Blatt zu haben, ist auch in Ordnung. Nach einigem googeln, habe ich nur eine Tabelle in ein Excel-Blatt exportiert.Wie exportiere ich mehrere HTML-Tabellen zu Excel?

+2

Und wie möchten Sie dies tun? Mit welcher Sprache? In welcher Umgebung? Wie viel Mühe hast du bisher selbst investiert? Du hast genug Abzeichen und Wiederholungen, um die Regeln zu kennen. –

+0

Welche Programmiersprache verwenden Sie? Nur HTML und Javascript? –

+0

@ alex.pulver Ich verwende ASP.NET-Webseiten. Aber ich suche nur in HTML und Javascript. – dotnetN00b

Antwort

12
var tablesToExcel = (function() { 
    var uri = 'data:application/vnd.ms-excel;base64,' 
    , template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets>' 
    , templateend = '</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>' 
    , body = '<body>' 
    , tablevar = '<table>{table' 
    , tablevarend = '}</table>' 
    , bodyend = '</body></html>' 
    , worksheet = '<x:ExcelWorksheet><x:Name>' 
    , worksheetend = '</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>' 
    , worksheetvar = '{worksheet' 
    , worksheetvarend = '}' 
    , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) } 
    , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) } 
    , wstemplate = '' 
    , tabletemplate = ''; 

    return function (table, name, filename) { 
     var tables = table; 

     for (var i = 0; i < tables.length; ++i) { 
      wstemplate += worksheet + worksheetvar + i + worksheetvarend + worksheetend; 
      tabletemplate += tablevar + i + tablevarend; 
     } 

     var allTemplate = template + wstemplate + templateend; 
     var allWorksheet = body + tabletemplate + bodyend; 
     var allOfIt = allTemplate + allWorksheet; 

     var ctx = {}; 
     for (var j = 0; j < tables.length; ++j) { 
      ctx['worksheet' + j] = name[j]; 
     } 

     for (var k = 0; k < tables.length; ++k) { 
      var exceltable; 
      if (!tables[k].nodeType) exceltable = document.getElementById(tables[k]); 
      ctx['table' + k] = exceltable.innerHTML; 
     } 

     //document.getElementById("dlink").href = uri + base64(format(template, ctx)); 
     //document.getElementById("dlink").download = filename; 
     //document.getElementById("dlink").click(); 

     window.location.href = uri + base64(format(allOfIt, ctx)); 

    } 
})(); 

Und der HTML

<html> 
    <head> 
     <title>JS to Excel</title> 

    </head> 
    <body> 
     <table id="1"> 
      <tr><td>Hi</td></tr> 
      <tr><td>Hey</td></tr> 
      <tr><td>Hello</td></tr> 
     </table> 
     <table id="2"> 
      <tr><td>Night</td></tr> 
      <tr><td>Evening</td></tr> 
      <tr><td>Nite</td></tr> 
     </table> 

     <a id="dlink" style="display:none;"></a> 
     <input type="button" onclick="tablesToExcel(['1', '2'], ['first', 'second'], 'myfile.xls')" value="Export to Excel"> 
     <script src="~/Views/JS/JSExcel.js" type="text/javascript"></script> 
    </body> 
</html> 

Hinweis: das funktioniert nicht auf IE (‚Daten zu klein‘ Fehler) und auf Firefox beide Tabellen sind auf dem gleichen Blatt setzen.

Kredit auch auf diesen Thread - HTML Table to Excel Javascript

+1

Ich fand das nicht gut, wenn Sie mehrere Blätter verwenden. In meinem Fall, http://stackoverflow.com/questions/29698796/how-to-convert-html-table-to-excel-with-multiple-sheet das hat gut funktioniert. Eine Sache sollte vorsichtig sein ist '/' Zeichen im Blattnamen. –

+0

Ich habe diesen Fehler mit diesem Code Das Präfix "x" für Element "x: ExcelWorksheet" ist nicht gebunden. –

1

// Funktion 1

 $scope.exportXlsSheets = function (datasets) { 

      var xlsString = '<?xml version="1.0"?>\ 
      <ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">';   
      for(var key in dict){ 
       var arr_of_entities= dict[key].arr; 
       xlsString += $scope.getSheet(arr_of_entities); 
      } 
      xlsString += '</ss:Workbook>'; 
      var a = document.createElement('a'); 
      a.href = 'data:application/vnd.ms-excel;base64,' + $scope.base64(xlsString); 
      a.target = '_blank'; 
      a.download = 'test1.xls'; 

      document.body.appendChild(a); 
      a.click(); 
     } 
     $scope.base64 = function (s) { 
      return window.btoa(unescape(encodeURIComponent(s))) 
     } 

// Funktion 2

$scope.getSheet = function (sheetName, entities) { 

     var res = '<ss:Worksheet ss:Name="'+sheetName+"></ss:Worksheet>\ 
        <ss:Table>'; 

      var row = '<ss:Row>'; 
      for (i = 0; i < entities.length; i++) { 
       var entity = entities[i]; 


        row += '<ss:Cell>\ 
          <ss:Data ss:Type="String">'+entity.value +'</ss:Data>\ 
         </ss:Cell>'; 
      } 
      row += '</ss:Row>'; 
      res += row; 

     return res; 
    } 
+0

ist es in eckigen, aber es sollte nicht wichtig sein. – Ehud

+0

Diese Antwort wies mich in die richtige Richtung. Es unterstützt das Einfügen der Daten in verschiedene Blätter. Es gibt SpreadsheetML nicht HTML aus.Mehr Infos in dieser Antwort hier: http://stackoverflow.com/a/150368/373981 –

+1

@Ehud können Sie bitte die jsfiddle dafür geben? Es wäre leicht zu verstehen, in welchem ​​Format 'Datasets' übergeben werden –

-2

Here ist eine bessere Lösung, die in der aktuellen Excel-Tabelle exportieren unterstützt Format dh xlsx . Die akzeptierte Lösung schlägt fehl, wenn die Gesamtzahl der zu exportierenden Zeilen in Chrome die Marke von 3407 überschreitet.

Ein Beispiel aus den obigen Link: http://jsfiddle.net/6ckj281f/

html

<button onclick="saveFile()">Save XLSX file</button> 

Javascript

window.saveFile = function saveFile() { 
var data1 = [{a:1,b:10},{a:2,b:20}]; 
var data2 = [{a:100,b:10},{a:200,b:20}]; 
var opts = [{sheetid:'One',header:true},{sheetid:'Two',header:false}]; 
var res = alasql('SELECT INTO XLSX("restest344b.xlsx",?) FROM ?', 
       [opts,[data1,data2]]); 
} 
Verwandte Themen