2014-07-08 38 views
5

3 tablo içeren bir web sayfam var ve bunların hepsini aynı excel dosyasına vermek istiyorum. Her tablonun kendi sayfasında olmasını isterdim, ama hepsinin aynı sayfada olması da iyi. Bazı googling'lerden sonra, gördüğüm tek şey bir tabloyu bir excel sayfasına aktarıyor.Birden çok html tablosunu excel'e nasıl dışa aktarabilirim?

+2

Ve nasıl bunu yapmak isterdiniz? Hangi dil ile? Hangi ortamda? Kendinize şu ana kadar ne kadar çaba harcadınız? Kuralları bilmek için yeterince rozetiniz ve temsilciniz var. –

+0

Hangi programlama dilini kullanıyorsunuz? Sadece HTML ve Javascript? –

+0

@ alex.pulver ASP.NET Web Sayfaları kullanıyorum. Ama ben sadece bunu HTML ve Javascript'te yapmak istiyorum. – dotnetN00b

cevap

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

    } 
})(); 

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

NOT: Bu IE ('verileri çok küçük' hatası) çalışmıyor ve Firefox'ta hem tablolar aynı sayfaya konur. Bu konuya da

Kredi - HTML Table to Excel Javascript

+1

Birden fazla sayfa kullanırken bu işe yaramadığını buldum. Benim durumumda, bu iyi çalıştı http://stackoverflow.com/questions/29698796/how-to-convert-html-table-to-excel-with-multiple-sheet. Dikkat etmem gereken bir şey, sayfa isminde '/' karakteridir. –

+0

Bu kodla ilgili bir hatam var "x: ExcelWorksheet" öğesi için "x" öneki bağlı değil. –

1

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

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

köşeli, ama önemli değil. – Ehud

+0

Bu cevap bana doğru yönde işaret etti. Verileri farklı sayfalara yerleştirmeyi destekler. SpreadsheetML HTML değil çıktılar.Buradaki cevapta daha fazla bilgi bulabilirsiniz: http://stackoverflow.com/a/150368/373981 –

+1

@Ehud Lütfen jsfiddle'ı bunun için verebilir misiniz? veri kümelerinin hangi formatta geçtiğini anlamak kolay olurdu –

-2

Here son Excel'de ihracat tablosunu destekleyen daha iyi bir çözümdür format yani xlsx . Kabul edilen çözüm, dışa aktarılan toplam satır sayısının Chrome'da 3407 değerini aşması durumunda başarısız olur.

yukarıdaki bağlantıdan bir örnek: 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]]); 
} 
İlgili konular