如何使用C#和OneNote Interop写入OneNote 2013页面

我看过很多关于此的文章,但所有文章都不完整或者没有回答我的问题。 使用C#和OneNote Interop,我想简单地将文本写入现有的OneNote 2013页面。 目前我有一个OneNote笔记本,其中一个标题为"Sample_Section ”的部分和一个名为"MyPage"的页面。

我需要能够使用C#代码将文本写入此页面,但我无法弄清楚如何或找到任何资源来执行此操作。 我查看了网络上的所有代码示例,但没有人回答这个简单的问题,或者能够做到这一点。 此外,许多代码示例在尝试运行它们时已过时并中断。

我使用了Microsoft代码示例,该示例演示了如何更改Section的名称,但是找不到任何将文本写入Page代码。 我可以看到没有简单的方法可以做到这一点。 我花了很多时间研究这个并在线查看不同的例子,但没有人能够提供帮助。

我已经在OneNote Interop上查看了MSDN文章。 我模糊地理解OneNote Interop如何通过XML但任何额外的帮助理解也会受到赞赏。 最重要的是,我非常感谢一个代码示例,它演示了如何将文本写入OneNote 2013 Notebook页面。

我试过使用这个Stack Overflow答案: 从C#创建新的One Note 2010页面

但是,有两个关于此解决方案的事情没有回答我的问题:

1)标记的解决方案显示了如何创建新页面,而不是如何向其中写入文本或如何使用任何信息填充页面。

2)当我尝试运行标记为解决方案的代码时,我在以下行收到错误:

 var node = doc.Descendants(ns + nodeName).Where(n => n.Attribute("name").Value == objectName).FirstOrDefault(); return node.Attribute("ID").Value; 

原因是“节点”的值为null,任何帮助都将非常感激。

我在MSDN论坛上问了同样的问题,并得到了这个很好的答案。 下面是一个很好的,干净的示例,说明如何使用C#和OneNote互操作写入OneNote。 我希望这可以在将来帮助人们。

  static Application onenoteApp = new Application(); static XNamespace ns = null; static void Main(string[] args) { GetNamespace(); string notebookId = GetObjectId(null, OneNote.HierarchyScope.hsNotebooks, "MyNotebook"); string sectionId = GetObjectId(notebookId, OneNote.HierarchyScope.hsSections, "Sample_Section"); string firstPageId = GetObjectId(sectionId, OneNote.HierarchyScope.hsPages, "MyPage"); GetPageContent(firstPageId); Console.Read(); } static void GetNamespace() { string xml; onenoteApp.GetHierarchy(null, OneNote.HierarchyScope.hsNotebooks, out xml); var doc = XDocument.Parse(xml); ns = doc.Root.Name.Namespace; } static string GetObjectId(string parentId, OneNote.HierarchyScope scope, string objectName) { string xml; onenoteApp.GetHierarchy(parentId, scope, out xml); var doc = XDocument.Parse(xml); var nodeName = ""; switch (scope) { case (OneNote.HierarchyScope.hsNotebooks): nodeName = "Notebook"; break; case (OneNote.HierarchyScope.hsPages): nodeName = "Page"; break; case (OneNote.HierarchyScope.hsSections): nodeName = "Section"; break; default: return null; } var node = doc.Descendants(ns + nodeName).Where(n => n.Attribute("name").Value == objectName).FirstOrDefault(); return node.Attribute("ID").Value; } static string GetPageContent(string pageId) { string xml; onenoteApp.GetPageContent(pageId, out xml, OneNote.PageInfo.piAll); var doc = XDocument.Parse(xml); var outLine = doc.Descendants(ns + "Outline").First(); var content = outLine.Descendants(ns + "T").First(); string contentVal = content.Value; content.Value = "modified"; onenoteApp.UpdatePageContent(doc.ToString()); return null; } 

这正是我通过阅读网络上的示例(当然,您已经阅读了所有这些内容 )和窥探OneNote使用ONOMspy将数据存储在XML中的方式( http://blogs.msdn.com /b/johnguin/archive/2011/07/28/onenote-spy-omspy-for-onenote-2010.aspx )。

如果您想使用OneNote内容,则需要对XML有基本的了解。 将文本写入OneNote页面涉及创建大纲元素,其内容将包含在OEChildren元素中。 在OEChildren元素中,您可以使用许多其他子元素来表示大纲内容。 如果我正确地读取模式,它们可以是OEHTMLBlock类型。 就个人而言,我只使用过OE ,在这种情况下,你将拥有一个包含T (文本)元素的OE元素。 以下代码将创建一个大纲XElement并向其添加文本:

 // Get info from OneNote string xml; onApp.GetHierarchy(null, OneNote.HierarchyScope.hsSections, out xml); XDocument doc = XDocument.Parse(xml); XNamespace ns = doc.Root.Name.Namespace; // Assuming you have a notebook called "Test" XElement notebook = doc.Root.Elements(ns + "Notebook").Where(x => x.Attribute("name").Value == "Test").FirstOrDefault(); if (notebook == null) { Console.WriteLine("Did not find notebook titled 'Test'. Aborting."); return; } // If there is a section, just use the first one we encounter XElement section; if (notebook.Elements(ns + "Section").Any()) { section = notebook.Elements(ns + "Section").FirstOrDefault(); } else { Console.WriteLine("No sections found. Aborting"); return; } // Create a page string newPageID; onApp.CreateNewPage(section.Attribute("ID").Value, out newPageID); // Create the page element using the ID of the new page OneNote just created XElement newPage = new XElement(ns + "Page"); newPage.SetAttributeValue("ID", newPageID); // Add a title just for grins newPage.Add(new XElement(ns + "Title", new XElement(ns + "OE", new XElement(ns + "T", new XCData("Test Page"))))); // Add an outline and text content newPage.Add(new XElement(ns + "Outline", new XElement(ns + "OEChildren", new XElement(ns + "OE", new XElement(ns + "T", new XCData("Here is some new sample text.")))))); // Now update the page content onApp.UpdatePageContent(newPage.ToString()); 

以下是您发送给OneNote的实际XML的样子:

   <oe> <t><![CDATA[Test Page]]></t> </oe>          

希望有助于您入门!

使用Aspose.Note可以轻松解决给定任务。 以下代码创建一个新文档并在其标题中添加文本:

 var doc = new Document(); var page = new Page(doc); page.Title = new Title(doc) { TitleText = new RichText(doc) { Text = "Title text.", DefaultStyle = TextStyle.DefaultMsOneNoteTitleTextStyle }, TitleDate = new RichText(doc) { Text = new DateTime(2011, 11, 11).ToString("D", CultureInfo.InvariantCulture), DefaultStyle = TextStyle.DefaultMsOneNoteTitleDateStyle }, TitleTime = new RichText(doc) { Text = "12:34", DefaultStyle = TextStyle.DefaultMsOneNoteTitleTimeStyle } }; page.AppendChild(outline); doc.AppendChild(page); doc.Save("output.one") 

如果您使用的是C#,请在http://dev.onenote.com上查看较新的OneNote REST API。 它已经支持创建新页面,并且具有用于修补和向现有页面添加内容的beta API。