Custom Cell Content

The [FlexGrid] control allows you to include custom cell content when exporting your data into PDF format. The FlexGridPdfConverter allows you to control whether or not custom content gets exported with IFlexGridDrawSettings' customCellContent property, as well as format the cells when you export the FlexGrid by using the formatItem property.

Learn about FlexGrid | FlexGrid API Reference

import 'bootstrap.css'; import '@grapecity/wijmo.styles/wijmo.css'; import './styles.css'; import * as grid from '@grapecity/wijmo.grid'; import * as gridPdf from '@grapecity/wijmo.grid.pdf'; import { getData } from './data'; // document.readyState === 'complete' ? init() : window.onload = init; // function init() { var exportSettings = { maxPages: 10, documentOptions: { header: { declarative: { text: '\t&[Page]\\&[Pages]' } }, footer: { declarative: { text: '\t&[Page]\\&[Pages]' } } } }; // let flexGrid = new grid.FlexGrid('#flexGrid', { autoGenerateColumns: false, headersVisibility: grid.HeadersVisibility.All, selectionMode: grid.SelectionMode.ListBox, columns: [ { header: 'ID', binding: 'id' }, { header: 'Country', binding: 'country', width: "*", isReadOnly: true }, { header: 'Product', binding: 'product' }, { header: 'Color', binding: 'color' } ], formatItem: (sender, e) => { if (e.panel === sender.cells && sender.columns[e.col].binding === 'country') { let data = e.panel.rows[e.row].dataItem; // e.cell.textContent = ''; // // add flag image let image = document.createElement('img'); image.src = `resources/${data['country']}.png`; e.cell.appendChild(image); // // add non-breaking space e.cell.appendChild(document.createTextNode('\u00A0')); // // add text e.cell.appendChild(document.createTextNode(`${data['country']}-${data['capital']}`)); } }, itemsSource: getData(5) }); // // document.querySelector('#btnExport1').addEventListener('click', () => { exportSettings.customCellContent = false; gridPdf.FlexGridPdfConverter.export(flexGrid, 'FlexGrid.pdf', exportSettings); }); // document.querySelector('#btnExport2').addEventListener('click', () => { exportSettings.customCellContent = true; gridPdf.FlexGridPdfConverter.export(flexGrid, 'FlexGrid.pdf', exportSettings); }); // document.querySelector('#btnExport3').addEventListener('click', () => { exportSettings.customCellContent = false; exportSettings.formatItem = formatCountryCell; gridPdf.FlexGridPdfConverter.export(flexGrid, 'FlexGrid.pdf', exportSettings); exportSettings.formatItem = null; }); // function formatCountryCell(args) { // if this is a regular grid cell... if (args.panel.cellType === grid.CellType.Cell) { // ... that belongs to the 'country' column if (args.panel.columns[args.col].binding === 'country') { let // get cell with custom content produced by a cell template or grid.formatItem handler cell = args.getFormattedCell(), // bound rectangle of cell's content area contentRect = args.contentRect, // construct flag image url based on country name passed in args.data image = args.canvas.openImage(`resources/${args.data}.png`), imageTop = contentRect.top + (contentRect.height - image.height) / 2; // draw flag image args.canvas.drawImage(image, contentRect.left, imageTop); // Draw custom cell text retrieved using the cell.textContent property, // right to the image and in the args.textTop vertical position. The latter // works because we draw text using default cell font. args.canvas.drawText(cell.textContent.trim(), contentRect.left + image.width + 3, args.textTop); // cancel standard cell content drawing args.cancel = true; } } } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Custom cell content</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div class="container-fluid"> <!-- Export button --> <div class="row"> <button class="btn btn-default" id="btnExport1">Export (customCellContent = false)</button> <button class="btn btn-default" id="btnExport2">Export (customCellContent = true)</button> <button class="btn btn-default" id="btnExport3">Export (customCellContent = false + formatItem callback)</button> </div> <!-- FlexGrid --> <div id="flexGrid" class="grid"></div> </div> </body> </html>
export function getData(count) { // data used to generate random items const countries = ['US', 'Germany', 'UK', 'Japan', 'Italy', 'Greece']; const capitals = ['Washington', 'Berlin', 'London', 'Tokyo', 'Rome', 'Athens']; const products = ['Widget', 'Gadget', 'Doohickey']; const colors = ['Orange', 'White', 'Red', 'Green', 'Blue']; // let data = []; // // add count items for (let i = 0; i < count; i++) { // constants used to create data items let countryId = Math.floor(Math.random() * countries.length), productId = Math.floor(Math.random() * products.length), colorId = Math.floor(Math.random() * colors.length); // // create the item let item = { id: i, country: countries[countryId], capital: capitals[countryId], product: products[productId], color: colors[colorId] }; // // add the item to the list data.push(item); } // return data; }
body { margin-bottom: 24px; } .grid { margin-top: 6px; height: 200px; } .btn { margin: 2px 2px 2px 0; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'jszip': 'npm:jszip/dist/jszip.js', '@grapecity/wijmo': 'npm:@grapecity/wijmo/index.js', '@grapecity/wijmo.input': 'npm:@grapecity/wijmo.input/index.js', '@grapecity/wijmo.styles': 'npm:@grapecity/wijmo.styles', '@grapecity/wijmo.cultures': 'npm:@grapecity/wijmo.cultures', '@grapecity/wijmo.chart': 'npm:@grapecity/wijmo.chart/index.js', '@grapecity/wijmo.chart.analytics': 'npm:@grapecity/wijmo.chart.analytics/index.js', '@grapecity/wijmo.chart.animation': 'npm:@grapecity/wijmo.chart.animation/index.js', '@grapecity/wijmo.chart.annotation': 'npm:@grapecity/wijmo.chart.annotation/index.js', '@grapecity/wijmo.chart.finance': 'npm:@grapecity/wijmo.chart.finance/index.js', '@grapecity/wijmo.chart.finance.analytics': 'npm:@grapecity/wijmo.chart.finance.analytics/index.js', '@grapecity/wijmo.chart.hierarchical': 'npm:@grapecity/wijmo.chart.hierarchical/index.js', '@grapecity/wijmo.chart.interaction': 'npm:@grapecity/wijmo.chart.interaction/index.js', '@grapecity/wijmo.chart.radar': 'npm:@grapecity/wijmo.chart.radar/index.js', '@grapecity/wijmo.chart.render': 'npm:@grapecity/wijmo.chart.render/index.js', '@grapecity/wijmo.chart.webgl': 'npm:@grapecity/wijmo.chart.webgl/index.js', '@grapecity/wijmo.chart.map': 'npm:@grapecity/wijmo.chart.map/index.js', '@grapecity/wijmo.gauge': 'npm:@grapecity/wijmo.gauge/index.js', '@grapecity/wijmo.grid': 'npm:@grapecity/wijmo.grid/index.js', '@grapecity/wijmo.grid.detail': 'npm:@grapecity/wijmo.grid.detail/index.js', '@grapecity/wijmo.grid.filter': 'npm:@grapecity/wijmo.grid.filter/index.js', '@grapecity/wijmo.grid.search': 'npm:@grapecity/wijmo.grid.search/index.js', '@grapecity/wijmo.grid.grouppanel': 'npm:@grapecity/wijmo.grid.grouppanel/index.js', '@grapecity/wijmo.grid.multirow': 'npm:@grapecity/wijmo.grid.multirow/index.js', '@grapecity/wijmo.grid.transposed': 'npm:@grapecity/wijmo.grid.transposed/index.js', '@grapecity/wijmo.grid.transposedmultirow': 'npm:@grapecity/wijmo.grid.transposedmultirow/index.js', '@grapecity/wijmo.grid.pdf': 'npm:@grapecity/wijmo.grid.pdf/index.js', '@grapecity/wijmo.grid.sheet': 'npm:@grapecity/wijmo.grid.sheet/index.js', '@grapecity/wijmo.grid.xlsx': 'npm:@grapecity/wijmo.grid.xlsx/index.js', '@grapecity/wijmo.grid.selector': 'npm:@grapecity/wijmo.grid.selector/index.js', '@grapecity/wijmo.grid.cellmaker': 'npm:@grapecity/wijmo.grid.cellmaker/index.js', '@grapecity/wijmo.nav': 'npm:@grapecity/wijmo.nav/index.js', '@grapecity/wijmo.odata': 'npm:@grapecity/wijmo.odata/index.js', '@grapecity/wijmo.olap': 'npm:@grapecity/wijmo.olap/index.js', '@grapecity/wijmo.rest': 'npm:@grapecity/wijmo.rest/index.js', '@grapecity/wijmo.pdf': 'npm:@grapecity/wijmo.pdf/index.js', '@grapecity/wijmo.pdf.security': 'npm:@grapecity/wijmo.pdf.security/index.js', '@grapecity/wijmo.viewer': 'npm:@grapecity/wijmo.viewer/index.js', '@grapecity/wijmo.xlsx': 'npm:@grapecity/wijmo.xlsx/index.js', '@grapecity/wijmo.undo': 'npm:@grapecity/wijmo.undo/index.js', '@grapecity/wijmo.interop.grid': 'npm:@grapecity/wijmo.interop.grid/index.js', '@grapecity/wijmo.touch': 'npm:@grapecity/wijmo.touch/index.js', '@grapecity/wijmo.cloud': 'npm:@grapecity/wijmo.cloud/index.js', '@grapecity/wijmo.barcode': 'npm:@grapecity/wijmo.barcode/index.js', '@grapecity/wijmo.barcode.common': 'npm:@grapecity/wijmo.barcode.common/index.js', '@grapecity/wijmo.barcode.composite': 'npm:@grapecity/wijmo.barcode.composite/index.js', '@grapecity/wijmo.barcode.specialized': 'npm:@grapecity/wijmo.barcode.specialized/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);