摘要:当
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 上进行了测试,但这感觉像是一个错误。
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
根据您的解释,此行为似乎可能是您在 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;
};