我有一个包含很多表格的文档。我想使用 C# 和 Microsoft.Office.Interop.Word 修改这些表。我读到我可以使用 Tables 接口遍历所有表。
问题:是否可以为表命名/ID 并通过其名称访问表?(就像 Powerpoint 自动化中的形状一样)。
问题 2:如果 Microsoft.Office.Interop.Word 无法实现,那么像 Aspose Words 这样的替代方案是否提供了更方便的方法?
我有一个包含很多表格的文档。我想使用 C# 和 Microsoft.Office.Interop.Word 修改这些表。我读到我可以使用 Tables 接口遍历所有表。
问题:是否可以为表命名/ID 并通过其名称访问表?(就像 Powerpoint 自动化中的形状一样)。
问题 2:如果 Microsoft.Office.Interop.Word 无法实现,那么像 Aspose Words 这样的替代方案是否提供了更方便的方法?
是否可以为表命名/ID 并通过其名称访问表?
Table 对象确实提供了一个ID属性,但这只是保存为网页的文档。我假设这不是你想要的。
它仍然是可能的,但它不是由 API 提供的;您需要自己创建此功能。有两种方法:
一:使用互操作,您可以检索表的哈希码,该哈希码(希望)返回一个唯一的 ID。例如:
Word.Application wordApp = new Word.Application();
Word.Document wordDoc = wordApp.Documents.Open(@"C:\Users\username\Documents\HasTables.docx");
var tableID = wordDoc.Tables[1].GetHashCode();
一个彻底的解决方案可能是将文档中所有表的 ID 存储在 Dictionary 或其他具有键/值对映射的集合类型中。现在请注意,这些 ID 不会在 Word 会话中持续存在……因此,如果您需要能够识别同一会话之外的表,则需要另一种方法。
二:使用 OpenXML(对于 .docx 格式)和/或 WordML(对于 Word 2003 XML,如果您不能简单地将文件升级到 .docx)为每个 w:tbl 元素创建您自己的 Id 或 Name 属性。您可以使用自己的命名空间来消除歧义。这也将在 Word 会话中持续存在。这是一个与 Interop 不同的世界,但在我看来,这是更好的路线(性能,可用文档)。
如果 Microsoft.Office.Interop.Word 无法实现,那么像 Aspose Words 这样的替代方案是否提供了更方便的方法?
不,Aspose 在他们的TableCollection或Table对象中没有提供类似的东西。