我的目标是能够使用 C# 以编程方式打开任何 .one 节文件并获取该节的所有页面 id。在一个简单的情况下(我创建并最近使用了该部分),这可以使用以下代码完成:
using Microsoft.Office.Interop.OneNote;
class Program
{
public static void ProcessOnenoteFile()
{
Application onenoteApp = new Application();
string filepath = @"C:\Users\Admin\Documents\OneNote Notebooks\My Notebook\testsection.one";
string sectionId;
onenoteApp.OpenHierarchy(filepath, null, out sectionId);
string hierarchy;
onenoteApp.GetHierarchy(sectionId, HierarchyScope.hsPages, out hierarchy);
File.WriteAllText(@"C:\hierarchy.txt", hierarchy);
}
}
从这里我可以解析 xml 以找到所有 pageId,然后就可以开始了。
然而,问题是我想对从其他人那里获得且以前从未打开过的文件执行此操作。当我在这些文件上运行相同的代码时,我在层次结构中找不到任何 pageId,因此无法处理任何页面。似乎有效的修复方法是在尝试获取层次结构之前使用 navigatorTo 方法在 OneNote 中打开节文件。
...
string sectionId;
onenoteApp.OpenHierarchy(filepath, null, out sectionId);
onenoteApp.NavigateTo(sectionId);
string hierarchy
...
然而,这很烦人,因为我需要打开 OneNote 应用程序。由于我有许多 .one 节文件需要处理,因此屏幕上会闪烁大量随机信息,这是不必要的,并且可能会使我的程序的最终用户感到困惑。有没有一种方法可以实现将 pageId 添加到层次结构的相同结果,而无需打开 OneNote 应用程序?至少,有没有办法隐藏该应用程序?
更新:
我刚刚注意到使用“发布”命令还会使用 pageId 更新层次结构,但是,这个解决方案仍然不理想,因为它需要我制作另一个文件。
此外,更仔细地查看 xml 导出,我发现有一个名为“areAllPagesAvailable”的属性,对于我尚未在 OneNote 中打开的所有文件,该属性都设置为 false。
呜呼!经过几个小时的玩耍和谷歌搜索不同的方法后,我找到了我想要的东西。
解决方案:SyncHierarchy(sectionId);
...
string sectionId;
onenoteApp.OpenHierarchy(onenoteFile, null, out sectionId, CreateFileType.cftSection);
onenoteApp.SyncHierarchy(sectionId);
string hierarchy;
onenoteApp.GetHierarchy(sectionId, HierarchyScope.hsPages, out hierarchy);
...