Split a “big” table to smaller tables

前端 未结 4 1762
走了就别回头了
走了就别回头了 2021-01-06 09:01

I would like to split a \"big\" table (a lot of columns) to smaller tables every for example 2 columns.

Is there an easy way to do that?

I only have the tab

相关标签:
4条回答
  • 2021-01-06 09:15

    using XSLT you can solve the problem easily.

    Please visit here: Split large table into several smaller tables

    0 讨论(0)
  • 2021-01-06 09:20

    This is much simpler.

    1) Mark the TR:

    <tr><td>some</td><!-- SPLITHERE -->
    

    2) Split the table:

    document.body.innerHTML = document.body.innerHTML.replace(/<!-- SPLITHERE --\>\s*<\/tr>/i, '</tr></table></div><div class="eachPage"><table class="items">');
    

    NOTE: that you have to do innerHTML change on the parent element of that table (body in my example), not the table itself, that would NOT work.

    0 讨论(0)
  • 2021-01-06 09:27
    function split($table, chunkSize) {
      var cols = $("th", $table).length - 1;
      var n = cols / chunkSize;
    
      for (var i = 1; i <= n; i++) {
         $("<br/>").appendTo("body");
         var $newTable = $table.clone().appendTo("body");
         for (var j = cols + 1; j > 1; j--) {
             if (j + chunkSize - 1 <= chunkSize * i || j > chunkSize * i + 1) {
                 $('td:nth-child(' + j + '),th:nth-child(' + j + ')', $newTable).remove();
             }
         }
      }  
    }
    

    Where $table is the table jQuery object, and chunkSize is the size of each split. In your example, call it as split($("table"), 2). Note that chunkSize must evenly divide the number of columns (excluding the first one) for this to work correctly, for example, for a table with 7 columns, the valid values for chunkSize are 1, 2, and 3.

    DEMO.

    0 讨论(0)
  • 2021-01-06 09:42

    I made better version of table split function that support fix columns (repeat in all tables) and it waste a lot of time:

    function range(start, end) {
      var array = new Array();
      for (var i = start; i <= end; i++) {
        array.push(i);
      }
      return array;
    }
    
    function splitTables($tables, chunkSize, fixCols) {
      $table = $($tables);
      console.log('fixCols :', fixCols);
      fixCols = fixCols || [];
      console.log('fixCols :', fixCols);
      fixCols = fixCols.sort();
      console.log('fixCols :', fixCols);
      //chunkSize -= fixCols.length;
      var rowLength = $('tr:first>*', $table).length;
      console.log('total length:', rowLength);
      var n = Math.ceil(rowLength / chunkSize);
      var bufferTables = [];
      var numberList = range(1, rowLength);
    
      for (var i = 1; i <= n; i++) {
        var colList = fixCols.slice(0);
        //console.log('fixCols :',fixCols);
        //console.log('colList :',colList);
        console.log('numberList :', numberList);
        while (colList.length < chunkSize && numberList.length > 0) {
          var index = numberList.shift();
          console.log(index, colList);
          if (colList.indexOf(index) == -1) {
            colList.push(index);
          }
        }
    
        console.log('col list:', colList);
        var $newTable = $table.clone(true)
        for (var index = 1;
          (index <= rowLength); index++) {
          if (colList.indexOf(index) == -1) {
            console.log('removing:', index);
            $('tr>:nth-child(' + index + ')', $newTable).hide();
          }
        }
        bufferTables.push($newTable)
      }
    
      $(bufferTables.reverse()).each(function(i, $el) {
        $('<br/>').insertAfter($table);
        $el.insertAfter($table);
      });
      $table.remove();
    
    }
    
    $(function() {
      $('#sbtn').click(function() {
        splitTables($("#tb"), 3, [1]);
      });
    })
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <button id="sbtn">Split Table !</button>
    
    <table border="1" id="tb">
      <thead>
        <tr>
          <th>0</th>
          <th>1</th>
          <th>2</th>
          <th>3</th>
          <th>4</th>
          <th>5</th>
          <th>6</th>
        </tr>
      </thead>
      <tfoot>
        <tr>
          <td>Sum</td>
          <td>$180</td>
          <td>$500</td>
          <td>$300</td>
          <td>$700</td>
          <td>$600</td>
          <td>$1000</td>
        </tr>
      </tfoot>
      <tbody>
        <tr>
          <td>Home</td>
          <td>$100</td>
          <td>$200</td>
          <td>$200</td>
          <td>$300</td>
          <td>$400</td>
          <td>$500</td>
        </tr>
        <tr>
          <td>Work</td>
          <td>$80</td>
          <td>$300</td>
          <td>$100</td>
          <td>$400</td>
          <td>$200</td>
          <td>$500</td>
        </tr>
      </tbody>
    </table>

    0 讨论(0)
提交回复
热议问题