首页 > 其他分享 >在Angular中使用SheetJS导入导出excel表格

在Angular中使用SheetJS导入导出excel表格

时间:2022-10-06 14:25:52浏览次数:40  
标签:const target 表格 any utils excel SheetJS Angular wb

导入本地excel表格

首先在终端使用npm命令安装SheetJS插件。SheetJS是个常用的xlsx交互库

npm install xlsx -s

而后,在angular前端的HTML页面上创建一个input元素和一个按钮,用来执行导入操作。这个按钮要跟后台的importExcel($event)函数绑定,这样当点击时触发这个函数,可以执行一系列后续操作

<input
	   style="display: none"
	   type="file"
	   (change)="importExcel($event)"
	   accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
       #fileInput/>
<button nz-button (click)="fileInput.click()">导入数据</button>

在后台的component部分,首先在开头从xlsx库引入一系列需要的组件。为方便跟页面数据绑定,再新建一个全局变量excelData用来存储序列化的excel数据,一个全局变量excelHeadData用来存储表头数据,并和前端绑定

import { read, utils, WorkBook, WorkSheet, writeFile } from 'xlsx';

然后写好importExcel函数

  importExcel(evt: any) {

    /* 初始化相关参数 */

    const target: DataTransfer = <DataTransfer>evt.target;
    if (target.files.length !== 1) throw new Error('不支持多文件上传');
    const reader: FileReader = new FileReader();
    reader.onload = (e: any) => {

      /* 我这里因为还打算加一个处理文件名的函数,所以添加了这步 */
      let name = target.files[0].name;
      this.fileName = name.substring(0, name.lastIndexOf('.'));

      /* 读入工作簿 */
      const bstr: string = e.target.result;
      const wb: WorkBook = read(bstr, { type: 'binary' });
  
      /* 抓取第一个(序号为0)表 */
      const wsname: string = wb.SheetNames[0];
      const ws: WorkSheet = wb.Sheets[wsname];


      /* 保存表格数据标签与数据内容*/
      let tmpColumnLabelList = utils.sheet_to_json(ws, {
        header: 1,
      })[0] as string[];
      this.excelHeadData=tmpColumnLabelList;
      this.excelData = utils.sheet_to_json(ws, { header: 0 });
      evt.target.value = ''; // 清空

    };

    /* 读入数据 */
    reader.readAsBinaryString(target.files[0]);
  }

在前端准备好数据展示的表格组件,我这里因为比较熟悉,用了Zorro的Table组件

<!--数据区域-->
<div nz-row nzJustify="center" style="margin-top: 15px; margin-bottom: 10px">
  <div nz-col nzSpan="22">
    <nz-table #basicTable [nzData]="excelData">
      <thead>
        <tr>
          <ng-container *ngFor="let label of excelHeadData">
            <th>{{ label }}</th>
          </ng-container>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let valueData of basicTable.data">
          <ng-container *ngFor="let value of excelHeadData">
            <td>
              <span [innerHtml]="valueData[value]"></span>
            </td>
          </ng-container>
        </tr>
      </tbody>
    </nz-table>
  </div>
</div>

如上,当我们点击按钮导入表格后,就可以通过前端的表格组件载入excel数据了。

这里有一点值得注意:表格在遍历数据时,是通过访问表头值(excelHeadData)的形式实现的。因此如果我们有时候不需要一次性载入太多列,又不想引用更重量级的表格组件甚至在线办公套件,其实在析出表头数据时就可以做取舍,只取那些有用的列,或者再设计几个函数,添加一个把所有列都附上CheckBox让用户选择显隐的功能。

导出网页上的表格数据到本地

与导入同理。不过前端得再写一个按钮调用后端的outputExcel函数。如上所述,我在自己的程序里搞了点自选动作,对表格列进行了取舍,所以这里不选择直接导出excelData,而是通过一个pick函数从excelData中遴选自己所需的表格列,然后再导出

  /* 一个便捷的pick函数,方便遴选所需列 */
  pick(obj: { [x: string]: any }, keys: any[]) {
    return keys
      .map((k) => (k in obj ? { [k]: obj[k] } : {}))
      .reduce((res, o) => Object.assign(res, o), {});

  }
  /* 导出至本地excel */
  outputExcel() {
    const outputArr: any[] = [];
    this.excelData.forEach((element: any) => {
      let tmpStruct = this.pick(element, this.columnLabelList);
      outputArr.push(tmpStruct);
    });

    const ws: WorkSheet = utils.json_to_sheet(outputArr, {
      header: this.columnLabelList,
    });

    const wb: WorkBook = utils.book_new();
    utils.book_append_sheet(wb, ws, 'Sheet1');
    writeFile(wb, this.fileName + '保留列.xlsx');
  }

标签:const,target,表格,any,utils,excel,SheetJS,Angular,wb
From: https://www.cnblogs.com/misaka10212/p/16757530.html

相关文章

  • 基于 angular material theming 机制修改 mat-toolbar 的背景色
    最近在学习angular,记录一下昨天的进展,解决的问题是通过theme的配置修改mat-toolbar的背景色,避免对色彩的硬编码。首先通过mat-toolbar(以下统一称为toolbar)的实现......
  • python合并多个excel
    前言1.工作中,经常需要合并多个Excel文件。如果文件数量比较多,则工作量大,易出错,此时,可以使用Python来快速的完成合并。2.使用方法:将需要合并的多个Excel文件放到同一个文......
  • Excel日期数据格式不统一如何处理?
    Excel日期筛选格式混乱,Excel导入系统也报错,原因是格式错乱导致的,具体处理步骤如下:如何转为下图这种?操作步骤,如下 1、先选中如图所示整列 2、右键,设置单元格格式;自定义为yy......
  • EXCEL里进行SINE等三角函数计算的方法
    示例,在excel里通过图标绘制sine图形:几个函数解释:根据角度算出弧度:=RADIANS(X)根据弧度算出角度:=DEGREES(X)取正弦值:=SIN(X)取余弦值:=COS(X)取绝对值:=ABS(X)......
  • 数据验证那个长长的下拉列框啊……(Excel技巧集团)
    【数据】》【数据验证】》【序列】,来源可以从工作表里选上一列(或一行),好多好多好多东东……结果,输入的过程从费劲地敲键盘变成了费劲地找啊找啊找……  不过,以上,是老皇历了......
  • 愉快地录入身份证号(Excel技巧集团)
    问题:如何在单元格里录入身份证号?答案1:先将单元格数字格式改成文本,再敲键盘。答案2:先输入一个半角的单引号,再输入数字。以上答案,正确,但是…… 好吧,再来一个晋阶的问题:如何将......
  • [Angular] Standalone component - routes top level provide share for all child ro
    Provideapplicationlevelmodulein bootstrapApplicationbootstrapApplication(AppComp,{providers:[importProvidersFrom(HttpClinetModule)]})//BA......
  • python 导出excel,以文件流形式返回前端
    python中使用xlwt库导出excel1.安装依赖包pipinstallxlwt2.写入Excel数据返回前端importxlwtfromflaskimportFlaskapp=Flask(__name__)@app.route('/a......
  • maven打包excel乱码
    项目中有excel导出功能,打包时excel模板文件乱码。解决如下:<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</a......
  • 使用Google Bigquery快速用SQL查询Excel数据
    1. 在GoogleBigquery新建项目之后,通过上传文件添加数据集  2. 通过SQL查询窗口查询数据 ......