2014-07-08 16 views
5

Mam stronę internetową, która ma 3 tabele i chciałbym wyeksportować wszystkie 3 z nich do tego samego pliku excel. Chciałbym, aby każdy stół znajdował się we własnym arkuszu, ale posiadanie wszystkich na tym samym arkuszu również jest w porządku. Po przejściu przez google wszystko, co widziałem, to eksportowanie jednej tabeli do jednego arkusza programu Excel.Jak eksportować wiele tabel html do programu Excel?

+2

A jak chcesz to zrobić? W jakim języku? W jakim środowisku? Ile wysiłku włożyłeś w to do tej pory? Masz dość znaczków i przedstawiciela, aby poznać zasady. –

+0

Jakiego języka programowania używasz? Tylko HTML i JavaScript? –

+0

@ alex.pulver Używam stron sieci Web ASP.NET. Ale zamierzam to zrobić tylko w HTML i JavaScript. – dotnetN00b

Odpowiedz

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)); 

    } 
})(); 

I 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> 

UWAGA: to nie działa na IE („dane zbyt mały” błąd) oraz Firefox obie tabele są umieszczane na tym samym arkuszu.

Credit również ten wątek - HTML Table to Excel Javascript

+1

Znalazłem, że nie działa dobrze, gdy używa się wielu arkuszy. W moim przypadku http://stackoverflow.com/questions/29698796/how-to-convert-html-table-to-excel-with-multiple- sheheet to działało dobrze. Należy zwrócić uwagę na znak "/" w nazwie arkusza. –

+0

Mam ten błąd z tym kodem Przedrostek "x" dla elementu "x: ExcelWorksheet" nie jest związany. –

1

// funkcja 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))) 
     } 

// funkcja 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

jest w kanciastym, ale to nie powinno mieć znaczenia. – Ehud

+0

Ta odpowiedź wskazała mi właściwy kierunek. Obsługuje umieszczanie danych na różnych arkuszach. Wydaje SpreadsheetML, a nie HTML.Więcej informacji w tej odpowiedzi tutaj: http://stackoverflow.com/a/150368/373981 –

+1

@ Ehud możesz dać jsfiddle na to? łatwo byłoby zrozumieć, w jakim formacie przekazywane są "zbiory danych" –

-2

Here jest lepszym rozwiązaniem, które obsługuje tabelę eksportującego w najnowszym programie Excel format, tj. xlsx . Zatwierdzone rozwiązanie zakończy się niepowodzeniem, jeśli całkowita liczba eksportowanych wierszy przekroczy 3407 w Chrome.

Przykładem z linku powyżej: 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]]); 
} 
Powiązane problemy