Wie kann ich Tabellen von einer Webseite nach Excel exportieren? Ich möchte, dass der Export alle Formatierungen und Farben enthält.
<td style="background-color: ...
Wie kann ich Tabellen von einer Webseite nach Excel exportieren? Ich möchte, dass der Export alle Formatierungen und Farben enthält.
<td style="background-color: ...
Antworten:
Der sauberste und einfachste Export von Tabellen nach Excel ist mit Abstand das Plugin Jquery DataTables Table Tools. Sie erhalten ein Raster, in dem Ihre Daten sortiert, gefiltert, bestellt und seitenweise angezeigt werden. Mit nur wenigen zusätzlichen Codezeilen und zwei kleinen Dateien können Sie nach Excel, PDF, CSV, in die Zwischenablage und in den Drucker exportieren.
Dies ist der gesamte Code, der benötigt wird:
$(document).ready( function () {
$('#example').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
}
} );
} );
Schnelle Bereitstellung, keine Browsereinschränkungen, keine serverseitige Sprache erforderlich und vor allem sehr einfach zu verstehen. Es ist eine Win-Win-Situation. Das einzige, was es jedoch einschränkt, ist die strikte Formatierung von Spalten.
Wenn Formatierung und Farben absolute Dealbreaker sind, ist die einzige 100% zuverlässige, browserübergreifende Methode, die ich gefunden habe, die Verwendung einer serverseitigen Sprache, um die richtigen Excel-Dateien aus Ihrem Code zu verarbeiten. Meine bevorzugte Lösung ist PHPExcel. Es ist die einzige, die ich bisher gefunden habe und die den Export mit Formatierung in eine MODERNE Version von Excel aus jedem Browser positiv handhabt, wenn Sie ihm nur HTML geben. Lassen Sie mich jedoch klarstellen, dass es definitiv nicht so einfach ist wie die erste Lösung und auch ein bisschen wie ein Ressourcenfresser. Auf der positiven Seite kann es jedoch auch direkt als PDF ausgegeben werden. Und sobald Sie es konfiguriert haben, funktioniert es jedes Mal.
UPDATE - 15. September 2016: TableTools wurde zugunsten eines neuen Plugins namens " Buttons " eingestellt. Diese Tools erfüllen dieselben Funktionen wie die alte TableTools-Erweiterung, sind jedoch weitaus einfacher zu installieren und verwenden HTML5-Downloads für moderne Browser. mit der Fähigkeit, auf den ursprünglichen Flash-Download für Browser zurückzugreifen, die den HTML5-Standard nicht unterstützen. Wie Sie den vielen Kommentaren entnehmen können, seit ich diese Antwort im Jahr 2011 veröffentlicht habe, wurde die Hauptschwäche von TableTools behoben. Ich kann DataTables immer noch nicht genug empfehlen, um große Datenmengen einfach zu verarbeiten, sowohl für den Entwickler als auch für den Benutzer.
Vor langer Zeit habe ich festgestellt, dass Excel eine HTML-Datei mit einer Tabelle öffnen würde, wenn wir sie mit dem Excel-Inhaltstyp senden. Betrachten Sie das obige Dokument:
<!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>
Ich habe das folgende Lesezeichen darauf ausgeführt:
javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);
und tatsächlich habe ich es als Excel-Datei heruntergeladen. Allerdings habe ich nicht das erwartete Ergebnis erhalten - die Datei geöffnet war in OpenOffice.org Writer. Das ist mein Problem: Ich habe kein Excel auf diesem Computer, daher kann ich es nicht besser ausprobieren. Außerdem hat dieser Trick vor mehr oder weniger sechs Jahren mit älteren Browsern und einer antiken Version von MS Office funktioniert, sodass ich wirklich nicht sagen kann, ob er heute funktionieren wird.
Wie auch immer, im obigen Dokument habe ich eine Schaltfläche hinzugefügt, mit der das gesamte Dokument theoretisch als Excel-Datei heruntergeladen werden kann:
<!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>
Speichern Sie es in einer Datei und klicken Sie auf die Schaltfläche. Ich würde gerne wissen, ob es funktioniert hat oder nicht, deshalb bitte ich Sie, einen Kommentar abzugeben , auch wenn Sie sagen, dass es nicht funktioniert hat.
document.getElementById('id').innerHTML
auf, um nur die Tabelle selektiv abzurufen. Andernfalls werden alle Ihre Inhalte in die Tabelle exportiert. Funktioniert aber nicht im alten IE, öffnet nur ein neues Fenster mit dem gesamten HTML im Titel
Es ist möglich, das alte Excel 2003-XML-Format (vor OpenXML) zu verwenden, um eine Zeichenfolge zu erstellen, die das gewünschte XML enthält. Auf der Clientseite können Sie dann einen Daten-URI verwenden, um die Datei mit dem XSL-MIME-Typ zu öffnen oder die Datei zu senden an den Client unter Verwendung des Excel-Mimetyps "Content-Type: application / vnd.ms-excel" von der Serverseite.
<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>
Sobald Sie die Informationen gesammelt haben, erstellen Sie die endgültige Zeichenfolge und öffnen Sie ein neues Fenster mit dem Daten-URI
<script type="text/javascript"> var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
window.open('data:application/vnd.ms-excel,'+worksheet); </script>
Es ist zu beachten, dass ältere Browser das Daten-URI-Schema nicht unterstützen. Daher müssen Sie möglicherweise die Dateiserverseite für diejenigen Browser erstellen, die es nicht unterstützen.
Möglicherweise müssen Sie auch eine Base64-Codierung für den Daten-URI-Inhalt durchführen, für die möglicherweise eine js-Bibliothek erforderlich ist , sowie die Zeichenfolge '; base64' nach dem MIME-Typ im Daten-URI hinzufügen.
Excel verfügt über eine wenig bekannte Funktion namens "Webabfragen", mit der Sie Daten von fast jeder Webseite ohne zusätzliche Programmierung abrufen können.
Eine Webanfrage führt grundsätzlich eine HTTP-Anforderung direkt in Excel aus und kopiert einige oder alle empfangenen Daten (und optional die Formatierung) in das Arbeitsblatt.
Nachdem Sie die Webanfrage definiert haben, können Sie sie jederzeit aktualisieren, ohne Excel zu verlassen. Sie müssen also keine Daten "exportieren" und in einer Datei speichern - Sie möchten die Daten lieber wie aus einer Datenbank aktualisieren.
Sie können sogar URL-Parameter verwenden, indem Sie von Excel zur Eingabe bestimmter Filterkriterien usw. aufgefordert werden.
Die Nachteile, die mir bisher aufgefallen sind, sind jedoch:
Hier ist eine Frage zum Erstellen von Webanfragen in Excel. Es enthält Links zu einer Microsoft-Hilfeseite zum Abrufen externer Daten von einer Webseite
Dies ist ein PHP, aber Sie können es möglicherweise in Javascript ändern:
<?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); ?>
Erstens würde ich nicht empfehlen, HTML zu exportieren, und hoffe, dass die Excel-Instanz des Benutzers es aufnimmt. Ich habe die Erfahrung gemacht, dass diese Lösung mit Problemen behaftet ist, einschließlich Inkompatibilitäten mit Macintosh-Clients und dem Fehler, dass die betreffende Datei nicht das angegebene Format hat. Die kugelsicherste und benutzerfreundlichste Lösung ist eine serverseitige Lösung, bei der Sie mithilfe einer Bibliothek eine tatsächliche Excel-Datei erstellen und diese an den Benutzer zurücksenden. Die nächstbeste und universellere Lösung wäre die Verwendung des Open XML-Formats. Ich habe einige seltene Kompatibilitätsprobleme mit älteren Excel-Versionen festgestellt, aber im Großen und Ganzen sollte dies eine Lösung bieten, die auf jeder Excel-Version einschließlich Macs funktioniert.
Mozilla unterstützt weiterhin URIs der Basis 64. Auf diese Weise können Sie den binären Inhalt mithilfe von Javascript dynamisch erstellen:
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
Wenn Ihre Excel-Datei nicht sehr ausgefallen ist (keine Diagramme, Formeln, Makros), können Sie in das Format graben und Bytes für Ihre Datei erstellen, diese dann mit base64 codieren und in die href eingeben
Weitere Informationen finden Sie unter https://developer.mozilla.org/en/data_URIs
Dies ist tatsächlich einfacher als Sie denken: "Kopieren Sie einfach" die HTML-Tabelle (dh den HTML-Code für die Tabelle) in die Zwischenablage. Excel kann HTML-Tabellen dekodieren. Es wird sogar versucht, die Attribute beizubehalten.
Der schwierige Teil ist "Kopieren der Tabelle in die Zwischenablage", da es keine Standardmethode gibt, um über JavaScript auf die Zwischenablage zuzugreifen. Siehe diesen Blog-Beitrag: Zugriff auf die System-Zwischenablage mit JavaScript - Ein heiliger Gral?
Jetzt brauchen Sie nur noch die Tabelle als HTML. Ich schlage jQuery und die html () -Methode vor.
Dieser Code ist nur IE und daher nur in Situationen nützlich, in denen Sie wissen, dass alle Benutzer IE verwenden (z. B. in einigen Unternehmensumgebungen).
<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>
Annahmen:
URL gegeben
Die Konvertierung muss clientseitig erfolgen
Systeme sind Windows, Mac und Linux
Lösung für Windows:
Python-Code, der das ie-Fenster öffnet und Zugriff darauf hat: Die URL-URL enthält die URL ('http: //').
ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)
Hinweis: Wenn auf die Seite nicht direkt zugegriffen werden kann, sondern Sie sich anmelden, müssen Sie dies tun, indem Sie die Formulardaten eingeben und die Benutzeraktionen mit Python emulieren
Hier ist das Beispiel
from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw
die gleiche Art und Weise für das Abrufen von Daten von der Webseite. Angenommen, das Element mit der ID 'el1' enthält die Daten. Rufen Sie den Elementtext in die Variable ab
el1 = ie.Document.all('el1').value
Wenn sich die Daten in einer Python-Variablen befinden, können Sie den Excel-Bildschirm auf ähnliche Weise mit Python öffnen:
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
Lösung für Mac:
Nur der Tipp: Verwenden Sie AppleScript - es hat eine einfache und ähnliche API wie win32com.client Dispatch
Lösung für Linux:
java.awt.Robot funktioniert möglicherweise dafür, es hat Klick, Tastendruck (Hotkeys können verwendet werden), aber keine API für Linux, die mir bekannt ist, kann so einfach funktionieren wie AppleScript
Die einfache Google-Suche ergab Folgendes:
Wenn es sich bei den Daten tatsächlich um eine HTML-Seite handelt und NICHT von ASP, PHP oder einer anderen Skriptsprache erstellt wurde und Sie Internet Explorer 6 verwenden und Excel auf Ihrem Computer installiert ist, klicken Sie einfach mit der rechten Maustaste auf die Seite und schauen Sie durch das Menü. Sie sollten "Export nach Microsoft Excel" sehen. Wenn alle diese Bedingungen erfüllt sind, klicken Sie auf den Menüpunkt und nach einigen Eingabeaufforderungen wird er in Excel importiert.
Wenn Sie das nicht können, gibt er eine alternative "Drag-and-Drop" -Methode:
Und jetzt gibt es einen besseren Weg.
OpenXML SDK für JavaScript.
Es gibt zwei praktische Möglichkeiten, dies automatisch zu tun, während in allen Browsern nur eine Lösung verwendet werden kann. Zunächst sollten Sie die offene XML-Spezifikation verwenden, um das Excel-Blatt zu erstellen. Es gibt kostenlose Plugins von Microsoft, die dieses Format auch für ältere Office-Versionen verfügbar machen. Die offene XML ist seit Office 2007 Standard. Die beiden Möglichkeiten liegen auf der Serverseite oder auf der Clientseite auf der Hand.
Die clientseitige Implementierung verwendet einen neuen CSS-Standard, mit dem Sie Daten anstelle nur der URL zu den Daten speichern können. Dies ist ein großartiger Ansatz, da Sie keinen Serveraufruf benötigen, nur die Daten und etwas Javascript. Der Nachteil ist, dass Microsoft in den aktuellen IE-Versionen (ich weiß nichts über IE9) nicht alle Teile davon unterstützt. Microsoft beschränkt die Daten auf ein Bild, wir benötigen jedoch ein Dokument. In Firefox funktioniert es ganz gut. Für mich war der IE der Todespunkt.
Die andere Möglichkeit besteht darin, eine serverseitige Implementierung zu verwenden. Es sollte viele Implementierungen von offenem XML für alle Sprachen geben. Sie müssen nur einen greifen. In den meisten Fällen ist es die einfachste Möglichkeit, ein Ansichtsmodell so zu ändern, dass ein Dokument erstellt wird. Sie können jedoch sicher alle Daten von der Clientseite an den Server zurücksenden und dasselbe tun.
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, '');
}