1

我正在尝试使用 Grid 组件的内置支持导出到 excel,应用自定义单元格格式,如这些 Telerik 文档中所示:

http://docs.telerik.com/kendo-ui/controls/data-management/grid/how-to/excel/cell-format

在导出中使用硬编码行/单元格索引的方法在导出显示先前隐藏列的网格时会出现一个相当明显的问题 - 重现的最佳方法是参考这个 jsfiddle:

https://jsfiddle.net/3anqpnqt/1/

  1. 运行小提琴
  2. 单击导出到 excel - 观察自定义数字格式
  3. 取消隐藏子类别列(使用列菜单)
  4. 单击导出到 excel - 观察第 2 列上的自定义数字格式,该列现在是“子类别”

参考小提琴中的这段代码:

$("#grid").kendoGrid({
    toolbar: ["excel"],
    excel: {
      fileName: "Grid.xlsx",
      filterable: true
    },
    columns: [
      { field: "productName" },
      { field: "category" },
      { field: "subcategory", hidden: true },
      { field: "unitPrice"}
    ],
    dataSource: [
      { productName: "Tea", category: "Beverages", subcategory: "Bev1", unitPrice: 1.5 },
      { productName: "Coffee", category: "Beverages", subcategory: "Bev2", unitPrice: 5.332 },
      { productName: "Ham", category: "Food", subcategory: "Food1", unitPrice: -2.3455 },
      { productName: "Bread", category: "Food", subcategory: "Food2", unitPrice: 6 }
    ],
    columnMenu: true,
    excelExport: function(e) {      
      var sheet = e.workbook.sheets[0];

      for (var rowIndex = 0; rowIndex < sheet.rows.length; rowIndex++) {
        var row = sheet.rows[rowIndex];
        var numericFormat = "#,##0.00;[Red](#,##0.00);-";
        for (var cellIndex = 0; cellIndex < row.cells.length; cellIndex++) {
            var cell = row.cells[cellIndex];
            if (row.type === "data") {
                if (cellIndex == 2) { // how are we able to identify the column without using indexes?
                    cell.format = numericFormat;
                    cell.hAlign = "right";
                }
            }
        }      
      }      
    }
});

我需要做的是将单元格标识为“unitPrice”并应用格式,但是在excelExport处理程序中检查对象模型并没有给我任何方法来建立这个链接。在我的实际应用程序中,我有几种自定义格式要应用(百分比、n0、n2 等),所以它不像去$.isNumeric(cell.value)或其他那样简单。

更新

我还需要使用列/行组的解决方案,这会在 Excel 模型中生成额外的标题行/列。

4

1 回答 1

1

看起来 row[0] 是标题行,因此您可以尝试更改

if (cellIndex == 2) {

if (sheet.rows[0].cells[cellIndex].value == "unitPrice") { 

编辑:

似乎与列组一起使用:https ://jsfiddle.net/dwosrs0x/

更新:

工作表的对象模型不是最清楚的。在我查看的各种场景中,第一行似乎确实是“主”标题行。如果 unitPrice 不在分组中,这似乎可行。如果 unitPrice 在一个分组中,那么涉及组标题(行 [1])的更复杂的事情可能是可能的。难题是找出所需列最终将占据的位置。

var header = sheet.rows[0];
var upIndex = -1;
var upFound = false;

for (var cellIndex = 0; cellIndex < header.cells.length; cellIndex++) {

    if ('colSpan' in header.cells[cellIndex]) 
        upIndex = upIndex + header.cells[cellIndex].colSpan;
    else 
        upIndex = upIndex + 1;

    if (header.cells[cellIndex].value == "unitPrice") { // wot we want
        upFound = true;
        break;
    }
}

for (var rowIndex = 0; rowIndex < sheet.rows.length; rowIndex++) {
    var row = sheet.rows[rowIndex];
    if (row.type === "data" && upFound) {
        var cell = row.cells[upIndex];
        cell.format = numericFormat;
        cell.hAlign = "right";
    }

}

摆弄团体 - https://jsfiddle.net/dwosrs0x/4/

摆弄简单的网格(证明它仍然有效) - https://jsfiddle.net/gde4nr0y/1/

这绝对有“bodge”的味道。

于 2016-03-07T13:36:10.537 回答