Skip to content

Exporting to excel with [email protected] #6581

Open
@pvpatil31

Description

@pvpatil31

I recently upgraded to [email protected] to use export to excel. The issue with this is it expects ExcelBuiler to be global, I am using webpack and typescript. Package https://github.com/stephenliberty/excel-builder.js gives build error so I used excel-builder-ts instead because of which I have to use latest [email protected]

Since it is not available globally, I just mimic code from UI-Grid to export to excel as follows and call it from gridMenuCustomItems

`var jszip = require('jszip');
var ExcelBuilder = require('excel-builder-ts/ExcelBuilder.js');

public exportExcel(): void {
var exportColumnHeaders = this.gridApi.grid.options.showHeader ? this.uiGridExporterService.getColumnHeaders(this.gridApi.grid, this.uiGridExporterConstants.ALL) : [];

    var workbook = ExcelBuilder.createWorkbook();
    var aName = this.gridApi.grid.options.exporterExcelSheetName ? this.gridApi.grid.options.exporterExcelSheetName : 'Sheet1';
    var sheet = workbook.createWorksheet({ name: aName });
    workbook.addWorksheet(sheet);
    var docDefinition = this.uiGridExporterService.prepareAsExcel(this.gridApi.grid, workbook, sheet);

    // The standard column width in Microsoft Excel 2000 is 8.43 characters based on fixed-width Courier font
    // Width of 10 in excel is 75 pixels
    var colWidths = [];
    var startDataIndex = this.gridApi.grid.treeBase ? this.gridApi.grid.treeBase.numberLevels : (this.gridApi.grid.enableRowSelection !== false ? 1 : 0);
    for (var i = startDataIndex; i < this.gridApi.grid.columns.length; i++) {
        colWidths.push({ width: (this.gridApi.grid.columns[i].drawnWidth / 75) * 10 });
    }
    sheet.setColumns(colWidths);

    var exportData = this.uiGridExporterService.getData(this.gridApi.grid, this.uiGridExporterConstants.ALL, this.uiGridExporterConstants.ALL, this.gridApi.grid.options.exporterFieldApplyFilters);

    var excelContent = this.uiGridExporterService.formatAsExcel(exportColumnHeaders, exportData, workbook, sheet, docDefinition);
    sheet.setData(sheet.data.concat(excelContent));

    let options = { type: 'blob', base64: true }

    ExcelBuilder.createFile(jszip, workbook, options).then((result) => {
        this.uiGridExporterService.downloadFile(
            this.gridApi.grid.options.exporterExcelFilename,
            result,
            this.gridApi.grid.options.exporterCsvColumnSeparator,
            this.gridApi.grid.options.exporterOlderExcelCompatibility);
    });
}`

And in columnDefs -
columnDefs: [ gridMenuCustomItems: [ { title: this.gettextCatalog.getString('Export all data as custom'), order: 210, action: (($event) => { this.exportExcel(); }) } ] ]

But the issue with this is jszip is complaining "Error: No output type specified."
When I debug jszip code following is not able to extend options to opt to have type as blob.

opts = utils.extend(options || {}, { streamFiles: false, compression: "STORE", compressionOptions : null, type: "", platform: "DOS", comment: null, mimeType: 'application/zip', encodeFileName: utf8.utf8encode });

when this executes opt.type is empty and jszip throws error Error: No output type specified.

I would really appreciate any suggestion.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions