使用jquery datatable导出时如何更改excel文件的文档作者

qvtsj1bj  于 2023-06-22  发布在  jQuery
关注(0)|答案(1)|浏览(153)

Datatable是一个允许我们对HTML表格进行格式化、搜索和排序的库。它还允许您下载各种格式的文件。我过去使用过一些其他的excel库,它们允许你更新excel元数据或其他一些属性。在我的情况下,我只是想看看是否有一种方法可以在下载之前更改Excel文档的作者:

我确实读了他们的button export documentation,它没有显示在任何地方更改作者的选项。我只是想知道是否有一种方法可以自定义此导出以在那里添加该信息。

cdmah0mi

cdmah0mi1#

要将“作者”(和其他相关信息)添加到导出的Excel文件中,需要对Excel(.xlsx)文档中包含的基础XML文件执行一些低级编辑。
要访问底层.xlsx文档结构,请使用以下DataTables customize选项:

buttons: [
  {
    extend: 'excel',
    title: '',
    customize: function ( xlsx ) {
        ...
    }

通过解压缩,您可以自己看到.xlsx文档的结构。
Author信息存储在名为docProps的目录中名为core.xml的文件中。默认情况下,DataTables Excel文件不包含此文件(或其包含目录),因此我们需要创建它们:

const coreXmlStr = 
        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + 
        '<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
            '<dc:creator>John Smith;Jane Jones</dc:creator>' + 
            '<cp:lastModifiedBy>John Smith</cp:lastModifiedBy>' + 
            '<dcterms:created xsi:type="dcterms:W3CDTF">2023-06-14T17:51:33Z</dcterms:created>' + 
            '<dcterms:modified xsi:type="dcterms:W3CDTF">2023-06-14T17:53:15Z</dcterms:modified>' + 
        '</cp:coreProperties>';

const parser = new window.DOMParser();
const coreXmlDoc = parser.parseFromString( coreXmlStr, 'text/xml' );

xlsx.docProps = {};
xlsx.docProps['core.xml'] = coreXmlDoc;

coreXmlStr是包含各种信息字段的XML字符串。你可以把你想要的任何值放在里面。我的例子有两个作者:

John Smith;Jane Jones

JavaScript将这个XML字符串解析为实际的XML文档,然后将其添加到docProps目录中的新core.xml文件中。xlsx对象表示包含的Excel文件。
我们还需要设置一些额外的关系元数据,以便Excel实际使用此信息:

var contentTypes = xlsx['[Content_Types].xml'];
$( 'Types', contentTypes ).append( '<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>' );

var rels = xlsx._rels['.rels'];
$( 'Relationships', rels ).append( '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>' );

整体代码:

$(document).ready(function() {

  $('#myTable').DataTable( {
    dom: 'Bfrtip',
    buttons: [
        {
          extend: 'excel',
          title: '',
          customize: function ( xlsx ) {
 
            const coreXmlStr = 
                   '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + 
                   '<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
                       '<dc:creator>John Smith;Jane Jones</dc:creator>' + 
                       '<cp:lastModifiedBy>John Smith</cp:lastModifiedBy>' + 
                       '<dcterms:created xsi:type="dcterms:W3CDTF">2023-06-14T17:51:33Z</dcterms:created>' + 
                       '<dcterms:modified xsi:type="dcterms:W3CDTF">2023-06-14T17:53:15Z</dcterms:modified>' + 
                   '</cp:coreProperties>';

            const parser = new window.DOMParser();
            const coreXmlDoc = parser.parseFromString( coreXmlStr, 'text/xml' );

            xlsx.docProps = {};
            xlsx.docProps['core.xml'] = coreXmlDoc;

            var contentTypes = xlsx['[Content_Types].xml'];
            $( 'Types', contentTypes ).append( '<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>' );

            var rels = xlsx._rels['.rels'];
            $( 'Relationships', rels ).append( '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>' );
          }
        }
    ]
  } );

});

在导出的Excel文件中,我们可以看到:

相关问题