如何在 Angular 8 中将下拉列表(带选项)从 JSON 导出到 Excel?

2023-11-29

我正在尝试将 JSON 数据导出到具有下拉列表的 Excel。

如果我们将数组作为单元格值传递,是否可以在 Excel 中创建下拉菜单(带选项)?

我正在尝试使用内置库 XLSX 来实现此目的,但如果我在单元格值中传递数组,则无法查看数据。

更新:Jack 提供了一个支持数据验证的 ExcelJS 库,但需要为此进行一些配置。

有没有支持此功能的 Angular 库?

下面是我尝试过的项目的示例。我想根据传递给服务的数据附加多个工作表,并且工作表的名称将从对象中获取。

https://stackblitz.com/edit/angular6-export-xlsx-b4al4p


这只是 @ZackReam 解决方案的补充,重点关注您当前的场景

首先,我们首先定义一个数据结构

  workbookData = [
    {
      workSheet: "data 1",
      rows: [
        { eid: "1", ename: "John", esal: ["val 1", "val2", "val 3"] },
        { eid: "4", ename: "Parker", esal: ["val 1", "val2", "val 3"] },
        { eid: "5", ename: "Iron", esal: ["val 1", "val2", "val 3"] }
      ]
    },
    {
      workSheet: "data 2",
      rows: [
        { eid: "9", ename: "Doe", esal: ["val 1", "val2", "val 3"] },
        { eid: "10", ename: "Peter", esal: ["val 1", "val2", "val 3"] },
        { eid: "11", ename: "Man", esal: ["val 1", "val2", "val 3"] }
      ]
    }

接下来我们定义一个服务来根据上述数据动态生成工作簿

import { Injectable } from "@angular/core";
import * as FileSaver from "file-saver";
import * as ExcelJS from "exceljs/dist/exceljs.min.js";

const EXCEL_TYPE =
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8";
const EXCEL_EXTENSION = ".xlsx";

@Injectable()
export class ExcelService {
  constructor() {}

  public async exportAsExcelFile(workbookData: any[], excelFileName: string) {
    const workbook = new ExcelJS.Workbook();

    workbookData.forEach(({ workSheet, rows }) => {
      const sheet = workbook.addWorksheet(workSheet);
      const uniqueHeaders = [
        ...new Set(
          rows.reduce((prev, next) => [...prev, ...Object.keys(next)], [])
        )
      ];
      sheet.columns = uniqueHeaders.map(x => ({ header: x, key: x }));

      rows.forEach((jsonRow, i) => {
        let cellValues = { ...jsonRow };

        uniqueHeaders.forEach((header, j) => {
          if (Array.isArray(jsonRow[header])) {
            cellValues[header] = "";
          }
        });
        sheet.addRow(cellValues);
        uniqueHeaders.forEach((header, j) => {
          if (Array.isArray(jsonRow[header])) {
            const jsonDropdown = jsonRow.esal;
            sheet.getCell(
              this.getSpreadSheetCellNumber(i + 1, j)
            ).dataValidation = {
              type: "list",
              formulae: [`"${jsonDropdown.join(",")}"`]
            };
          }
        });
      });
    });

    const buffer = await workbook.xlsx.writeBuffer();
    this.saveAsExcelFile(buffer, excelFileName);
  }

  private getSpreadSheetCellNumber(row, column) {
    let result = "";

    // Get spreadsheet column letter
    let n = column;
    while (n >= 0) {
      result = String.fromCharCode((n % 26) + 65) + result;
      n = Math.floor(n / 26) - 1;
    }

    // Get spreadsheet row number
    result += `${row + 1}`;

    return result;
  }

  private saveAsExcelFile(buffer: any, fileName: string): void {
    const data: Blob = new Blob([buffer], {
      type: EXCEL_TYPE
    });
    FileSaver.saveAs(
      data,
      fileName + "_export_" + new Date().getTime() + EXCEL_EXTENSION
    );
  }
}

该服务将动态确定要设置为验证的标题和列

转换数据

我们可以使用下面的方法将您的数据转换为这种结构

  transform (data) {
    const noOfRowaToGenerate = 10;
    return data.map(({name, values}) => {
      const headers = values.reduce((prev, next) => 
        ({...prev, [next.header]: Array.isArray
        (next.value) ? next.value.map(({name}) => name): next.value}), {})
      return {
        workSheet: name,
        rows: Array(noOfRowaToGenerate).fill(headers)
      }
    })
  }
   workbookData = this.transform(this.data1)

下面是一个示例演示

示例演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Angular 8 中将下拉列表(带选项)从 JSON 导出到 Excel? 的相关文章

随机推荐

  • HERE API 从不运行批处理作业,始终返回接受状态

    由于某种原因 我的应用程序今天早上停止工作 提交作业后 请求其状态时 仅返回accepted 这是我用来创建和运行作业的代码 url https batch geocoder api here com 6 2 jobs action run
  • 重写原型上内置方法的类型

    默认类型为hasOwnProperty is hasOwnProperty v PropertyKey boolean 然而 这阻止我做这样的事情 const obj a 1 function foo str string if obj h
  • 如何将函数应用于类的所有元素

    我有一个函数 我想将其应用于同一类的多个元素 这是一个滚动页面函数 我只需要它执行一次 所以我把它放在包装纸里 它有效 但我希望能够向元素添加一个类并让它作用于该元素 我尝试迭代元素并使用 addClass 添加一个唯一的类 并将各自的索引
  • 使用 hibernate 进行复杂查询(例如每组前 N 个)的最佳方法

    我现在正在开发一个报告应用程序一段时间 我使用 hibernate 来定义我的查询 然而 我越来越觉得对于报告用例来说这不是最好的方法 查询仅产生部分列 因此不是类型对象 除非你在java中转换所有字段 如果不直接使用 sql 或 总部 我
  • 转换 int -> unsigned long long 是否由标准定义

    我找不到具体的说明int值转换为unsigned long long在标准中 指定了各种类似的转换 如int gt unsigned unsigned gt int 负数则为UB unsigned long long gt int等 例如海
  • Mod_security 有时会阻止我的 ajax 脚本 - 我怎样才能找出原因?

    我使用 php 和 mysql 构建了某种 CMS 应用程序 一切在本地主机上都运行得很好 所以我把它移到了网络上 现在 当有人添加新文章时 我遇到了奇怪的问题 有时它只是正常添加 有时用户会收到此错误 不可接受 所请求资源的适当表示 在此
  • 是否可以从 PropertyGrid 隐藏枚举值?

    我正在与PropertyGrid控制和使用SelectedObject属性来显示数据PropertyGrid 我的网格中的一些属性是枚举类型 我想要做的是向用户隐藏枚举中的一些选择 以下面的示例为例 我想向用户隐藏 Error 的枚举 有没
  • 我们可以通过android中的模拟器发送短信吗?

    我想检查通过模拟器发送到手机的短信 我们可以这样做吗 我不知道是否可以将短信从模拟器发送到设备 但可以将短信从一个模拟器实例发送到另一个模拟器实例 使用模拟器端口号作为接收者电话号码 即 如果模拟器在端口 5444 上运行 则必须使用 54
  • 需要 Handlebars.js 来渲染对象数据而不是“[Object object]”

    我正在使用 Handlebars 模板 并且 JSON 数据已在 Object object 中表示 如何在 Handlebars 之外解析此数据 例如 我尝试通过句柄标签填充页面上的 JavaScript 变量 但这不起作用 有什么建议么
  • 如何以编程方式将 WPF TreeView 绑定到 List

    因此 我对 WPF 非常陌生 并尝试将 Drink 值列表绑定或分配给 wpf 树视图 但不知道如何执行此操作 并且发现很难在网上找到任何不使用 xaml 只显示内容的内容 struct Drink public string Name g
  • PHP Oauth 签名_无效

    我无法理解为什么这不起作用 我真的认为它应该是这样 请帮忙 这是我得到的错误 signature invalid base string GET https 3A 2F 2Fwww google com 2Faccounts 2FOAuth
  • 无法在 R 中初始化 CoreNLP

    我无法访问coreNLP在运行 High Sierra 的 Mac 上用 R 编写 我不确定问题是什么 但似乎每次我再次尝试获取coreNLP工作时 我面临着不同的错误 我有 JDK 9 0 4 请参阅下面的代码 了解我正在尝试执行的操作以
  • CLR 存储过程中的多线程代码?

    多线程 CLR 存储过程可能吗 我有一项数据密集型任务 具有很大的并行化潜力 CLR 存储过程非常适合消除将数据移出进程的开销 但我担心我必须放弃并行计算 我有什么选择 注意 我们使用的是 SQL Server 2005 计划在 4 个月内
  • 如何将 UIView、UIImageView 或 CALayer 动画旋转 360°?

    你如何旋转UIView UIImageView or CALayer不使用 OpenGL ES 进行 360 度动画 import
  • ASP.NET 和 STA COM 对象

    想要在这里解决争论 我读过的关于使用 VB 中从 ASP NET 页面创建的 COM 对象的所有内容都围绕着 警告 请确保安装了 ASPCOMPAT 否则它将无法工作 然而 我已经设置好了 你猜怎么着 没问题 现在 我读到了这个 http
  • PHP 和 XML。使用 PHP 循环 XML 文件

    我现在正陷入 foreach 炼狱中 试图想出一种用 PHP 遵循 XML 文件内容 遍历这个 XML 文件 下面的实际 XML 文本 的方法 我想做的是 获取所有文件夹元素名称 如果文件夹元素的子文件夹属性为 yes 则向下移动一级并获取
  • 在 Google Compute Engine 上从没有公共 IP 的计算机路由到互联网

    在 Google Compute Engine 上 我们有没有公共 IP 的机器 因为配额限制了可以拥有公共 IP 地址的机器数量 我们需要这些非公共 IP 机器来访问 Google 存储桶中的数据 这似乎意味着我们必须路由到互联网 但我们
  • 使用 ImageMagick 对图像进行平等测试

    ImageMagick 库中有相等谓词函数吗 我想比较两个图像并找出它们是否完全相同 像素的所有颜色都相同 或有任何差异 我查了一下 好像没有这个功能 我应该自己使用像素迭代器编写函数吗 ImageMagick 提供compare功能来正确
  • 如何在不同的目录中启动 npm?

    我通常cd进入app目录然后运行npm start 我的感觉应该是有什么办法可以跑npm start带有路径参数 但是 npm 启动文档不包含这样的功能 我尝试自己却发现npm start myapp不起作用 有没有办法做到这一点 这一行应
  • 如何在 Angular 8 中将下拉列表(带选项)从 JSON 导出到 Excel?

    我正在尝试将 JSON 数据导出到具有下拉列表的 Excel 如果我们将数组作为单元格值传递 是否可以在 Excel 中创建下拉菜单 带选项 我正在尝试使用内置库 XLSX 来实现此目的 但如果我在单元格值中传递数组 则无法查看数据 更新