문제

내 페이지의 테이블에 대해 Excel로 내보내기 옵션을 제공하기 위해 Datatables TableTools 플러그인을 사용하고 있습니다.

일반적으로 모든 것이 의도한 대로 작동합니다.내 유일한 문제는 모든 데이터가 필요하다는 것입니다.결과 Excel 테이블의 열은 텍스트 형식으로 지정됩니다. 그렇지 않으면 일부 열의 데이터가 손실됩니다.

예: - 앞에 0이 있는 열이 있습니다(예: 0022) 앞의 0이 잘린 상태로만 나타납니다(예: 22) 텍스트 형식이 아닌 경우 Excel 파일에 포함됩니다.- 또 다른 열에는 19자리 계좌번호가 포함되어 있습니다(예: 1234567890123456789)는 마지막 4자리 숫자가 0으로 변경되어 나타납니다(예: 1234567890123450000) 텍스트 형식이 아닌 경우 Excel 파일에 포함됩니다.

항상 모든 데이터를 Excel 파일에 텍스트로 내보낼 수 있도록 Datatables/TableTools 초기화에서 이를 설정할 수 있는 방법이 있습니까?

도움을 주셔서 감사합니다, Tim.

도움이 되었습니까?

해결책

TableTools는 진짜 excel 파일을 생성합니다. csv 대신 파일.여기에는 서식이 없는 원시 데이터만 포함됩니다.앞에 0이 있더라도 Excel에서는 일반적으로 이를 표시하지 않습니다.여기에는 몇 가지 옵션이 있습니다.

  • Excel 내에서 서식 변경
  • 열어 csv 열을 텍스트로 표시할 수 있어야 하는 Excel의 열린 대화 상자에서 파일을 선택합니다(파일 형식을 다음으로 변경해야 할 수도 있음). txt)
  • 데이터 주위에 따옴표 추가
  • 만들기 진짜 일부 외부 라이브러리를 통한 Excel 파일

다른 팁

나는 Aureltime에서 제공한 첫 번째 옵션을 시도했지만 약간의 부작용을 발견했습니다.열에 숫자만 포함되어 있고 렌더링 기능을 사용하는 경우 정렬 옵션이 작동하지 않습니다.1.10.12 데이터 테이블 버전에는 Excel 파일을 생성하기 전에 데이터를 사용자 정의할 수 있는 새로운 옵션이 있기를 바랍니다.

이 사용자 정의 기능에 /u002C를 추가했는데 숫자 정렬까지 완벽하게 작동합니다.

        "buttons": [{
            extend: 'excel',
            exportOptions: {
                orthogonal: 'sort'
            },
            customizeData: function ( data ) {
                for (var i=0; i<data.body.length; i++){
                    for (var j=0; j<data.body[i].length; j++ ){
                        data.body[i][j] = '\u200C' + data.body[i][j];
                    }
                }
            }               
            }],

나는 이 문제에 대한 해결책을 가지고 있습니다.

머리가 너무 많이 부러졌는데...그래서 설명은 다음과 같습니다.

  1. 수정 사항은 DatatableJS 버전 1.10.11(HTML Excel 내보내기 옵션의 경우)에서 제대로 작동합니다.
  2. datatables.js를 열고 다음을 검색하세요."DataTable.ext.buttons.excelHtml5 = {"
  3. 이 코드를 가져올 때까지 다음 줄을 검색하고 주석을 추가합니다.

             cells.push( typeof row[i] === 'number' || (row[i].match && $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) && row[i].charAt(0) !== '0') ?
                '<c t="n"><v>'+row[i]+'</v></c>' :
                '<c t="inlineStr"><is><t>'+(
                    ! row[i].replace ?
                        row[i] :
                        row[i]
                            .replace(/&(?!amp;)/g, '&amp;')
                            .replace(/</g, '&lt;')
                            .replace(/>/g, '&gt;')
                            .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''))+ // remove control characters
                '</t></is></c>'                                                      // they are not valid in XML
            );
    
  4. 다음 새 코드를 입력하세요.

                cells.push( '<c t="inlineStr"><is><t>'+(
                            ! row[i].replace ?
                                row[i] :
                                row[i]
                                    .replace(/&(?!amp;)/g, '&amp;')
                                    .replace(/</g, '&lt;')
                                    .replace(/>/g, '&gt;')
                                    .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, ''))+ // remove control characters
                        '</t></is></c>'                                                      // they are not valid in XML
                    );
    
  5. datatables.js를 저장하세요.

  6. 당신의 거룩한 텍스트 셀을 영원히 즐기십시오!!

이 솔루션은 숫자, 날짜 및 소수 형식을 유지하는 데 도움이 됩니다.

HTML의 모든 값을 XLSX에 텍스트 형식으로 강제로 쓰도록 코드를 변경했습니다.

누구든지 이 솔루션에 대해 질문이 있으면 모든 질문에 답변해 드리겠습니다.

모두에게 감사드립니다.

Richards 답변을 확장하고 싶습니다.Richard와 마찬가지로 나도 Datatables 문서를 기반으로 솔루션을 찾을 수 없었습니다.모든 필드를 텍스트로만 내보내는 excelHtml5 내보내기를 원했습니다.
Richards 솔루션은 제가 아래에 게시할 솔루션을 찾는 데 도움이 되었습니다.

Datatables 1.10.12의 경우 html5 버튼 코드는 별도의 파일인button.html5.js에 나타납니다.

Richard가 언급했듯이 DataTable.ext.buttons.excelHtml5 블록을 검색하세요.

내가 관심을 보인 코드는 다음과 같습니다.

// Detect numbers - don't match numbers with leading zeros or a negative
// anywhere but the start
if ( typeof row[i] === 'number' || (
        row[i].match &&
        $.trim(row[i]).match(/^-?\d+(\.\d+)?$/) &&
        ! $.trim(row[i]).match(/^0\d+/) )
) {
    cell = _createNode( rels, 'c', {
        attr: {
            t: 'n',
            r: cellId
        },
        children: [
            _createNode( rels, 'v', { text: row[i] } )
        ]
    } );
}
else {
    // Replace non standard characters for text output
    var text = ! row[i].replace ?
        row[i] :
        row[i]
            .replace(/&(?!amp;)/g, '&amp;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');

    cell = _createNode( rels, 'c', {
        attr: {
            t: 'inlineStr',
            r: cellId
        },
        children:{
            row: _createNode( rels, 'is', {
                children: {
                    row: _createNode( rels, 't', {
                        text: text
                    } )
                }
            } )
        }
    } );
}

excelHtml5 버튼이 텍스트만 내보내도록 하기 위해 필드를 잠재적인 숫자로 식별하는 IF 블록을 제거했습니다.또한 고객은 비어 있는 필드에 '<>'를 포함해 달라는 특정 요청을 받았으므로 < 및 >에 대한 두 가지 교체 방법을 제거했습니다.

// Replace non standard characters for text output
var text = ! row[i].replace ?
    row[i] :
    row[i]
        .replace(/&(?!amp;)/g, '&amp;')
        .replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');

cell = _createNode( rels, 'c', {
    attr: {
        t: 'inlineStr',
        r: cellId
    },
    children:{
        row: _createNode( rels, 'is', {
            children: {
                row: _createNode( rels, 't', {
                    text: text
                } )
            }
        } )
    }
} );

이 변경을 통해 Excel 버튼을 사용하면 모든 값을 텍스트로 내보낼 수 있습니다.Excel에서는 더 이상 < 및 >를 전환하지 않으며 내 숫자는 과학적 표기법이 아닌 모두 텍스트입니다.

이 특정 문제는 이 게시물에서 우아하게 답변되었습니다. https://stackoverflow.com/a/165052/6169225.정수가 있다고 가정 해 봅시다. your_integer 문자열로 표시하려는 항목(예:앞에 0이 표시됨)그런 다음 Excel로 내보내기 전에 간단히 형식을 지정하십시오. ="<your_integer>".Excel 문서가 자동 다운로드되면 정수는 이 방법을 사용하여 이미 문자열로 표시됩니다.

업데이트 :

datatables 1.10.8 및 Buttons API 도입부터 tabletools는 더 이상 사용되지 않으며 버튼 API를 통해 이를 수행하는 방법은 다음과 같습니다.

여기에서 데모를 해보세요

몇 가지 옵션을 허용하는 내보내기 옵션 매개변수를 사용하여 Excel 버튼을 확장합니다. 하나는 '정렬' 유형을 사용해야 한다고 말할 수 있는 경우 직교입니다.

exportOptions: {
                orthogonal: 'sort'
            }

정렬 유형을 정확하게 정의해야 하고 columnDefs 데이터 테이블 옵션으로 영향을 받아야 하는 열은 다음과 같습니다.

columnDefs: [{
       targets:[1],
       render: function(data, type, row, meta){
          if(type === 'sort'){
             //data = ' ' + data ;
              return "\u200C" + data ; 
          }

          return data ;   

       }
    }]

여기서는 두 번째 열(인덱스가 0인)이 고려됩니다.'정렬' 유형의 경우 날짜 앞에 ZERO WIDTH NON-JOINER를 붙이므로 Excel에서는 이를 문자열로 간주합니다.어떤 부작용도 발견하지 못했습니다.

즐기다

데이터 테이블의 tabletools 플러그인을 통해 이를 수행하는 방법이 있습니다.

사용 Excel에서 특정 텍스트 값을 날짜로 자동 변환하는 것을 중지합니다. ,

그리고 fncellender 버튼 옵션의 경우 해결책은 다음과 같이 xls 버튼에 fnCellRender 옵션을 사용하는 것입니다.

{
"sExtends":    "xls", 
"fnCellRender": function ( sValue, iColumn, nTr,iDataIndex ) {
     if ( iColumn === colIndexOfString ) {
         return '"=""' + sValue + '"""' ;
         }
     return sValue;
     }
}

이 방법을 사용하면 Excel에서 문자열로 간주하고 자동 유형 감지를 사용하지 않도록 하는 데 필요한 특수 문자를 사용하여 데이터가 csv 파일로 추출됩니다.

그리고 네, 이제 선행 및 후행 0을 유지할 수 있습니다.

특수 문자를 사용하여 데이터 테이블을 CSV로 표현하는 솔루션입니다.다음에서 문자세트 찾기 https://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.js 또는 https://cdn.datatables.net/buttons/1.1.2/js/buttons.html5.min.js

그리고 그것을로 변경 UTF-8-BOM ~에서 UTF-8

19자리 숫자의 경우 문제는 실제로 Excel에서 데이터를 열 때 숫자를 반올림하는 것입니다.자세한 내용과 가능한 해결 방법은 이 스레드를 참조하세요. https://datatables.net/forums/discussion/comment/132633#Comment_132633

아래 코드는 사용자 정의 옵션으로 텍스트 파일로 내보내기를 사용하여 쿼리 데이터 테이블을 생성하는 데 도움이 됩니다.또한 기본 복사본, Excel, CSV도 포함되어 있습니다.

     $('#tableid').DataTable({
           buttons: [
                {
                    extend: 'copyHtml5',
                    filename: function() {
                        return "Copy Table";
                    }
                },
                {
                    extend: 'excelHtml5',

                    filename: function() {
                        return "Export To Excel";
                    }
                },
                {
                    extend: 'csvHtml5',

                    filename: function() {
                        return "Export to CSV";
                    }
                },
                {
                    text: 'Text',
                    footer: false,
                    header: false,
                    exportOptions: {
                        orthogonal: 'sort'
                    },
                    action: function(e, dt, node, config) {

                        var data = dt.buttons.exportData();
                        var retContent = [];
                        var retString = '';
                        for (var i = 0; i < data.body.length; i++) {
                            var text = '\u200C' + data.body[i];
                            retContent.push(text);
                        }
                        retString = retContent.join(',\r\n');
                        $.fn.dataTable.fileSave(
                            new Blob( [ retString ] ),
                            "Export to text"+ ".txt"
                        );
                    }
                }
            ]
        });

포함된 라이브러리는 다음과 같습니다.

  1. datatables.min.js
  2. dataTables.bootstrap4.min.js
  3. dataTables.buttons.min.js
  4. 버튼.flash.min.js
  5. jszip.min.js
  6. vfs_fonts.js
  7. 버튼.html5.min.js

이 링크의 라이브러리 위에서 발견되었습니다. https://editor.datatables.net/examples/extensions/exportButtons

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top