React Pegar cuadrícula de Excel

    El Ignite UI for ReactIgrGrid puede leer datos de Excel que se copian al portapapeles. En esta sección te mostraremos cómo hacerlo con algo de código personalizado.

    React Paste from Excel Example

    Este ejemplo demuestra cómo implementar la pegada desde Excel en laIgrGrid tabla de Material UI. Para trabajar con la muestra, abre cualquier hoja de cálculo de Excel, copia algunas filas y pégalo en la cuadrícula usando el teclado (CTRL + V, SHIFT + INSERT,+). CMD​ ​V

    En la parte superior hay un botón desplegable con 2 opciones:

    1. "Pegar datos como filas nuevas": en este modo, cualquier dato copiado de Excel se agregará a la cuadrícula como filas nuevas.
    2. "Pegar desde la celda activa": en este modo se sobrescribirán los datos de la cuadrícula.

    Los nuevos datos después del pegado están decorados en cursiva.

    Usage

    Primero deberías vincular al evento derendered la cuadrícula para crear y gestionar un elemento de área de texto:

    <IgrGrid autoGenerate={false} data={this.invoicesData} onRendered={this.webGridPasteFromExcel} ref={this.gridRef} id="grid" primaryKey="OrderID">
        <IgrGridToolbar>
            <IgrGridToolbarActions>
                <IgrGridToolbarExporter exportExcel={true} exportCSV={false}>
                </IgrGridToolbarExporter>
            </IgrGridToolbarActions>
        </IgrGridToolbar>
        <IgrColumn field="OrderID" hidden={true}></IgrColumn>
        <IgrColumn field="Salesperson" header="Name" width="200px"></IgrColumn>
        <IgrColumn field="ShipName" header="Ship Name" width="200px"></IgrColumn>
        <IgrColumn field="Country" header="Country" width="200px"></IgrColumn>
        <IgrColumn field="ShipCity" header="Ship City" width="200px"></IgrColumn>
        <IgrColumn field="PostalCode" header="Postal Code" width="200px"> </IgrColumn>
    </IgrGrid>
    
    public webGridPasteFromExcel(e: CustomEvent<any>) {
        const grid = e.target as IgrGrid;
        this.onKeyDown = this.onKeyDown.bind(this);
        grid.addEventListener("keydown", this.onKeyDown);
    }
    public onKeyDown(eventArgs: any): void {
        const ctrl = eventArgs.ctrlKey;
        const key = eventArgs.keyCode;
        // Ctrl-V || Shift-Ins || Cmd-V
        if ((ctrl || eventArgs.metaKey) && key === 86 || eventArgs.shiftKey && key === 45) {
            this.textArea.focus();
        }
    }
    
    private txtArea: any;
    
    public get textArea() {
        if(!this.txtArea) {
                const div = document.createElement("div");
                const divStyle = div.style;
                divStyle.position = "fixed";
                document.body.appendChild(div);
                this.txtArea = document.createElement("textarea");
                const style = this.txtArea.style;
                style.opacity = "0";
                style.height = "0px";
                style.width = "0px";
                style.overflow = "hidden";
                div.appendChild(this.txtArea);
    
                this.txtArea.addEventListener("paste", (eventArgs: any) => { this.onPaste(eventArgs); });
            }
            return this.txtArea;
        }
    

    El código crea un elemento de área de texto DOM que se utiliza para recibir los datos pegados del portapapeles. Cuando los datos se pegan en el área de texto, el código los analiza en una matriz.

    public onPaste(eventArgs: any) {
        let data;
        const clData: any = "clipboardData";
    
        // get clipboard data - from window.cliboardData for IE or from the original event's arguments.
        if (window[clData]  as any) {
            (window.event as any).returnValue = false;
                data = (window[clData]  as any).getData("text");
            } else {
                data = eventArgs[clData].getData("text/plain");
            }
    
            // process the clipboard data
        const processedData = this.processData(data);
        if (this.pasteMode === "Paste data as new records") {
            this.addRecords(processedData);
        } else {
            this.updateRecords(processedData);
        }
    }
    
    public processData(data: any) {
        const pasteData = data.split("\n");
        for (let i = 0; i < pasteData.length; i++) {
            pasteData[i] = pasteData[i].split("\t");
            // Check if last row is a dummy row
            if (pasteData[pasteData.length - 1].length === 1 && pasteData[pasteData.length - 1][0] === "") {
                pasteData.pop();
            }
            // remove empty data
            if (pasteData.length === 1 &&
                pasteData[0].length === 1 &&
                (pasteData[0][0] === "" || pasteData[0][0] === "\r")) {
                pasteData.pop();
            }
        }
        return pasteData;
    }
    

    Los datos pegados se pueden agregar como nuevos registros o se pueden usar para actualizar los registros existentes en función de la selección del usuario. Como referencia, consulte los métodos addRecords y updateRecords.

    public addRecords(processedData: any[]) {
        const grid = this.grid as any;
        const columns = grid.visibleColumns;
        const pk = grid.primaryKey;
        const addedData: any[] = [];
        for (const curentDataRow of processedData) {
            const rowData = {} as any;
            for (const col of columns) {
                const index = columns.indexOf(col);
                rowData[col.field] = curentDataRow[index];
            }
            // generate PK
            rowData[pk] = grid.data.length + 1;
            grid.addRow(rowData);
            addedData.push(rowData);
        }
        // scroll to last added row
        grid.navigateTo(grid.data.length - 1, 0, () => {
            this.clearStyles();
            for (const data of addedData) {
                const row = grid.getRowByKey(data[pk]);
                if (row) {
                    const rowNative = this.getNative(row) as any;
                    if (rowNative) {
                    rowNative.style["font-style"] = "italic";
                    rowNative.style.color = "gray";
                    }
                }
            }
        });
    }
    
    public updateRecords(processedData: any[]) {
        const grid = this.grid as any;
        const cell = grid.selectedCells[0];
        const pk = grid.primaryKey;
        if (!cell) { return; }
        const rowIndex = cell.row.index;
        const columns = grid.visibleColumns;
        const cellIndex = grid.visibleColumns.indexOf(cell.column);
        let index = 0;
        const updatedRecsPK: any[] = [];
        for (const curentDataRow of processedData) {
            const rowData = {} as any;
            const dataRec = grid.data[rowIndex + index];
            const rowPkValue = dataRec ? dataRec[pk] : grid.data.length + 1;
            rowData[pk] = rowPkValue;
            for (let j = 0; j < columns.length; j++) {
                let currentCell;
                if (j >= cellIndex) {
                    currentCell = curentDataRow.shift();
                }
                const colKey = columns[j].field;
                rowData[colKey] = currentCell || (dataRec ? dataRec[colKey] : null);
            }
            if (!dataRec) {
                // no rec to update, add instead
                rowData[pk] = rowPkValue;
                grid.addRow(rowData);
                continue;
            }
            grid.updateRow(rowData, rowPkValue);
            updatedRecsPK.push(rowPkValue);
            index++;
        }
    
        this.clearStyles();
        for (const pkVal of updatedRecsPK) {
            const row = grid.getRowByKey(pkVal);
            if (row) {
                const rowNative = this.getNative(row) as any;
                if (rowNative) {
                    rowNative.style["font-style"] = "italic";
                    rowNative.style.color = "gray";
                }
            }
        }
    }
    

    API References

    Additional Resources

    • Exportador de Excel: use el servicio Exportador de Excel para exportar datos a Excel desde la cuadrícula. También ofrece la opción de exportar solo los datos seleccionados de la cuadrícula. La funcionalidad de exportación se encapsula en la clase ExcelExporterService y los datos se exportan en formato de tabla de MS Excel. Este formato permite funciones como filtrado, clasificación, etc. Para ello, debe invocar el método de exportación de ExcelExporterService y pasar el componente Grid como primer argumento.

    Nuestra comunidad es activa y siempre da la bienvenida a nuevas ideas.