2016-03-07 3 views
1

Я пытаюсь использовать сетки компонент встроенной поддержки для экспорта в Excel, применяя пользовательское форматирование ячейки, как показано в этих Документах Telerik:Кендо UI Сетка - Excel Экспорт скрытых столбцов и пользовательского форматирования

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

подход с использованием жестко закодированных индексов строк/ячеек в экспорте поставляется с довольно очевидным вопросом при экспорте сетки с ранее скрытой колонке отображается - лучший способ воспроизвести это ссылаться на этот jsfiddle:

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

  1. Run скрипка
  2. Нажмите на экспорт, чтобы преуспеть - соблюдать пользовательское форматирование чисел
  3. Unhide подкатегория колонка (с помощью меню колонки)
  4. Нажмите на экспорт, чтобы преуспеть - соблюдать пользовательское форматирование чисел в столбце 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.

+0

Я не знаю, поможет ли эта ссылка, но я должен был написать свой собственный синтаксический анализатор и экспортер в Excel и PDF до официальной поддержки. Я думаю, что колонка/строка и рекурсивная группировка в основной структуре сетки остаются. Если вы можете распутать мой код много лет назад, вы можете обнаружить рекурсивную взаимосвязь между группами и столбцами. -> https://stackoverflow.com/questions/25753051/having-difficulty-creating-an-array-of-json-objects-for-use-in-a-kendo-grid/25753400#25753400 –

ответ

1

Это выглядит как ряд [0] является строка заголовка, так что вы можете попробовать изменить

if (cellIndex == 2) { 

в

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

EDIT:

Кажется, работает с группой колонки: 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/

Это, безусловно, имеет запах "латать" об этом.

+0

Это хорошая идея, но я не думаю, что она содержит для сеток, которые имеют группы столбцов, и/или группы строк (которые я допускаю, не был включен в пример оригинальной скрипты). В группе столбцов включена дополнительная строка заголовка, которая включает объединенные/растянутые ячейки, и, опять же, нет четкого способа расчета правильного индекса. Для группы строк дополнительный столбец включен в модель excel для создания столбца «пустой» группы. Я уточню вопрос с этими моментами, поскольку я после решения для всех конфигураций. – SteveChapman

+0

@SteveChapman Кажется, работает с группой столбцов (см. Скрипку). Я не знаю, как вы делаете группы строк. Возможно, вы могли бы проиллюстрировать код. – Fruitbat

+0

См. Этот пример (это обновление скрипта, которое вы использовали): https://jsfiddle.net/dwosrs0x/2/ – SteveChapman

Смежные вопросы