如何使用 C# OneNote 2013 15.0 COM 类型库创建新的笔记本或分区?

How to create a new notebook or section using C# OneNote 2013 15.0 COM Type Library?

我无法使用 OneNote 2013 开发人员参考创建新笔记本或在现有笔记本中创建新分区。

MSDN here 上的指南表明这是可能的,但没有提供如何操作的示例。

每当我尝试添加新笔记本时,我都会收到一个 HRESULT: 0x80042015 error code 指示笔记本不存在的消息。我知道!我正在尝试添加它:-)

此外,每当我尝试向现有笔记本添加新部分时,我都会收到 HRESULT: 0x80042014 错误代码,表明该对象不存在。

这是一个代码片段,展示了我正在尝试做的事情。如有任何帮助,我们将不胜感激!

try
{
    _app.GetHierarchy(null, Microsoft.Office.Interop.OneNote.HierarchyScope.hsNotebooks, out strXml);
    using (var stringReader = new StringReader(strXml))
    {
        var xdoc = XDocument.Load(stringReader);

        // Get the first notebook.  Currently, I couldn't find a way to create a new Notebook using the OneNote interops.
        var notebook = xdoc.Root.Descendants().First();
        if (!notebook.Descendants().Any(d => d.Name == "My New Section"))
        {
            // Get ready to create a new section
            XNamespace ns = "http://schemas.microsoft.com/office/onenote/2013/onenote";
            var myNewSectionElement = new XElement(ns + "Section");
            myNewSectionElement.Add(new XAttribute("name", "My New Section"));
            myNewSectionElement.Add(new XAttribute("path", @"C:\MyNewSection.one"));
            myNewSectionElement.Add(new XAttribute("ID", @"{5F786510-79D4-4D0B-BC93-A637700D7543}{1}{B0}"));
            notebook.Add(myNewSectionElement);

            // Update the heirarchy
            var strBuilder = new StringBuilder();
            using (var stringWriter = new StringWriter(strBuilder))
            {
                xdoc.Save(stringWriter);
                _app.UpdateHierarchy(strBuilder.ToString(), Microsoft.Office.Interop.OneNote.XMLSchema.xs2013);
            }
        }
        else
        {
            Output = "My New Section already exists.\r\n";
        }
    }
}
catch (Exception ex)
{
    Output = string.Format("{0}:{1}\r\n", ex.GetType(), ex.Message);
}

我想我处理问题的方法不正确。我认为如果我编辑 xml 数据以包含新的笔记本或部分,COM 库将足够智能以检测新添加的元素。进一步阅读后,创建新笔记本或分区的正确方法是使用 OpenHierarchy() 方法。

这是我为现有笔记本创建新分区的工作副本。我还没有尝试创建一个新的笔记本,但我认为方法是相似的。

private void DoOpenHierarchy(Microsoft.Office.Interop.OneNote.HierarchyScope scope)
{
    Output = "Open Hierarchy Section...\r\n";
    var strXml = string.Empty;
    var objectId = string.Empty;
    _app.GetHierarchy(null, scope, out strXml);
    try
    {
        var xdoc = XDocument.Parse(strXml);
        var ns = xdoc.Root.Name.Namespace;
        if (scope == Microsoft.Office.Interop.OneNote.HierarchyScope.hsSections)
        {
            var noteBook = xdoc.Root.Descendants(ns + "Notebook").FirstOrDefault();
            if (noteBook != null)
            {
                var sectionName = "My New Section";
                Output += string.Format("Attempting to create section '{0}' in {1}...\r\n", sectionName, noteBook.Attribute("name").Value);
                var location = string.Format("{0}\{1}.one", noteBook.Attribute("path").Value, sectionName);
                _app.OpenHierarchy(location, string.Empty, out objectId, Microsoft.Office.Interop.OneNote.CreateFileType.cftSection);
                Output += string.Format("Section ID Created: {0}\r\n", objectId.ToString());
            }
            else
            {
                Output += "ERROR: Not able to determine a 'path' in order to store new section.\r\n";
            }
        }
    }
    catch (Exception ex)
    {
        Output += string.Format("{0}:{1}\r\n", ex.GetType(), ex.Message);
    }
    Output += "\r\nOpen Hierarchy Section Done.\r\n";
}