2014-07-08 17 views
5

Ho una pagina web che ha 3 tabelle e vorrei esportarle tutte e 3 nello stesso file excel. Mi piacerebbe avere ogni tabella nel proprio foglio, ma averli tutti sullo stesso foglio va bene. Dopo alcuni googling, tutto quello che ho visto è esportare una tabella in un foglio Excel.Come esportare più tabelle html per eccellere?

+2

E come si vorrebbe fare questo? Con quale lingua? In quale ambiente? Quanto impegno hai messo in questo te finora? Hai abbastanza badge e rappresentanti per conoscere le regole. –

+0

Che linguaggio di programmazione stai usando? Solo HTML e Javascript? –

+0

@ alex.pulver Sto usando pagine Web ASP.NET. Ma sto solo cercando di farlo in HTML e Javascript. – dotnetN00b

risposta

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

    } 
})(); 

E l'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> 

NOTA: questo non funziona su IE ('i dati troppo piccolo' errore) e su Firefox entrambe le tabelle sono messi sullo stesso foglio.

credito anche a questo thread - HTML Table to Excel Javascript

+1

Ho trovato che questo non funziona bene quando si utilizzano più fogli. Nel mio caso, http://stackoverflow.com/questions/29698796/how-to-convert-html-table-to-excel-with-multiple-sheet questo ha funzionato bene. Una cosa dovrebbe stare attenta è il carattere '/' nel nome del foglio. –

+0

Ho questo errore con questo codice Il prefisso "x" per l'elemento "x: ExcelWorksheet" non è associato. –

1

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

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

è angolare, ma non dovrebbe importare. – Ehud

+0

Questa risposta mi ha indirizzato nella giusta direzione. Supporta mettere i dati su diversi fogli. Produce SpreadsheetML non HTML.Maggiori informazioni in questa risposta qui: http://stackoverflow.com/a/150368/373981 –

+1

@Ehud puoi per favore dare il jsfiddle per questo? sarebbe facile capire in quale formato vengono passati i "set di dati" –

-2

Here è una soluzione migliore che supporta tavolo esportatore l'ultima Excel formato cioè xlsx . La soluzione accettata fallirebbe nel caso in cui il numero totale di righe da esportare fosse superiore a 3407 su Chrome.

Un esempio dal link qui sopra: 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]]); 
} 
Problemi correlati