【问题标题】:Kendo excel export - how do I export columns with a custom template?Kendo excel 导出 - 如何使用自定义模板导出列?
【发布时间】:2016-09-06 18:39:40
【问题描述】:

我有一个明确定义的剑道网格。 我通过data-toolbar='["excel"]'启用了excel导出工具栏

问题是这只会导出没有定义模板的字段。 (下面网格中的前 3 个:检查点、位置、巡逻者),其他列显示在 excel 文档中,但这些列的单元格都是空的。

如何让值显示在 excel 导出中?我猜它需要在导出 excel 之前进行某种预处理,因为 excel 导出功能不会解释我的自定义字段 html 模板。

<div id="Checkpoints">
    <div 
        ...
        data-toolbar='["excel"]'
        data-excel='{ "fileName": "CheckpointExceptionExport.xlsx", "allPages": "true" }'
        ...
        data-columns='[
            {
                "field": "checkpoint_name", 
                "title": "Checkpoint", 
                "filterable": { "cell": { "operator": "contains"}}},
            {
                "field": "location_name", 
                "title": "Location", 
                "filterable": { "cell": { "operator": "contains"}}
            },
            {
                "field": "patrolled_by", 
                "title": "Patrolled By", 
                "filterable": { "cell": { "operator": "contains"}}
            },
            {
                "field": "geotag",
                "title": "GeoTag", 
                "template": kendo.template($("#geotagTemplate").html()) 
            },
            {
                "field": "geofence",
                "title": "GeoFence",   
                "template": kendo.template($("#geofenceTemplate").html())
            },
            {
                "field": "completed",
                "title": "Completed",
                "template": kendo.template($("#completedTemplate").html())
            },
            {
                "field": "gps",
                "title": "GPS", 
                "template": kendo.template($("#gpsTemplate").html())
            }
        ]'>
    </div>
</div>

我遇到了这个用于处理 excel 导出事件的 sn-p,但是我没有看到以我定义网格的方式使用这个事件处理程序的方法。

 <script>
      $("#grid").kendoGrid({
        excelExport: function(e) {
          ...
        },

      });
    </script>

【问题讨论】:

    标签: javascript html excel kendo-ui kendo-grid


    【解决方案1】:

    检查http://docs.telerik.com/kendo-ui/controls/data-management/grid/excel-export#limitations,它解释了为什么会发生这种情况并说明如何进行。

    在 Excel 导出过程中,网格不使用列模板,它只导出数据。此行为的原因是列模板可能包含无法转换为 Excel 列值的任意 HTML。有关如何使用不包含 HTML 的列模板的更多信息,请参阅此column template example

    更新

    为了在使用声明式小部件初始化时附加 Kendo UI 事件处理程序,请使用data-bind HTML 属性和event binding

    <div
        data-role="grid"
        data-bind="events: { excelExport: yourExcelExportHandler }">
    </div>
    

    查看Kendo UI Grid MVVM demo 以获取类似示例。

    yourExcelExportHandler应该是viewModel中定义的函数,类似于上例中的onSave

    excelExport 事件也可以附加after widget initialization

    【讨论】:

    • 如果您查看我的答案的底部,我引用了该文章中提到的相同解决方案,并且我不知道如何按照我声明的方式实现它网格(通过标记而不是脚本)
    • 好的,所以问题不是“如何将列模板导出到 Excel”,而是“如何使用声明性 Grid 初始化附加事件处理程序”。查看我的更新回复。
    • 在哪里定义yourExcelExportHandler 函数?我无法调用函数...
    • 我刚才注意到您提供了定义函数的方法。我无法访问各个列的模板,以便我可以将模板应用于值并放入电子表格中。引用的文章假设该函数是在定义列的同一上下文中定义的,因此它们调用this.columns[i].template,我假设我需要找到网格并访问诸如$("#Checkpoints").kendoGrid().columns 之类的列,但这不起作用.. . 如何访问模板的网格列?
    • excelExport 事件提供access to the Grid instance via this or e.sender。通常你不必再次获取 Grid 实例,但如果你真的需要,不要使用kendoGrid(),因为这会创建一个新的 Grid 实例。相反,请使用$("selector").data("kendoGrid")。 “选择器”应该指向网格&lt;div&gt;。从你的代码来看,这不是"#Checkpoints",而是它的孩子。
    【解决方案2】:

    我在 Telerik 的网站上找到了这个很棒的答案:https://docs.telerik.com/kendo-ui/knowledge-base/grid-export-arbitrary-column-templates。他们的辅助函数使用精确的模板文本导出到 excel。

    $(document).ready(function() {
      $("#grid").kendoGrid({
        dataSource: {
          type: "odata",
          transport: {
            read: "https://demos.telerik.com/kendo-ui/service/Northwind.svc/Orders"
          },
          schema: {
            model: {
              fields: {
                OrderDate: {
                  type: "date"
                }
              }
            }
          },
          pageSize: 20,
          serverPaging: true
        },
        height: 550,
        toolbar: ["excel"],
        excel: {
          allPages: true
        },
        excelExport: exportGridWithTemplatesContent,
        pageable: true,
        columns: [{
            field: "Freight",
            hidden: true
          },
          {
            field: "OrderID",
            filterable: false
          },
          {
            field: "OrderDate",
            title: "Order Date",
            template: "<em>#:kendo.toString(OrderDate, 'd')#</em>"
          }, {
            field: "ShipName",
            title: "Ship Name",
            template: "#:ShipName.toUpperCase()#"
          }, {
            field: "ShipCity",
            title: "Ship City",
            template: "<span style='color: green'>#:ShipCity#, #:ShipCountry#</span>"
          }
        ],
        columnMenu: true
      });
    });
    
    function exportGridWithTemplatesContent(e) {
      var data = e.data;
      var gridColumns = e.sender.columns;
      var sheet = e.workbook.sheets[0];
      var visibleGridColumns = [];
      var columnTemplates = [];
      var dataItem;
      // Create element to generate templates in.
      var elem = document.createElement('div');
    
      // Get a list of visible columns
      for (var i = 0; i < gridColumns.length; i++) {
        if (!gridColumns[i].hidden) {
          visibleGridColumns.push(gridColumns[i]);
        }
      }
    
      // Create a collection of the column templates, together with the current column index
      for (var i = 0; i < visibleGridColumns.length; i++) {
        if (visibleGridColumns[i].template) {
          columnTemplates.push({
            cellIndex: i,
            template: kendo.template(visibleGridColumns[i].template)
          });
        }
      }
    
      // Traverse all exported rows.
      for (var i = 1; i < sheet.rows.length; i++) {
        var row = sheet.rows[i];
        // Traverse the column templates and apply them for each row at the stored column position.
    
        // Get the data item corresponding to the current row.
        var dataItem = data[i - 1];
        for (var j = 0; j < columnTemplates.length; j++) {
          var columnTemplate = columnTemplates[j];
          // Generate the template content for the current cell.
          elem.innerHTML = columnTemplate.template(dataItem);
          if (row.cells[columnTemplate.cellIndex] != undefined)
            // Output the text content of the templated cell into the exported cell.
            row.cells[columnTemplate.cellIndex].value = elem.textContent || elem.innerText || "";
        }
      }
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://kendo.cdn.telerik.com/2022.1.119/js/kendo.all.min.js"></script>
    <script src="https://kendo.cdn.telerik.com/2022.1.119/js/jszip.min.js"></script>
    <link href="https://kendo.cdn.telerik.com/2022.1.119/styles/kendo.default-v2.min.css" rel="stylesheet" />
    
    <div id="grid"></div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多