TableTools экспортирует только одну строку заголовка - PullRequest
4 голосов
/ 05 октября 2011

Я использую плагин jquery DataTables

У меня есть DataTable, в котором есть многострочный заголовок таблицы с colspan.Что-то вроде:

<thead>
  <tr>
    <th>Level 1</th>
    <th colspan='2'>Level 1 - Item 1</th>
    <th colspan='2'>Level 1 - Item 2</th>
  </tr>
  <tr>
    <th>Level 2</th>
    <th>Level 2 - Item 1a</th>
    <th>Level 2 - Item 1b</th>
    <th>Level 2 - Item 2a</th>
    <th>Level 2 - Item 2b</th>
  </tr>
</thead>

Однако, когда я использую плагин TableTools для экспорта, кроме опции «Печать», все остальные (Excel, CSV, Pdf и т. Д.) Имеют только строку заголовка «Уровень 2» ине Уровень 1.

Любые предложения о том, как заставить его экспортировать также Уровень 1?

Ответы [ 4 ]

2 голосов
/ 11 февраля 2013

Если вы хотите экспортировать level1 также и в Excel, есть альтернативный способ:

Замените rowspan / colspan пустыми ячейками, такими как:

   <thead>
      <tr>
        <th>Level 1</th>
        <th>Level 1 - Item 1</th>
        <th></th>
        <th>Level 1 - Item 2</th>
        <th></th>
      </tr>
      <tr>
        <th>Level 2</th>
        <th>Level 2 - Item 1a</th>
        <th>Level 2 - Item 1b</th>
        <th>Level 2 - Item 2a</th>
        <th>Level 2 - Item 2b</th>
      </tr>
    </thead>

Тогда, как предложено @misiuвыше, отредактируйте TableTools.js.
Найдите _fnGetDataTablesData и внутри него измените это:

if (oConfig.bHeader) { ... }

следующим образом:

if (oConfig.bHeader) {
    //another loop
    for (i = 0, rowCount = dt.nTHead.rows.length; i < rowCount; i++) {
        aRow = []; //clear row data
        for (j = 0, iLen = dt.aoColumns.length; j < iLen; j++) {
            if (aColumnsInc[j] && dt.nTHead.rows[i].children[j] !== null) {
                sLoopData = dt.nTHead.rows[i].children[j].innerHTML.replace(/\n/g, " ")
                    .replace(/<.*?>/g, "")
                    .replace(/^\s+|\s+$/g, "");
                sLoopData = this._fnHtmlDecode(sLoopData);
                aRow.push(this._fnBoundData(sLoopData, oConfig.sFieldBoundary, regex));
            } else {
                aRow.push(this._fnBoundData("", oConfig.sFieldBoundary, regex)); //I'm not shure of this!!
            }
        }
        aData.push(aRow.join(oConfig.sFieldSeperator));
    }
}

Это скопирует / экспортируетсложные заголовки в CSV / Excel.Хотя пустые ячейки таблицы останутся пустыми в Excel и не будут объединены.Вы можете вручную объединить их.

Хотя это и не идеальное решение, на данный момент это отлично работает для меня.

1 голос
/ 01 октября 2012

Отредактируйте TableTools.js.
Найдите _fnGetDataTablesData и внутри него измените это:

if (oConfig.bHeader) {
    aRow = [];

    for (i = 0, iLen = dt.aoColumns.length; i < iLen; i++) {
        if (aColumnsInc[i]) {
            sLoopData = dt.aoColumns[i].sTitle.replace(/\n/g, " ")
                .replace(/<.*?>/g, "")
                .replace(/^\s+|\s+$/g, "");
            sLoopData = this._fnHtmlDecode(sLoopData);

            aRow.push(this._fnBoundData(sLoopData, oConfig.sFieldBoundary, regex));
        }
    }

    aData.push(aRow.join(oConfig.sFieldSeperator));
}

на это:

if (oConfig.bHeader) {

    //another loop
    for (i = 0, rowCount = dt.nTHead.rows.length; i < rowCount; i++) {
        aRow = []; //clear row data
        for (j = 0, iLen = dt.aoColumns.length; j < iLen; j++) {
            if (aColumnsInc[j] && dt.nTHead.rows[i].children[j] !== null) {
                sLoopData = dt.nTHead.rows[i].children[j].innerHTML.replace(/\n/g, " ")
                    .replace(/<.*?>/g, "")
                    .replace(/^\s+|\s+$/g, "");
                sLoopData = this._fnHtmlDecode(sLoopData);
                aRow.push(this._fnBoundData(sLoopData, oConfig.sFieldBoundary, regex));
            } else {
                aRow.push(this._fnBoundData("", oConfig.sFieldBoundary, regex)); //I'm not shure of this!!
            }
        }
        aData.push(aRow.join(oConfig.sFieldSeperator));
    }
}

Я не могу проверить эту точку сейчастак что попробуйте.
Я обновлю свой ответ, когда получу лучшее решение от Аллана.

0 голосов
/ 31 декабря 2014

Посмотрите на этот ответ https://datatables.net/forums/discussion/22592/export-multiple-row-headers С помощью этого фрагмента кода вы сможете экспортировать все ячейки из заголовка, а colspan и rowspans будут преобразованы в пустые ячейки:)

0 голосов
/ 05 декабря 2012
if ( oConfig.bHeader )
    {
        //-1 because we don't want the last row header
        for (i=0; i<dt.nTHead.rows.length-1; i++)
        {
            //wrap jquery object
            $(dt.nTHead.rows[i]).find('th').each(function(){
           var th = $(this);
           sData += th.text().replace(/\n/g," ").replace( /<.*?>/g, "" ).replace(/^\s+|\s+$/g,"");

           var colspan = th.attr('colspan');
           if (!colspan) colspan = 1; //default colspan is 1

           //only the first colspan have the label, other colspans are empty text, we can't implement cell mergin in csv file
           for (j=0; j<colspan; j++)
           {
                 sData += oConfig.sFieldSeperator;
           }
        });

        sData += sNewline;
        }

        for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
        {
            if ( aColumnsInc[i] )
            {
                sLoopData = dt.aoColumns[i].sTitle.replace(/\n/g," ").replace( /<.*?>/g, "" ).replace(/^\s+|\s+$/g,"");
                sLoopData = this._fnHtmlDecode( sLoopData );

                sData += this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) +
                    oConfig.sFieldSeperator;
            }
        }
        sData = sData.slice( 0, oConfig.sFieldSeperator.length*-1 );
        sData += sNewline;
    }
...