Salesforce LWC學習(三十二)實現上傳 Excel解析其內容

zero.zhang發表於2021-03-17

本篇參考:salesforce lightning零基礎學習(十七) 實現上傳 Excel解析其內容

上一篇我們寫了aura方式上傳excel解析其內容。lwc作為salesforce的新寵兒,逐漸的在去aura化,這種功能怎麼能lwc不搞一份,所以本篇來了,直接上程式碼。

excelImportForLwc.html

<template>
    <lightning-input type="file" label="上傳" onchange={excelFileToJson} disabled={disableButton} accept="xlsx" multiple="false"></lightning-input>
    <lightning-button label="列印結果" onclick={printResult} disabled={disableButton}></lightning-button>
</template>

excelImportForLwc.js:因為 loadScript是一個 Promise操作,不是瞬間同步的操作,所以初始化先給按鈕disable掉,載入完js資源以後啟用。

import { LightningElement,track } from 'lwc';
import sheetJS from '@salesforce/resourceUrl/sheetJS';
import {loadScript } from 'lightning/platformResourceLoader';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
export default class ExcelImportForLwc extends LightningElement {
    @track dataList = [];
    @track disableButton = true;

    connectedCallback() {
        loadScript(this, sheetJS).then(() => {
             console.log('載入 sheet JS完成');
             this.disableButton = false;
        });
    }
    excelFileToJson(event) {
        event.preventDefault();
        let files = event.target.files;

        const analysisExcel = (file) =>
        new Promise((resolve, reject) => {
            const reader = new FileReader();
            reader.readAsBinaryString(file);
            reader.onload = () => resolve(reader.result);
            reader.onerror = (error) => reject(error);
        });

        analysisExcel(files[0])
        .then((result) => {
            let datas = []; // 儲存獲取到的資料
            let XLSX = window.XLSX;
            let workbook = XLSX.read(result, {
                type: 'binary'
            });
            for (let sheet in workbook.Sheets) {
                if (workbook.Sheets.hasOwnProperty(sheet)) {
                    datas = datas.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
                }
            }

            this.dataList = datas;
            const toastEvent = new ShowToastEvent({
                variant: "success",
                message: '檔案已經上傳解析成功',
            });
            this.dispatchEvent(toastEvent);
        });
    }

    printResult() {
        console.log(JSON.stringify(this.dataList));
    }
}

效果展示:

1. 上傳按鈕點選上傳成功以後展示 toast

2. 點選列印結果按鈕console出來excel內容

總結:lwc呼叫區別就是宣告一個 Promise,在Promise裡面通過 FileReader的onload去進行處理。處理方式和aura相同,只是部分寫法區別。篇中仍然有很多沒有優化,包括檔案大小限制,error場景處理等等。感興趣的自行完善。篇中有錯誤地方歡迎指出,有不懂歡迎留言。

相關文章