WebページからExcelにテーブルをエクスポートする方法[終了]


97

WebページからExcelにテーブルをエクスポートするにはどうすればよいですか。エクスポートにすべてのフォーマットと色を含めたい。


9
最も簡単な方法は、おそらくExcelで開くことができるHTMLドキュメントをエクスポートすることです。
ペッカ

@Pekka私はそれを試しました、それはすべてのフォーマット/ css /列サイズなどを失います
code511788465541441

3
@userどこで列サイズなどを宣言していますか?Excelへのデータのエクスポートについてはあまり詳しくありませんが、インラインで宣言する必要があるかもしれません。つまり、<td style="background-color: ...
Pekka

@user-ここには少なくとも2つの異なる問題があります。1)Excelで正しく表示されるようにデータをフォーマットすること、2)JavaScriptを使用してデータをエクスポートし、MIMEタイプを正しく設定して、ユーザーにファイルの保存を促すこと。これらの問題の両方を解決しようとしていますか?
nrabinowitz

10
なぜこれが「意見ベース」と見なされたのですか?これは非常に簡単な技術的な質問です。
brandizzi 2014

回答:


75

テーブルから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を推奨することはできません。


2
DataTablesは完全にJavascriptです。TableTools要素だけがFlashを使用しており、それはごくわずかです。私の製品では決してFlashを喜んで使用しません!
bpeterson76 2011

16
理解し、同意します。しかし、それでも-非常に微妙ですが-.swfオブジェクトがあり、Flashなしでは実行できません。
マグマ

8
素晴らしいソリューションですが、Flashが必要なのは残念です。
jnthnclrk 2012年

こんにちは、完全な例を示すことができますか?私は例がなければそれを機能させるにはあまりにも初心者です!
NoobTom 2014

1
@PramodGaikwad、いや、DatatablesはNG-tableを置き換えるでしょう。それらは事実上同じ機能ですが、DatatablesはFARがより成熟し、多くの機能を備えています。Angular専用に作成されたDatatablesのスピンオフがあります:l-lin.github.io/angular-datatables
#

42

ずっと前に、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>

それをファイルに保存し、ボタンをクリックします。私は思い愛する私もそれが機能しなかったことを言ってコメントをお願いして、それが働いたかどうかを知るために。


11
最後に置換を追加して機能させる:window.open( 'data:application / vnd.ms-excel、' + document.getElementById( 'table')。outerHTML.replace(/ / g、 '%20')) ;
VSP

6
代替方法(推奨):window.open( 'data:application / vnd.ms-excel、' + encodeURIComponent(document.getElementById( 'table')。outerHTML));
VSP

5
Firefoxで完全に機能し、テーブルをdivでラップしてdocument.getElementById('id').innerHTMLから、idを呼び出してテーブルのみを選択的に取得します。そうしないと、すべてのものがスプレッドシートにエクスポートされます。古いIEでは機能しませんが、タイトルにすべてのhtmlが含まれる新しいウィンドウを開くだけです
Abraham Brookes

1
このシンプルなソリューションは問題なく機能します。ファイル名を設定できるようにするために、この重複する質問を見て、ワークシート名も設定してください。同じタイプのソリューション。stackoverflow.com/questions/17126453/...
エスペンSchulstad

2
より厳格なセキュリティ対策により、Office 365では機能しなくなりました。ExcelファイルはTRUEのExcelドキュメントでなければなりません。そうでない場合、開くときにエラーがスローされます。
Phil

12

古いExcel 2003 XML形式(OpenXMLより前)を使用して目的のXMLを含む文字列を作成し、クライアント側でデータURIを使用して、XSL MIMEタイプを使用してファイルを開くか、ファイルを送信できます。サーバー側からExcel mimetype "Content-Type:application / vnd.ms-excel"を使用してクライアントに送信します。

  1. Excelを開き、目的の書式設定と色でワークシートを作成します。
  2. Excelブックを「XMLスプレッドシート2003(* .xml)」として保存します
  3. 結果のファイルをメモ帳などのテキストエディターで開き、値をアプリケーションの文字列にコピーします。
  4. データuriでクライアント側のアプローチを使用すると仮定すると、コードは次のようになります。
    
    <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>
    
    
  5. 次に、文字列置換を使用して、ワークシートテンプレートに挿入される行のコレクションを作成できます。
    
    <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>
    
    
  6. 情報を収集したら、最終的な文字列を作成し、データ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'を追加する必要があります。


OpenXMLを使用するのは良いことですが、このソリューションは、javascriptジェネレーターに多くの作業を行わないと、colspansまたはrowspansを含むテーブルでは機能しません
Eduardo Molteni

1
プラグインを使用するように指示するのではなく、私に何かを教えてくれてありがとう、高く評価されています。このアプローチが今日でもうまく機能することは言及する価値があります。
Benjamin Gruenbaum 2015

興味深い、このアプローチを試してみました。<?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:テーブル> 1つのセルのすべての行を含む、1つのセルに文字列が書き込まれた値 何が欠けていますか?
CromeX 2017年

6

Excelには「Webクエリ」と呼ばれるあまり知られていない機能があり、追加のプログラミングなしでほぼ​​すべてのWebページからデータを取得できます。

基本的に、WebクエリはExcel内から直接HTTP要求を実行し、受信したデータ(およびオプションで書式設定)の一部またはすべてをワークシートにコピーします。

Webクエリを定義したら、Excelを離れることなく、いつでもそれを更新できます。そのため、実際にデータを「エクスポート」してファイルに保存する必要はありません。データベースと同じようにデータを更新する必要があります。

Excelで特定のフィルター基準などを要求することで、URLパラメーターを利用することもできます...

ただし、これまでに気付いた短所は次のとおりです。

  • JavaScriptが実行されないため、動的にロードされたデータにアクセスできません
  • URLの長さに制限があります

ここでは、ExcelでのWebクエリを作成する方法についての質問です。Webページから外部データを取得する方法に関するMicrosoftヘルプサイトにリンクしています


これは、URLがログインウォールの背後にある場合も機能しません。
Achshar

基本認証とフォームベース認証で機能しますが、後者では、「クエリの編集」をクリックして資格情報を再入力し、時間から新しいCookieを取得する必要がある場合があります
HAL 9000

5

これは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); ?>    

5

まず、Htmlをエクスポートすることお勧めしません。ユーザーのExcelのインスタンスがそれを取得することを期待しています。この解決策は、Macintoshクライアントとの非互換性や、問題のファイルが指定された形式ではないというエラーをユーザーにスローするなどの問題に満ちているという私の経験。最も防弾でユーザーフレンドリーなソリューションはサーバー側のソリューションで、ライブラリを使用して実際のExcelファイルを作成し、それをユーザーに送り返します。次善のソリューションであり、より一般的なソリューションは、Open XML形式を使用することです。以前のバージョンのExcelでいくつかのまれな互換性の問題に遭遇しましたが、全体として、これはMacを含むすべてのバージョンのExcelで機能するソリューションを提供するはずです。

オープンXML


4

mozillaは依然としてbase 64 URIをサポートしています。これにより、javascriptを使用してバイナリコンテンツを動的に作成できます。

<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>

あなたのExcelファイルがあまり凝っていない場合(図、数式、マクロ)、フォーマットを掘り下げてファイルのバイトを作成し、base64でエンコードしてhrefに入れることができます

https://developer.mozilla.org/en/data_URIsを参照して ください


2

これは、あなたが思っているよりも実際には単純です。HTMLテーブル(つまり、テーブルのHTMLコード)をクリップボードに「そのまま」コピーします。ExcelはHTMLテーブルをデコードする方法を知っています。属性の保存も試みます。

JavaScriptからクリップボードにアクセスする標準的な方法がないため、難しいのは「テーブルをクリップボードにコピーする」ことです。このブログ投稿を参照してください:JavaScriptを使用してシステムクリップボードにアクセスする–聖杯ですか?

これで、必要なのはHTMLとしてのテーブルだけです。jQueryとhtml()メソッドをお勧めします。


2

このコードは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>

私はこのコードを使用してみましたが、テーブルをExcelで開きましたが、正しい形式ではなく、HTMLコードをテーブルにコピーしただけのように見えます。このように:<TD class = "" bgColor =#ed9fff> SARTIN、DAN </ TD> <TD class = "" bgColor =#ed9fff> BALAEZ、BARBARA </ TD>何か提案はありますか?
Fahad

それは彼がinnerHTMLを使用したためです。彼が取得する要素はテーブルなので、outerHTMLである必要があります。私は編集を行いました
user1566694

ActiveXObjectの作成中に「オートメーションサーバーはオブジェクトを作成できません」というエラーが表示されます。どうすれば修正できますか?
Nk SP 2014

2

仮定:

  1. 指定されたURL

  2. 変換はクライアント側で行う必要があります

  3. システムは、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と同じくらい簡単に機能しません。


1

単純なグーグル検索はこれを明らかにしました:

データが実際にはHTMLページであり、ASP、PHP、またはその他のスクリプト言語によって作成されておらず、Internet Explorer 6を使用していて、コンピューターにExcelがインストールされている場合は、ページを右クリックして確認しますメニューから。「Microsoft Excelにエクスポート」が表示されます。これらの条件がすべて当てはまる場合は、メニュー項目をクリックすると、いくつかのプロンプトの後にExcelにインポートされます。

それができない場合は、別の「ドラッグアンドドロップ」メソッドを使用します。

http://www.mrkent.com/tools/converter/



0

すべてのブラウザで使用できるソリューションは1つだけですが、これを自動的に行うには2つの実用的な方法があります。まず、open xml仕様を使用して、Excelシートを作成する必要があります。このフォーマットを古いバージョンのOfficeでも利用できるようにするMicrosoftの無料のプラグインがあります。オープンxmlはOffice 2007以降の標準です。2つの方法は、サーバーサイドとクライアントサイドのどちらにあるかが明らかです。

クライアント側の実装では、CSSの新しい標準を使用して、データへのURLだけでなく、データを保存できます。これは、サーバーコールを必要としない優れたアプローチです。データといくつかのJavaScriptだけです。致命的な欠点は、現在のIE(IE9については知らない)リリースでは、Microsoftがそのすべての部分をサポートしていないことです。Microsoftはデータを画像に制限していますが、ドキュメントが必要です。Firefoxでは、これは非常にうまく機能します。私にとって、IEはキリングポイントでした。

もう1つの方法は、サーバーサイド実装を使用することです。すべての言語に対して、オープンXMLの実装がたくさんあるはずです。あなただけのものをつかむ必要があります。ほとんどの場合、これはViewmodelを変更してDocumentを生成する最も簡単な方法ですが、確実にすべてのデータをクライアントサイドからサーバーに送信して、同じことを行うことができます。


反対票を投じる理由は何ですか?
sra

0
   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, '');
   }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.