`TableChangedEventArgs.changeType` 始终为 `RangeEdited`

问题描述 投票:0回答:1

摘要:当

Excel.Table
中存在更合适的值时,传递到
onChange
.changeType
侦听器的所有事件都有
RangeEdited
Excel.DataChangeType
。不会传递用于添加或删除行的事件。

详情

代码如下:

const changeHandler = async (ev: Excel.TableChangedEventArgs): Promise<void> => {
  console.log(
    `Table ${this.source} has changed %c${ev.changeType}, at ${ev.address} to ${ev.details.valueAfter}`,
    "font-weight: bold;",
    ev
  );
};

// Add the table change listener
await Excel.run(async (context) => {
  const table = context.workbook.tables.getItemOrNullObject(this.source);
  await context.sync();
  if (table.isNullObject) {
    throw new Error(`Cannot find table with id ${this.source}`);
  }

  table.onChanged.add(changeHandler);
});

Excel.DataChangeType
的定义包括
RangeEdited
和许多其他,例如
ColumnInserted

/**
 * Gets the change type that represents how the changed event is triggered. See `Excel.DataChangeType` for details.
 *
 * @remarks
 * [Api set: ExcelApi 1.7]
 */
changeType: Excel.DataChangeType | "Unknown" | "RangeEdited" | "RowInserted" | "RowDeleted" | "ColumnInserted" | "ColumnDeleted" | "CellInserted" | "CellDeleted";

从工作表中插入或删除列会引发一个事件,其中

.changeType
RangeEdited
,而不是
ColumnInserted
ColumnDeleted 
。事实上,对表所做的所有都会引发
RangeEdited
风格的事件,除了插入和删除行之外,没有任何事件被传递。

到目前为止,这已经在 macOS 上进行了测试,但这感觉像是一个错误。

  • 平台:Microsoft® Excel for Mac
  • 版本16.90(24101387)
  • Darwin Mac 24.0.0 Darwin Kernel Version 24.0.0: Tue Sep 24 23:37:13 PDT 2024; root:xnu-11215.1.12~1/RELEASE_ARM64_T8112 arm64
excel office-js
1个回答
0
投票

根据您的解释,此行为似乎可能是您在 macOS 上使用的 Excel 版本的错误或限制。要解决此问题,您可能需要手动跟踪行和列更改。从长远来看,检查更新或联系 Microsoft 支持可以帮助确认这是否是未来版本中解决的问题。

您使用的是最新版本的 Excel for Mac?有时,此类问题可以通过较小的更新或补丁来解决。

作为解决方法,您可以通过比较更改前后的表状态来手动跟踪行和列的插入/删除。您可以在更改之前存储表的结构或行/列计数,然后在事件发生后检查它是否有所不同。

手动跟踪更改的解决方法:

let previousRowCount = 0;
let previousColumnCount = 0;

const changeHandler = async (ev: Excel.TableChangedEventArgs): Promise<void> => {
  const table = context.workbook.tables.getItemOrNullObject(this.source);
  await context.sync();
  
  if (ev.changeType === Excel.DataChangeType.RangeEdited) {
    // Check if row count or column count has changed
    if (table.rows.count !== previousRowCount) {
      console.log(`Rows changed: Row count before ${previousRowCount}, after ${table.rows.count}`);
    }
    if (table.columns.count !== previousColumnCount) {
      console.log(`Columns changed: Column count before ${previousColumnCount}, after ${table.columns.count}`);
    }
  }

  previousRowCount = table.rows.count;
  previousColumnCount = table.columns.count;
};
© www.soinside.com 2019 - 2024. All rights reserved.