2014-11-08 65 views
0

我正在使用this code將表格保存爲CSV(我已將其更改爲包含標題並排除隱藏行)。表格單元格內的某處換行符會丟失,但我想將其保留爲\ r \ n。網上有很多類似的問題,但我仍然覺得jQuery有點神祕,不知何故我無法找到解決這個希望簡單的問題的方法。如何用 r n替換所有<br />使用jQuery

function exportTableToCSV($table, delimiter) { 

    var $rows = $table.find('tr:visible'); 

    // Temporary delimiter characters unlikely to be typed by keyboard 
    // This is to avoid accidentally splitting the actual contents 
    var tmpColDelim = String.fromCharCode(11), // vertical tab character 
    tmpRowDelim = String.fromCharCode(0), // null character 

    // actual delimiter characters for CSV format 
    colDelim = '"' + delimiter + '"', 
    rowDelim = '"\r\n"', 

    // Grab text from table into CSV formatted string 
    csv = '"' + $rows.map(function (i, row) { 
     var $row = $(row), 
     $cols = $row.find('td, th'); 

     return $cols.map(function (j, col) { 
      var $col = $(col), 
      text = $col.text(); 

      return text.replace(/"/g, '""'); // escape double quotes 

     }).get().join(tmpColDelim); 

    }).get().join(tmpRowDelim) 
    .split(tmpRowDelim).join(rowDelim) 
    .split(tmpColDelim).join(colDelim) + '"', 

    // Data URI 
    csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv); 
    return csvData; 
} 
+1

的jQuery沒有任何字符串處理函數這樣的。你應該使用普通的Javascript String.prototype.replace()方法。 – Barmar 2014-11-08 19:57:50

+1

順便說一句,'text.replace('''''''')只會替換第一個引號,而不是所有的引號。您必須使用帶'g'修飾符的正則表達式來執行多個替換。 – Barmar 2014-11-08 19:58:50

+0

謝謝,我已經改正了。 – 2014-11-10 03:16:45

回答

0

這就是br元件得到剝離:

var $col = $(col), 
    text = $col.text(); 

一個解決辦法是用一個標記來代替它們,然後用\r\n替換標記:

var $col, text; 

$col = $(col).clone(); 
$col.find("br").replaceWith("<div>{{MARKER}}</div>"); 
text = $col.text().replace(/{{MARKER}}/g, "\r\n"); 

  • 克隆的元素,所以我們可以改變它在不改變文件

  • 查找其中的所有br元素

  • {{MARKER}}替換它們中的每一個div裏面

  • 獲取文本,其中將有{{MARKER}}其中br s曾經是

  • 替換{{MARKER}}\r\n

function exportTableToCSV($table, delimiter) { 
 

 
    var $rows = $table.find('tr:visible'); 
 

 
    // Temporary delimiter characters unlikely to be typed by keyboard 
 
    // This is to avoid accidentally splitting the actual contents 
 
    var tmpColDelim = String.fromCharCode(11), // vertical tab character 
 
    tmpRowDelim = String.fromCharCode(0), // null character 
 

 
    // actual delimiter characters for CSV format 
 
    colDelim = '"' + delimiter + '"', 
 
    rowDelim = '"\r\n"', 
 

 
    // Grab text from table into CSV formatted string 
 
    csv = '"' + $rows.map(function (i, row) { 
 
     var $row = $(row), 
 
     $cols = $row.find('td, th'); 
 

 
     return $cols.map(function (j, col) { 
 
      var $col, text; 
 
      
 
      $col = $(col).clone(); 
 
      $col.find("br").replaceWith("<div>{{MARKER}}</div>"); 
 
      text = $col.text().replace(/{{MARKER}}/g, "\r\n"); 
 

 
      return text.replace(/"/g, '""'); // escape double quotes 
 

 
     }).get().join(tmpColDelim); 
 

 
    }).get().join(tmpRowDelim) 
 
    .split(tmpRowDelim).join(rowDelim) 
 
    .split(tmpColDelim).join(colDelim) + '"', 
 

 
    // Data URI 
 
    csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv); 
 
    return csvData; 
 
} 
 

 
snippet.log(exportTableToCSV($("table"), ","));
table { 
 
    border-collapse: collapse; 
 
    border: 1px solid black; 
 
} 
 
td { 
 
    border: 1px solid black; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<!-- Temporary snippet object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> 
 
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td>Testing</td> 
 
     <td>One</td> 
 
     <td>Two and<br>three</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

+0

@TomasoAlbinoni:啊,我沒意識到你沒有'
' - 我已經更新了答案。 – 2014-11-09 07:42:25

+0

完美,非常感謝! – 2014-11-09 21:18:25