3

HTMLテーブルをcsvファイルに保存する方法に取り組んでいます。理想的には、これはクロスブラウザーであるべきであり、私は Internet Explorer 以外のすべてで動作するようにしました。ただし、明らかな部分は機能しています。残っているのは、ダウンロードしたいデータの前にバイトオーダーマークが追加されているため、JavaScript から動作する csv ファイルを取得できないことです。

IE などで csv ファイルをダウンロードし、16 進エディタを使用して未加工のファイルを表示することで、これが事実であることを確認しました。

以下のコードを参照してください。saveTable は、テーブル内にある "<a>" ノードを取ります。

誰かが私が問題を診断し、解決策を提供するのを手伝ってくれるなら、私は感謝しています. 私の側の間違いを許してください、私はこれまでこのような性質のサイトを使用したことがないと思います. したがって、さらに情報を提供する必要がある場合は、お知らせください。ここに掲載できるよう最善を尽くします。

function findTable(node) { // Finds a nodes parent table.
  return (node.nodeName !== "TABLE") ? findTable(node.parentNode) : node;
}

function saveTable(node) {
  var csv = [];
  var table = findTable(node);
  var rows = table.getElementsByTagName("tr");
  var header = [];
  var csv = [];
  for (var i = 0; i < rows.length; i++) {
    if (i == 0) {
      // Do csv stuff.
      var dates = rows[i].getElementsByTagName("th");
      for (var j = 0; j < dates.length; j++) 
        (j == 0) ? header.push("") : header.push(dates[j].innerHTML);
      csv.push(header.join(","));
    }
    else {
      var rowArray = [];
      var jobName = rows[i].getElementsByTagName("th")[0].innerHTML;
      var times = rows[i].getElementsByTagName("td");
      rowArray.push(jobName);
      for (var k = 0; k < times.length; k++) 
        rowArray.push(times[k].innerHTML);
      csv.push(rowArray.join(","));
    }
  }

  node.setAttribute("href", "data:text/csv;charset=utf-8," + csv.join("%0A"));
  var fileName = "spreadsheet_data-" + (new Date).getTime() + ".csv";

  if (node.download == "") 
    node.setAttribute("download", fileName);
  else {
    alert("Handle IE here!");
    var bom = "\uFFFE";
    var doc = document.open("application/octet-stream", "_blank");
    var data = csv.join("\r\n");
    doc.charset = "UTF-8";
    doc.write(data.replace(bom, ""));
    doc.focus();
    doc.execCommand('SaveAs', false, fileName);
    doc.close();
  }
}

テーブルの例。これは私が自分で選択した方法ではありませんが、別のソフトウェアによってテーブルが生成される方法です。

<table id='results' border='1'>
<tr><th><a href='#' onClick='saveTable(this);' id='download_link'>Download data</a></th><th>2013/05/09</th><th>2013/05/10</th><th>2013/05/10</th><th>2013/05/10</th><th>2013/05/10</th></tr>
<tr>
<th>\PDF\EXOVIGN.PDF</th><td>8.853</td><td>9.050</td><td>8.807</td><td>8.827</td><td>8.835</td></tr>
</table>
4

1 に答える 1

1

これをクライアント側で行う絶対的な要件がない場合は、代わりにサーバーからファイルを送信することで、多くの手間を省くことができます。

于 2013-05-20T13:04:04.610 に答える