2

我们有一个使用 office.js 内置的 excel 插件。我们从可能包含日期列的数据范围(即 A1:C10 )中读取数据。请参考下图

在此处输入图像描述

我们的插件读取数据并形成一个 CSV 数据集,当用户单击下载按钮时下载该数据集。我们使用以下代码行读取数据

  Excel.run({ delayForCellEdit: true }, async context => {
   this.rangeInput.nativeElement.blur();
   let sheet;
   sheet = context.workbook.worksheets.getItem("Sheet1");
   let range = sheet.getRange("A1:D10");
​   range.load("values");
   range.load("numberFormat");
   this.isDataLoading = true;
   this.updateLoading();
   await context.sync();
   let rangeData = range.values;
   let dataFormat = range.numberFormat;
 }) 

在上面的代码中,我们通过加载范围的数字格式(即range.load("numberFormat")返回一个格式数组)来获取每个单元格的数据格式。我们使用这个格式数组来决定我们的选择中是否有日期。主要的挑战是我们在excel中有很多日期格式支持,我们分别为每个模式实现日期转换逻辑。我们是否有任何通用方法可以将excel序列转换为excel中任何支持的(即270个位置的所有格式)日期模式。

要检查 excel 中支持的模式,请尝试通过格式化单元格来选择不同的模式。(即右键单击一个单元格-> 格式化单元格-> 日期,然后更改格式)。

在此处输入图像描述

我们确实尝试了转换为 ISO 格式的https://stackoverflow.com/a/16233621/10523731,但我们希望日期与用户在 excel 中格式化它们的模式相同(即 2020 年 4 月 8 日星期三应该与我们从 excel 序列号转换它)。

示例 excel 序列 - “2011 年 8 月 22 日在 excel 中是 40777”。请点击这里了解excel系列

4

1 回答 1

1

感谢 Naveen 的提问,我们实际上正在为这种情况构建一个新的 API。此 API 现在处于 beta 预览阶段。这个 API 的目标是在 1.12 中发布,这将是今年秋天的 GA。

range.numberFormatCategories表示范围内每个单元格的数字格式类别的API 。它将返回类别

在此处输入图像描述

这是此 API 的示例代码

  await Excel.run(async (context) => {
    const sheet = context.workbook.worksheets.getActiveWorksheet();
    sheet.activate();
    let range = sheet.getRange("A1:C3");
    range.load("address");
    range.load("numberFormatCategories");
    await context.sync();
    console.log("address: " + range.address);
    console.log("NumberFormatCategory: " + range.numberFormatCategories);
  });

这是文档 https://docs.microsoft.com/en-us/javascript/api/excel/excel.range?view=excel-js-preview#numberformatcategories

您可以在 Windows 和 Excel 中在线尝试此要点。https://gist.github.com/lumine2008/475327d889031ced8daf4a87b08c832c

于 2020-04-08T14:22:08.063 回答