2013-06-15 18 views
26

Próbuję użyć tego skryptu, aby zapisać tabelę html w pliku Excel, i działa dobrze, jednak nie pojawia się we właściwej nazwie, ale raczej w losowym łańcuchu. I nie rozumiem, dlaczego.Tablica HTML do Excela Javascript

nazywam go:

<input type="button" onclick="tableToExcel('tablename', 'name')" value="Export to Excel"> 

kodu

var tableToExcel = (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><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>' 
, base64 = function(s) { return window.btoa(unescape(encodeURIComponent(s))) } 
, format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; }) } 
return function(table, name) { 
if (!table.nodeType) table = document.getElementById(table) 
var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML} 
window.location.href = uri + base64(format(template, ctx)) 
} 
})() 
+0

Jesteś przekazywania parametrów „name” i „nazwa_tabeli” na 'tableToExcel' ale funkcja nie deklaruje żadnych parametrów –

+0

Wiesz, jak to naprawić? Mój js nie jest zbyt wielki: P – Coolcrab

+0

Działa dla mnie ... –

Odpowiedz

47

Można użyć download atrybut obsługiwany przez nowoczesnego browsera dla a kotwicy elementu. Najpierw zmodyfikować HTML dodając niewidzialną kotwicę:

<a id="dlink" style="display:none;"></a> 

<input type="button" onclick="tableToExcel('tablename', 'name', 'myfile.xls')" value="Export to Excel"> 

Zauważmy też, że wezwanie do działania tableToExcel ma teraz 3rd parametr - gdzie można określić nazwę pliku.

teraz użyć tego kodu zmodyfikowanego swojej pierwotnej funkcji:

var tableToExcel = (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><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>' 
     , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) } 
     , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) } 
     return function (table, name, filename) { 
      if (!table.nodeType) table = document.getElementById(table) 
      var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML } 

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

     } 
    })() 

Notice ostatnich linii kodu 3: Zamiast przypisywania adresu URL do okna - oni przypisać go do nowej kotwicy, a następnie użyć nowego atrybutu download zmusić do pobrania jako podaną nazwę pliku, a następnie prostą metodę wywołania click() metody zakotwiczenia.

Spróbuj.

+2

Awesome! Nazwa działa, ale teraz pojawia się ten błąd: "Plik, który próbujesz otworzyć," nazwa.xls ", ma inny format niż określony w rozszerzeniu pliku. Upewnij się, że plik nie jest uszkodzony i pochodzi z zaufanego źródła przed otwarciem pliku. " – Coolcrab

+2

To normalne, powinieneś również zdobyć to wcześniej. Dzieje się tak, ponieważ plik nie jest prawdziwym Excelem, ale raczej ukrytym XMLem. Ale po tym ostrzeżeniu plik powinien otworzyć OK. Możesz grać z rozszerzeniem pliku, aby spróbować pozbyć się ostrzeżenia (np. Zmień go na .XML itp.). –

+1

Witam, wiem, że jest to starszy wpis, ale pojawia się komunikat, że obiekt nie obsługuje właściwości lub metody 'btoa ". – seroth

2

Trzy powyższe linie kodu nie działają w moim przypadku, ale tutaj znalazłem i mam nadzieję, że to może pomóc.

function tableToExcel(table, name, filename) { 
 
     let 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"><title></title><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>', 
 
     base64 = function(s) { return window.btoa(decodeURIComponent(encodeURIComponent(s))) },   format = function(s, c) { return s.replace(/{(\w+)}/g, function(m, p) { return c[p]; })} 
 
     
 
     if (!table.nodeType) table = document.getElementById(table) 
 
     var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML} 
 

 
     var link = document.createElement('a'); 
 
     link.download = filename; 
 
     link.href = uri + base64(format(template, ctx)); 
 
     link.click(); 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<style> 
 
table { 
 
    font-family: arial, sans-serif; 
 
    border-collapse: collapse; 
 
    width: 100%; 
 
} 
 

 
td, th { 
 
    border: 1px solid #dddddd; 
 
    text-align: left; 
 
    padding: 8px; 
 
} 
 

 
tr:nth-child(even) { 
 
    background-color: #dddddd; 
 
} 
 
</style> 
 
</head> 
 
<body> 
 
<input 
 
    type="button" 
 
    onclick="tableToExcel('myTable', 'name', 'myfile.xls')" 
 
    value="Export to Excel" 
 
> 
 
<table id="myTable"> 
 
    <tr> 
 
    <th>Company</th> 
 
    <th>Contact</th> 
 
    <th>Country</th> 
 
    </tr> 
 
    <tr> 
 
    <td>Alfreds Futterkiste</td> 
 
    <td>Maria Anders</td> 
 
    <td>Germany</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Centro comercial Moctezuma</td> 
 
    <td>Francisco Chang</td> 
 
    <td>Mexico</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Ernst Handel</td> 
 
    <td>Roland Mendel</td> 
 
    <td>Austria</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Island Trading</td> 
 
    <td>Helen Bennett</td> 
 
    <td>UK</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Laughing Bacchus Winecellars</td> 
 
    <td>Yoshi Tannamuri</td> 
 
    <td>Canada</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Magazzini Alimentari Riuniti</td> 
 
    <td>Giovanni Rovelli</td> 
 
    <td>Italy</td> 
 
    </tr> 
 
</table> 
 

 
</body> 
 
</html>

+0

Snippet wydaje się być uszkodzony. – WilomGfx

+0

Snippet działał dobrze dla mnie na Chrome – brasofilo

+0

Czasami musimy kodować UTF-8, aby 'window.btoa' działał. Zobacz [Nie udało się wykonać 'btoa' w 'oknie': Ciąg do zakodowania zawiera znaki spoza zakresu Latin1.] (Https://stackoverflow.com/q/23223718/1287812) – brasofilo