许多现代数据源提供了一个 API 来下载 JSON 格式的数据。许多用户喜欢在电子试算表工作。SheetJS 库通过将程序员友好的 JSON 转换为用户友好的工作簿来帮助缩小差距。

此示例的目标是生成一个包含美国总统姓名和生日的 XLSX 工作簿。我们将使用标准的 JavaScript 函数下载并处理一个 JSON 数据集。一旦我们有了一个简单的名称和生日列表,我们将使用 SheetJSAPI 函数来构建一个工作簿对象并导出到 XLSX。

“现场演示”部分包括一个工作演示在这个页面!“本地运行演示”展示了如何在 iOS/Android 应用程序、桌面应用程序、 NodeJS 脚本和其他环境中运行工作流。

以下时序图显示了这一过程:

数据导出教程 - 图1

获取数据

原始数据以 JSON 表格1提供,地址在 https://sheetjs.com/data/executive.JSON

原始数据

获取数据非常简单

  1. const url = "https://sheetjs.com/data/executive.json";
  2. const raw_data = await (await fetch(url)).json();

原始数据是一个对象数组(Array of objects):

  1. {
  2. "name": {
  3. "first": "John", // <-- first name
  4. "last": "Adams" // <-- last name
  5. },
  6. "bio": {
  7. "birthday": "1735-10-19", // <-- birthday
  8. },
  9. "terms": [ // <-- array of presidential terms
  10. { "type": "viceprez", "start": "1789-04-21", },
  11. { "type": "viceprez", "start": "1793-03-04", },
  12. { "type": "prez", "start": "1797-03-04", } // <-- presidential term
  13. ]
  14. }

筛选总统

数据集包括 Aaron Burr 一个从未当过总统的副总统!

每个对象的 term 字段是一个 term 数组。如果 type 属性值是 “prez”,则 term 是总统。我们对至少任职过一届的总统感兴趣。以下一行列出了一系列主席:

  1. const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));

按第一个 term 分类

数据集按照第一任总统或副总统任期的时间顺序排序。副总统和总统在给定的任期内是按字母顺序排列的。2009年,乔 · 拜登和巴拉克 · 奥巴马分别担任副总统和总统。由于“拜登”是按字母顺序排在“奥巴马”之前的,所以拜登的数据点出现在第一位。目标是按照总统任期的顺序对总统进行排序。

第一步是向数据集添加第一个总统任期开始日期。下面的代码查看每位总统并创建一个 start 属性,该属性表示第一个总统任期的开始。

  1. prez.forEach(row => row.start = row.terms.find(term => term.type === "prez").start);

此时,prez 数组中的每一行都有一个 start 属性。由于 start 属性是字符串,下面一行对数组进行排序:

  1. prez.sort((l,r) => l.start.localeCompare(r.start));

重塑数组

对于这个示例,名字将是第一个名字和最后一个名字(row.name.first + "" + row.name.last)组合在一起的名字,生日将在 row.bio.birthday 可用。使用 Array#map,可以在一次调用中对数据集进行消息传递:

  1. const rows = prez.map(row => ({
  2. name: row.name.first + " " + row.name.last,
  3. birthday: row.bio.birthday
  4. }));

创建工作簿

对于清理过的数据集,XLSX.utils.json_to_sheet 生成一个工作表:

XLSX.utils.book_new 创建一个新的工作簿,XLSX.utils.book_append_sheet 将一个工作表附加到工作簿中,新的工作表将被命名为 “Dates”:

  1. const workbook = XLSX.utils.book_new();
  2. XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");