DamianRice 发表于 2022-5-25 20:47

C#中的COM Object

# 背景
最近在考虑做一个C#监听`Word`中`Table`的数据变化的工具
当`Table`中的数据改变,自动匹配刷到`Excel`里
由于原生的`Microsoft.Office.Interop.Word`中没有类似`TableChangedEventHandler`可以监听表格的变动

我就开了一个`Thread`在后台扫描`Document.Tables`
但是发现,`Application`下的`Document`对象可以保持唯一`HashCode`,但是`Table`对象的`HashCode`每次循环扫描都不一样

## 想请教各位大佬
1. COM Object的唯一性要怎么实现?
2. 为什么`Document`和`Table`同为COM Object,但是`HashCode`表现会不同

感谢!

GitHubList 发表于 2022-5-26 00:14

可以考虑用NPOI

DamianRice 发表于 2022-5-26 07:31

GitHubList 发表于 2022-5-26 00:14
可以考虑用NPOI

NPOI和Aspose我都有尝试和考虑过,但用第三方的库有一个问题就是
:我需要`System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");`来抓取已经打开的Word或Excel文档app,假如先打开文档,再通过NPOI扫描的话,读写好像会有些问题

如果所有的操作都是通过程序完成当然NPOI库,Aspose库都非常不错,但这个操作是混合在一起的,不知道您还有什么好的方案么?

7R903 发表于 2022-5-26 09:15

NPOI或者Aspon.Cell来实现吧

GitHubList 发表于 2022-5-26 09:16

文件不能关闭也简单,定时保存打开的文件

然后把文件复制到别的路径读取,获取是否变动了

Brinish 发表于 2022-5-26 09:42

都用excel来处理,需要word文件的时候从excel中读取现生成都来得及

DamianRice 发表于 2022-5-26 20:58

cn005897 发表于 2022-5-26 09:15
NPOI或者Aspon.Cell来实现吧

可能我现在的问题是不能单纯只用NPOI或者Aspose.Cell处理,VSTO可以检测Microsoft.Office.Interop.Excel的Application,并抓到Excel.Workbook对象,但是Aspose.Cell.Workbook对象和Excel.Workbook对象不能强转。我试过用VSTO打开一个Excel,然后用Aspose.Cell代替Interop.Excel写数据,不是崩溃就是没法保存

DamianRice 发表于 2022-5-26 21:02

GitHubList 发表于 2022-5-26 09:16
文件不能关闭也简单,定时保存打开的文件

然后把文件复制到别的路径读取,获取是否变动了

这个也是个好办法,但是如果文件比较大
全量保存一次是耗时操作的话,这个监控线程就有点呆了

不过您提供了一个思路,可以用OpenXML来做监控,然后增量拷贝检测变动
可能具体实现起来稍微有点麻烦

DamianRice 发表于 2022-5-26 21:03

Brinish 发表于 2022-5-26 09:42
都用excel来处理,需要word文件的时候从excel中读取现生成都来得及

奥这个可能不太能满足我的需求,涉及Word在操作中是因为,从Excel向Word转换的过程没法约定格式,Word的格式调整Excel不能完全匹配和实现,比如缩进,所有页字号统一这些问题
页: [1]
查看完整版本: C#中的COM Object