WebページからExcelにテーブルをエクスポートするにはどうすればよいですか。エクスポートにすべてのフォーマットと色を含めたい。
<td style="background-color: ...
WebページからExcelにテーブルをエクスポートするにはどうすればよいですか。エクスポートにすべてのフォーマットと色を含めたい。
<td style="background-color: ...
回答:
テーブルからExcelへの最もクリーンで簡単なエクスポートは、Jquery DataTablesテーブルツールプラグインです。 データの並べ替え、フィルター、注文、ページングを行うグリッドが得られ、数行の追加コードと2つの小さなファイルが含まれているだけで、Excel、PDF、CSV、クリップボード、プリンターにエクスポートできます。
これが必要なすべてのコードです:
$(document).ready( function () {
$('#example').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
}
} );
} );
そのため、展開が迅速で、ブラウザの制限はなく、サーバー側の言語は必要ありません。何よりも理解するのが非常に簡単です。それは双方に有利です。ただし、制限があるのは、列の厳密なフォーマットです。
書式設定と色が絶対的な違いである場合、私が見つけた唯一の100%信頼できるクロスブラウザーの方法は、サーバー側の言語を使用してコードから適切なExcelファイルを処理することです。私が選択したソリューションはPHPExcelです。 これは、HTML以外に何も指定しない場合に、ブラウザーからExcelの最新バージョンへのフォーマットを使用したエクスポートを積極的に処理する唯一の方法です。ただし、はっきりさせておきますが、これは最初のソリューションほど簡単ではなく、リソースを少し消費します。ただし、プラス側では、PDFに直接出力することもできます。そして、一度設定すれば、常に機能します。
更新-2016年9月15日: 「ボタン」と呼ばれる新しいプラグインのためにTableToolsは廃止されました。これらのツールは古いTableTools拡張機能と同じ機能を実行しますが、インストールがはるかに簡単で、最新のブラウザーでHTML5ダウンロードを利用します。 HTML5標準をサポートしていないブラウザ用の元のFlashダウンロードにフォールバックする機能を備えています。2011年にこの回答を投稿してからの多くのコメントからわかるように、TableToolsの主な弱点は解消されています。それでも、開発者とユーザーの両方にとって、大量のデータを単純に処理するのに十分なDataTablesを推奨することはできません。
ずっと前に、Excelのコンテンツタイプで送信すると、Excelがテーブルを含むHTMLファイルを開くことを発見しました。上記のドキュメントを検討してください:
<!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>
その上で次のブックマークレットを実行しました。
javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);
実際、Excelファイルとしてダウンロードできました。しかし、期待した結果が得られませんでした。ファイルはOpenOffice.org Writerで開いていました。それが私の問題です。このマシンにはExcelがないので、うまく試すことができません。また、このトリックは多かれ少なかれ6年前の古いブラウザーとMS Officeの旧バージョンで機能していたため、今日機能するかどうかは本当にわかりません。
とにかく、上のドキュメントに、理論的にはドキュメント全体をExcelファイルとしてダウンロードするボタンを追加しました。
<!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>
それをファイルに保存し、ボタンをクリックします。私は思い愛する私もそれが機能しなかったことを言ってコメントをお願いして、それが働いたかどうかを知るために。
document.getElementById('id').innerHTML
から、idを呼び出してテーブルのみを選択的に取得します。そうしないと、すべてのものがスプレッドシートにエクスポートされます。古いIEでは機能しませんが、タイトルにすべてのhtmlが含まれる新しいウィンドウを開くだけです
古いExcel 2003 XML形式(OpenXMLより前)を使用して目的のXMLを含む文字列を作成し、クライアント側でデータURIを使用して、XSL MIMEタイプを使用してファイルを開くか、ファイルを送信できます。サーバー側からExcel mimetype "Content-Type:application / vnd.ms-excel"を使用してクライアントに送信します。
<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>
情報を収集したら、最終的な文字列を作成し、データURIを使用して新しいウィンドウを開きます
<script type="text/javascript"> var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
window.open('data:application/vnd.ms-excel,'+worksheet); </script>
古いブラウザはデータURIスキームをサポートしていないため、それをサポートしていないブラウザのファイルサーバー側を作成する必要がある場合があります。
データURIコンテンツのbase64エンコーディングを実行する必要がある場合もあります。これには、jsライブラリが必要になる場合があります。また、データURIのMIMEタイプの後に文字列 '; base64'を追加する必要があります。
Excelには「Webクエリ」と呼ばれるあまり知られていない機能があり、追加のプログラミングなしでほぼすべてのWebページからデータを取得できます。
基本的に、WebクエリはExcel内から直接HTTP要求を実行し、受信したデータ(およびオプションで書式設定)の一部またはすべてをワークシートにコピーします。
Webクエリを定義したら、Excelを離れることなく、いつでもそれを更新できます。そのため、実際にデータを「エクスポート」してファイルに保存する必要はありません。データベースと同じようにデータを更新する必要があります。
Excelで特定のフィルター基準などを要求することで、URLパラメーターを利用することもできます...
ただし、これまでに気付いた短所は次のとおりです。
ここでは、ExcelでのWebクエリを作成する方法についての質問です。Webページから外部データを取得する方法に関するMicrosoftヘルプサイトにリンクしています
これはphpですが、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); ?>
まず、Htmlをエクスポートすることはお勧めしません。ユーザーのExcelのインスタンスがそれを取得することを期待しています。この解決策は、Macintoshクライアントとの非互換性や、問題のファイルが指定された形式ではないというエラーをユーザーにスローするなどの問題に満ちているという私の経験。最も防弾でユーザーフレンドリーなソリューションはサーバー側のソリューションで、ライブラリを使用して実際のExcelファイルを作成し、それをユーザーに送り返します。次善のソリューションであり、より一般的なソリューションは、Open XML形式を使用することです。以前のバージョンのExcelでいくつかのまれな互換性の問題に遭遇しましたが、全体として、これはMacを含むすべてのバージョンのExcelで機能するソリューションを提供するはずです。
mozillaは依然としてbase 64 URIをサポートしています。これにより、javascriptを使用してバイナリコンテンツを動的に作成できます。
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
あなたのExcelファイルがあまり凝っていない場合(図、数式、マクロ)、フォーマットを掘り下げてファイルのバイトを作成し、base64でエンコードしてhrefに入れることができます
これは、あなたが思っているよりも実際には単純です。HTMLテーブル(つまり、テーブルのHTMLコード)をクリップボードに「そのまま」コピーします。ExcelはHTMLテーブルをデコードする方法を知っています。属性の保存も試みます。
JavaScriptからクリップボードにアクセスする標準的な方法がないため、難しいのは「テーブルをクリップボードにコピーする」ことです。このブログ投稿を参照してください:JavaScriptを使用してシステムクリップボードにアクセスする–聖杯ですか?
これで、必要なのはHTMLとしてのテーブルだけです。jQueryとhtml()メソッドをお勧めします。
このコードはIEのみであるため、すべてのユーザーがIEを使用することがわかっている場合にのみ役立ちます(たとえば、一部の企業環境など)。
<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>
仮定:
指定されたURL
変換はクライアント側で行う必要があります
システムは、Windows、Mac、Linuxです。
Windowsのソリューション:
IEウィンドウを開いてアクセスできるPythonコード:theurl変数にはURL( 'http://')が含まれています
ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)
注:ページに直接アクセスできないが、ログインしている場合は、フォームデータを入力し、Pythonでユーザーアクションをエミュレートすることによって、これを処理する必要があります。
ここに例があります
from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw
Webページからのデータの取得と同じ方法。id 'el1'の要素にデータが含まれているとしましょう。要素テキストを変数に取得します
el1 = ie.Document.all('el1').value
次に、データがpython変数にある場合、pythonを使用して同様の方法でExcel画面を開くことができます。
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
Macのソリューション:
ヒントのみ:AppleScriptを使用-win32com.client Dispatchと同様のシンプルなAPIを使用
Linuxのソリューション:
java.awt.Robotは、クリック、キープレス(ホットキーを使用できます)で機能する可能性がありますが、私が認識しているLinux用のAPIは、AppleScriptと同じくらい簡単に機能しません。
単純なグーグル検索はこれを明らかにしました:
データが実際にはHTMLページであり、ASP、PHP、またはその他のスクリプト言語によって作成されておらず、Internet Explorer 6を使用していて、コンピューターにExcelがインストールされている場合は、ページを右クリックして確認しますメニューから。「Microsoft Excelにエクスポート」が表示されます。これらの条件がすべて当てはまる場合は、メニュー項目をクリックすると、いくつかのプロンプトの後にExcelにインポートされます。
それができない場合は、別の「ドラッグアンドドロップ」メソッドを使用します。
すべてのブラウザで使用できるソリューションは1つだけですが、これを自動的に行うには2つの実用的な方法があります。まず、open xml仕様を使用して、Excelシートを作成する必要があります。このフォーマットを古いバージョンのOfficeでも利用できるようにするMicrosoftの無料のプラグインがあります。オープンxmlはOffice 2007以降の標準です。2つの方法は、サーバーサイドとクライアントサイドのどちらにあるかが明らかです。
クライアント側の実装では、CSSの新しい標準を使用して、データへのURLだけでなく、データを保存できます。これは、サーバーコールを必要としない優れたアプローチです。データといくつかのJavaScriptだけです。致命的な欠点は、現在のIE(IE9については知らない)リリースでは、Microsoftがそのすべての部分をサポートしていないことです。Microsoftはデータを画像に制限していますが、ドキュメントが必要です。Firefoxでは、これは非常にうまく機能します。私にとって、IEはキリングポイントでした。
もう1つの方法は、サーバーサイド実装を使用することです。すべての言語に対して、オープンXMLの実装がたくさんあるはずです。あなただけのものをつかむ必要があります。ほとんどの場合、これはViewmodelを変更してDocumentを生成する最も簡単な方法ですが、確実にすべてのデータをクライアントサイドからサーバーに送信して、同じことを行うことができます。
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, '');
}