Lightning component realizes simple excel download and parsing

  • UpDownLoadEvent.evt

<aura:event type="APPLICATION" description="Event template">
    <aura:attribute name="excelDataJson" type="List"/>
</aura:event>

  • UpDownLoad.cmp

<aura:component>
    <!-- 加载层 -->
  <aura:attribute name="showSpinner" type="Boolean" default="false"/>
  <!-- excel表头中英文对照 -->
  <aura:attribute name="excelHeader" type="Map" default="{'HeaderA':'表头A','HeaderB':'表头B','HeaderC':'表头C'}"/>
  <!-- 导出的excel数据 -->
  <aura:attribute name="excelDataJson" type="List" default="[{'HeaderA':'AAA','HeaderB':'BBB','HeaderC':'CCC'}]"/>
  <!-- 导出excel文件名称 -->
  <aura:attribute name="fileName" type="String" default="导出文件"/>
  <!-- excel文件下载的label -->
  <aura:attribute name="downloadLabel" type="String" default="模板下载"/>
  <!-- 是否使用文件下载 -->
  <aura:attribute name="download" type="Boolean" default="true"/>
  <!-- 是否使用文件解析 -->
  <aura:attribute name="upload" type="Boolean" default="true"/>
  <!-- 注册事件,当文件发生变化时将excel文件的解析数据传回调用组件 -->
    <aura:registerEvent name="fileChange" type="c:UpDownLoadEvent" />
    <!-- 静态资源 -->
    <ltng:require scripts="{!join(',',$Resource.xlsx)}"/>
    <lightning:buttonGroup>
        <aura:if isTrue="{!v.upload}">
        <lightning:input aura:id="fileId" type="file" name="file" multiple="false" accept=".xls,.xlsx" variant="label-hidden" οnchange="{!c.upload}"/>
      </aura:if>
      <aura:if isTrue="{!v.download}">
        <lightning:button label="{!v.downloadLabel}" iconName="utility:download" iconPosition="left" οnclick="{!c.download}"/>
    </aura:if>
  </lightning:buttonGroup>
    <aura:if isTrue="{!v.showSpinner}">
      <lightning:spinner />
    </aura:if>
</aura:component>

  • UpDownLoadController.js

({
    upload:function(cmp,event,helper)
  {
      var fileName='No File Selected..';
      if (event.getSource().get("v.files").length > 0) fileName = event.getSource().get("v.files")[0]['name'];
    if(fileName=='No File Selected..')
    {
      alert('请选择文件!');
      return;
    }
    helper.uploadHelper(cmp,event,helper);
  },
  download:function(cmp,event,helper)
  {
      var header={};
      var excelDataJson=cmp.get("v.excelDataJson");
    var fileName=cmp.get("v.fileName");
    var excelHeader=cmp.get("v.excelHeader");
    header.header=[];
    var jsonStr=JSON.stringify(excelDataJson);
    for(var key in excelHeader)
    { 
        jsonStr=jsonStr.replace(new RegExp(key,"g"),excelHeader[key]);
    }
    excelDataJson=JSON.parse(jsonStr);
    cmp.set("v.showSpinner", true);
      const ws = XLSX.utils.json_to_sheet(excelDataJson, header);
      ws["B1"].s = { font: { sz: 14, bold: true, color: { rgb: "FFFFAA00" } }, fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFFF00" } } };
      const wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'};//这里的数据是用来定义导出的格式类型
    const wb = {SheetNames: ['Sheet1'], Sheets: {}, Props: {}};
    wb.Sheets['Sheet1'] = ws;
    cmp.set("v.showSpinner", false);
    helper.saveAs(new Blob([helper.s2ab(XLSX.write(wb, wopts))], {type: "application/octet-stream"}),  fileName+'.' + (wopts.bookType == "biff2" ? "xls" : wopts.bookType));
  }
})

  • UpDaownLoadHelper.js

({
    uploadHelper:function (cmp,event,helper) 
  {
    var file=cmp.find("fileId").get("v.files")[0];
    if(file)
    {
        cmp.set("v.showSpinner", true);
      var reader = new FileReader();
      reader.onload = function(e) {
        var workbook = XLSX.read(e.target.result, {type: 'binary'});
        var excelDataJson=JSON.stringify(XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]));
        var excelHeader=cmp.get("v.excelHeader");
        cmp.set("v.showSpinner", false);
        if(excelDataJson.length==0)
        {
            alert("无上传数据!");
              return;
        }       
        var jsonStr=JSON.stringify(excelDataJson);
        for(var key in excelHeader)
            { 
                jsonStr=jsonStr.replace(new RegExp(excelHeader[key],"g"),key);
            }
            excelDataJson=JSON.parse(jsonStr);            
            console.log(excelDataJson);
            helper.despatchFileChangeEvent(cmp,excelDataJson);
      };
      reader.onerror = function (e) {
        console.log("error reading file");
      };
      //文件加载结束的时候
      reader.onloadend = function (e) {
          console.log("onloadend");
      };
      reader.readAsBinaryString(file);
    }
  },
  despatchFileChangeEvent:function(cmp,excelDataJson){
    var compEvent = cmp.getEvent("fileChange");
    compEvent.setParams({ "excelDataJson": excelDataJson});
    compEvent.fire();
  },
  //下载导出文件
  saveAs:function (obj, fileName) 
  {
      console.log(obj);
      console.log(fileName);
    var tmpa = document.createElement("a");
    tmpa.download = fileName || "下载";
    tmpa.href = URL.createObjectURL(obj); //绑定a标签
    tmpa.click(); //模拟点击实现下载
    setTimeout(function () { //延时释放
        URL.revokeObjectURL(obj); //用URL.revokeObjectURL()来释放这个object URL
    }, 100);
  },
  s2ab: function (s) { //字符串转字符流
    if (typeof ArrayBuffer !== 'undefined') {
      var buf = new ArrayBuffer(s.length);
      var view = new Uint8Array(buf);
      for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
      return buf;
    } else {
      var buf = new Array(s.length);
      for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
      return buf;
    }
  },
})

  • UpDaownLoad.css

.THIS .slds-file-selector__dropzone{ 
    background-color: white !important;
    border-color: white;
}
.THIS .slds-file-selector__dropzone .slds-file-selector__text{ 
    display: none;
}
.THIS #fileId
{
    border-color: white;
}

  • xlsx.js静态文件

GitHub - SheetJS/sheetjs: SheetJS Community Edition -- Spreadsheet Data Toolkit

  • 组件调用示例

调用方法:

<c:UpDownLoad excelHeader="{'HeaderA':'表头A','HeaderB':'表头B','HeaderC':'表头C'}" excelDataJson="[{'HeaderA':'AAA','HeaderB':'BBB','HeaderC':'CCC'}]" fileChange="{!c.fileChange}"/>

接收传回的JSON数据:

fileChange:function(cmp, event, helper) 
{
    var excelDataJson=event.getParam("excelDataJson");
    console.log(excelDataJson);
},

  • 效果展示

点击模板下载:

点击上载文件(红色标记部分即为excel文件的解析结果,这个JSON数据可以传回到调用组件):

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值