Come posso esportare tabelle in Excel da una pagina web. Voglio che l'esportazione contenga tutta la formattazione e i colori.
<td style="background-color: ...
Come posso esportare tabelle in Excel da una pagina web. Voglio che l'esportazione contenga tutta la formattazione e i colori.
<td style="background-color: ...
Risposte:
Di gran lunga, l'esportazione più pulita e semplice da tabelle a Excel è il plug-in Jquery DataTables Table Tools. Ottieni una griglia che ordina, filtra, ordina e impagina i tuoi dati e, con solo poche righe di codice in più e due piccoli file inclusi, ottieni l'esportazione in Excel, PDF, CSV, negli appunti e nella stampante.
Questo è tutto il codice richiesto:
$(document).ready( function () {
$('#example').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
}
} );
} );
Quindi, veloce da implementare, nessuna limitazione del browser, nessun linguaggio lato server richiesto e soprattutto molto FACILE da capire. È una vittoria per tutti. L'unica cosa su cui ha dei limiti, tuttavia, è la formattazione rigorosa delle colonne.
Se la formattazione ei colori sono dei veri e propri rompicapo, l'unico metodo affidabile al 100% per il browser che ho trovato è quello di utilizzare un linguaggio lato server per elaborare i file Excel corretti dal codice. La mia soluzione preferita è PHPExcel. È l'unico che ho trovato finora che gestisce positivamente l'esportazione con la formattazione in una versione MODERNA di Excel da qualsiasi browser quando non gli dai altro che HTML. Permettetemi di chiarire, però, non è sicuramente così facile come la prima soluzione, ed è anche un po 'un maiale di risorse. Tuttavia, il lato positivo può anche essere stampato direttamente in PDF. E, una volta configurato, funziona sempre.
AGGIORNAMENTO - 15 settembre 2016: TableTools è stato interrotto a favore di un nuovo plugin chiamato " pulsanti " Questi strumenti svolgono le stesse funzioni della vecchia estensione TableTools, ma sono MOLTO più facili da installare e fanno uso di download HTML5 per i browser moderni, con la capacità di eseguire il fallback al download Flash originale per i browser che non supportano lo standard HTML5. Come puoi vedere dai molti commenti da quando ho pubblicato questa risposta nel 2011, il principale punto debole di TableTools è stato affrontato. Non posso ancora raccomandare abbastanza DataTables per gestire semplicemente grandi quantità di dati, sia per lo sviluppatore che per l'utente.
Molto tempo fa, ho scoperto che Excel aprirebbe un file HTML con una tabella se lo inviamo con il tipo di contenuto Excel. Considera il documento sopra:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Java Friends</title>
</head>
<body>
<table style="font-weight: bold">
<tr style="background-color:red"><td>a</td><td>b</td></tr>
<tr><td>1</td><td>2</td></tr>
</table>
</body>
</html>
Ho eseguito il seguente bookmarklet su di esso:
javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);
e infatti l'ho ottenuto scaricabile come file Excel. Tuttavia , non ho ottenuto il risultato atteso: il file era aperto in OpenOffice.org Writer. Questo è il mio problema: non ho Excel in questa macchina, quindi non posso provarlo meglio. Inoltre, questo trucco ha funzionato più o meno sei anni fa con browser meno recenti e una versione antica di MS Office, quindi non posso davvero dire se funzionerà oggi.
Ad ogni modo, nel documento sopra ho aggiunto un pulsante che scaricherebbe l'intero documento come file Excel, in teoria:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Java Friends</title>
</head>
<body>
<table style="font-weight: bold">
<tr style="background-color:red"><td>a</td><td>b</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr>
<td colspan="2">
<button onclick="window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);">
Get as Excel spreadsheet
</button>
</td>
</tr>
</table>
</body>
</html>
Salvalo in un file e fai clic sul pulsante. Mi piacerebbe piace sapere se ha funzionato o meno, quindi vi chiedo di commentare, anche per dire che non ha funzionato.
document.getElementById('id').innerHTML
per afferrare selettivamente solo la tabella, altrimenti tutte le tue cose vengono esportate nel foglio di calcolo. Non funziona nella vecchia IE, tuttavia, apre solo una nuova finestra con tutto l'html nel titolo
È possibile utilizzare il vecchio formato XML di Excel 2003 (prima di OpenXML) per creare una stringa che contiene l'XML desiderato, quindi sul lato client è possibile utilizzare un URI di dati per aprire il file utilizzando il tipo MIME XSL o inviare il file al client utilizzando il tipo MIME di Excel "Content-Type: application / vnd.ms-excel" dal lato server.
<script type="text/javascript">
var worksheet_template = '<?xml version="1.0"?><ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'+
'<ss:Styles><ss:Style ss:ID="1"><ss:Font ss:Bold="1"/></ss:Style></ss:Styles><ss:Worksheet ss:Name="Sheet1">'+
'<ss:Table>{{ROWS}}</ss:Table></ss:Worksheet></ss:Workbook>';
var row_template = '<ss:Row ss:StyleID="1"><ss:Cell><ss:Data ss:Type="String">{{name}}</ss:Data></ss:Cell></ss:Row>';
</script>
<script type="text/javascript">
var rows = document.getElementById("my-table").getElementsByTagName('tr'),
row_data = '';
for (var i = 0, length = rows.length; i < length; ++i) {
row_data += row_template.replace('{{name}}', rows[i].getElementsByTagName('td')[0].innerHTML);
}
</script>
Una volta raccolte le informazioni, crea la stringa finale e apri una nuova finestra utilizzando l'URI dei dati
<script type="text/javascript"> var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
window.open('data:application/vnd.ms-excel,'+worksheet); </script>
Vale la pena notare che i browser meno recenti non supportano lo schema dell'URI dei dati, quindi potrebbe essere necessario produrre il lato file server per quei browser che non lo supportano.
Potrebbe anche essere necessario eseguire la codifica base64 sul contenuto dell'URI dei dati, che potrebbe richiedere una libreria js , oltre ad aggiungere la stringa "; base64" dopo il tipo mime nell'URI dei dati.
Excel ha una funzione poco conosciuta chiamata "query Web" che consente di recuperare i dati da quasi tutte le pagine Web senza ulteriore programmazione.
Una query web fondamentalmente esegue una richiesta HTTP direttamente da Excel e copia alcuni o tutti i dati ricevuti (e facoltativamente la formattazione) nel foglio di lavoro.
Dopo aver definito la query web, puoi aggiornarla in qualsiasi momento senza nemmeno uscire da Excel. Quindi non è necessario "esportare" i dati e salvarli in un file - preferiresti aggiornare i dati proprio come da un database.
Puoi persino utilizzare i parametri URL facendo in modo che Excel ti richieda determinati criteri di filtro, ecc ...
Tuttavia i contro che ho notato finora sono:
Ecco una domanda su come creare query Web in Excel. Si collega a un sito della Guida di Microsoft su come ottenere dati esterni da una pagina Web
Questo è un php ma forse puoi cambiarlo in javascript:
<?php>
$colgroup = str_repeat("<col width=86>",5);
$data = "";
$time = date("M d, y g:ia");
$excel = "<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\">
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html>
<head>
<meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" />
<style id=\"Classeur1_16681_Styles\">
.xl4566 {
color: red;
}
</style>
</head>
<body>
<div id=\"Classeur1_16681\" align=center x:publishsource=\"Excel\">
<table x:str border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\">
<colgroup>$colgroup</colgroup>
<tr><td class=xl2216681><b>Col1</b></td><td class=xl2216681><b>Col2</b></td><td class=xl2216681 ><b>Col3</b></td><td class=xl2216681 ><b>Col4</b></td><td class=xl2216681 ><b>Col5</b></td></tr>
<tr><td class=xl4566>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr>
</table>
</div>
</body>
</html>";
$fname = "Export".time().".xls";
$file = fopen($fname,"w+");
fwrite($file,$excel);
fclose($file);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'.basename($fname).'"');
readfile($fname);
unlink($fname); ?>
Innanzitutto, non consiglierei di provare a esportare Html e spero che l'istanza di Excel dell'utente lo raccolga. La mia esperienza che questa soluzione è irta di problemi, comprese le incompatibilità con i client Macintosh e il lancio di un errore all'utente che il file in questione non è del formato specificato. La soluzione più a prova di proiettile e di facile utilizzo è quella lato server in cui si utilizza una libreria per creare un vero file Excel e inviarlo all'utente. La prossima soluzione migliore e più universale sarebbe quella di utilizzare il formato Open XML. Ho riscontrato alcuni rari problemi di compatibilità con le versioni precedenti di Excel, ma nel complesso questo dovrebbe darti una soluzione che funzionerà su qualsiasi versione di Excel, inclusi i Mac.
Mozilla supporta ancora gli URI di base 64. Ciò ti consente di comporre dinamicamente il contenuto binario utilizzando javascript:
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
se il tuo file excel non è molto elaborato (niente diagrammi, formule, macro) puoi scavare nel formato e comporre byte per il tuo file, quindi codificarli con base64 e inserirli nell'href
fare riferimento a https://developer.mozilla.org/en/data_URIs
Questo è in realtà più semplice di quanto si pensi: "Basta" copiare la tabella HTML (ovvero: il codice HTML per la tabella) negli appunti. Excel sa come decodificare le tabelle HTML; proverà anche a preservare gli attributi.
La parte difficile è "copiare la tabella negli appunti" poiché non esiste un modo standard per accedere agli appunti da JavaScript. Vedi questo post del blog: Accesso agli Appunti di sistema con JavaScript: un Santo Graal?
Ora tutto ciò di cui hai bisogno è la tabella come HTML. Suggerisco jQuery e il metodo html () .
Questo codice è solo IE, quindi è utile solo in situazioni in cui sai che tutti i tuoi utenti useranno IE (come, ad esempio, in alcuni ambienti aziendali).
<script Language="javascript">
function ExportHTMLTableToExcel()
{
var thisTable = document.getElementById("tbl").innerHTML;
window.clipboardData.setData("Text", thisTable);
var objExcel = new ActiveXObject ("Excel.Application");
objExcel.visible = true;
var objWorkbook = objExcel.Workbooks.Add;
var objWorksheet = objWorkbook.Worksheets(1);
objWorksheet.Paste;
}
</script>
Presupposti:
URL fornito
la conversione deve essere eseguita sul lato client
i sistemi sono Windows, Mac e Linux
Soluzione per Windows:
codice python che apre la finestra ie e vi ha accesso: la variabile url contiene l'url ('http: //')
ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)
Nota: se la pagina non è accessibile direttamente, ma effettua il login, dovrai gestirlo inserendo i dati del form ed emulando le azioni dell'utente con python
ecco l'esempio
from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw
allo stesso modo per il recupero dei dati dalla pagina web. Supponiamo che l'elemento con ID "el1" contenga i dati. recuperare il testo dell'elemento nella variabile
el1 = ie.Document.all('el1').value
quindi quando i dati sono nella variabile python, puoi aprire la schermata di Excel in modo simile usando python:
from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
xlWb = xlApp.Workbooks.Open("Read.xls")
xlSht = xlWb.WorkSheets(1)
xlSht.Cells(row, col).Value = el1
Soluzione per Mac:
solo il suggerimento: usa AppleScript - ha un'API semplice e simile a win32com.client Dispatch
Soluzione per Linux:
java.awt.Robot potrebbe funzionare per questo, ha clic, pressione di un tasto (è possibile utilizzare i tasti di scelta rapida), ma nessuna API per Linux di cui sono a conoscenza può funzionare in modo semplice come AppleScript
la semplice ricerca su Google ha rilevato questo:
Se i dati sono in realtà una pagina HTML e NON sono stati creati da ASP, PHP o qualche altro linguaggio di scripting e stai utilizzando Internet Explorer 6 e hai installato Excel sul tuo computer, fai semplicemente clic con il tasto destro sulla pagina e guarda attraverso il menu. Dovresti vedere "Esporta in Microsoft Excel". Se tutte queste condizioni sono vere, fare clic sulla voce di menu e dopo alcuni prompt verrà importata in Excel.
se non puoi farlo, offre un metodo alternativo di "trascinamento della selezione":
Ci sono due modi pratici per farlo automaticamente, mentre solo una soluzione può essere utilizzata in tutti i browser. Prima di tutto dovresti usare la specifica xml aperta per creare il foglio Excel. Sono disponibili plug-in gratuiti di Microsoft che rendono questo formato disponibile anche per le versioni precedenti di Office. L'xml aperto è uno standard dall'ufficio 2007. I due modi sono evidenti sul lato server o sul lato client.
L'implementazione lato client utilizza un nuovo standard di CSS che consente di memorizzare i dati anziché solo l'URL dei dati. Questo è un ottimo approccio perché non è necessaria alcuna chiamata al server, solo i dati e un po 'di javascript. Il rovescio della medaglia è che Microsoft non supporta tutte le sue parti nelle attuali versioni di IE (non so di IE9). Microsoft limita i dati a un'immagine ma avremo bisogno di un documento. In Firefox funziona abbastanza bene. Per me l'IE era il punto di morte.
L'altro modo è utilizzare un'implementazione lato server. Dovrebbero esserci molte implementazioni di XML aperto per tutte le lingue. Devi solo prenderne uno. Nella maggior parte dei casi sarà il modo più semplice per modificare un Viewmodel per ottenere un documento, ma di sicuro puoi inviare tutti i dati da Clientside al server e fare lo stesso.
function normalexport() {
try {
var i;
var j;
var mycell;
var tableID = "tblInnerHTML";
var drop = document.getElementById('<%= ddl_sections.ClientID %>');
var objXL = new ActiveXObject("Excel.Application");
var objWB = objXL.Workbooks.Add();
var objWS = objWB.ActiveSheet;
var str = filterNum(drop.options[drop.selectedIndex].text);
objWB.worksheets("Sheet1").activate; //activate dirst worksheet
var XlSheet = objWB.activeSheet; //activate sheet
XlSheet.Name = str; //rename
for (i = 0; i < document.getElementById("ctl00_ContentPlaceHolder1_1").rows.length - 1; i++) {
for (j = 0; j < document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells.length; j++) {
mycell = document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells(j);
objWS.Cells(i + 1, j + 1).Value = mycell.innerText;
// objWS.Cells(i + 1, j + 1).style.backgroundColor = mycell.style.backgroundColor;
}
}
objWS.Range("A1", "L1").Font.Bold = true;
// objWS.Range("A1", "L1").Font.ColorIndex = 2;
// objWS.Range("A1", "Z1").Interior.ColorIndex = 47;
objWS.Range("A1", "Z1").EntireColumn.AutoFit();
//objWS.Range("C1", "C1").ColumnWidth = 50;
objXL.Visible = true;
} catch (err) {
alert("Error. Scripting for ActiveX might be disabled")
return
}
idTmr = window.setInterval("Cleanup();", 1);
}
function filterNum(str) {
return str.replace(/[ / ]/g, '');
}