c# office-interop onenote

Cómo escribir en una página de OneNote 2013 con C#y la interoperabilidad de OneNote



office-interop (4)

He visto muchos artículos sobre esto, pero todos están incompletos o no responden mi pregunta. Con C# y OneNote Interop, me gustaría simplemente escribir texto en una página existente de OneNote 2013. Actualmente tengo un cuaderno OneNote, con una sección titulada "Sample_Section " y una página llamada "MyPage" .

Necesito poder usar C# código C# para escribir texto en esta página, pero no puedo entender cómo o encontrar recursos para hacerlo. He examinado todos los ejemplos de código en la web y ninguno responde a esta simple pregunta o puedo hacerlo. Además, muchos de los ejemplos de código están desactualizados y se rompen al intentar ejecutarlos.

Utilicé el ejemplo de código de Microsoft que muestra cómo cambiar el nombre de una Sección, pero no puedo encontrar ningún código para escribir texto en una Page . No hay una manera simple de hacer esto que pueda ver. Me he tomado mucho tiempo para investigar esto y ver los diferentes ejemplos en línea, pero ninguno puede ayudar.

Ya he visto los artículos de MSDN en OneNote Interop también. Comprendo vagamente cómo funciona OneNote Interop través de XML pero cualquier ayuda adicional para comprender eso también sería apreciada. Lo más importante es que realmente agradecería un ejemplo de código que demuestre cómo escribir texto en una página de OneNote 2013 Notebook.

He intentado usar esta respuesta de desbordamiento de pila: crear una nueva página de One Note 2010 desde C #

Sin embargo, hay 2 cosas sobre esta solución que no responden a mi pregunta:

1) La solución marcada muestra cómo crear una nueva página, no cómo escribirle texto o cómo llenar la página con cualquier información.

2) Cuando intento ejecutar el código que está marcado como la solución, aparece un error en la siguiente línea:

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

La razón es que el valor de "nodo" es nulo, cualquier ayuda sería muy apreciada.


Esto es justo lo que aprendí al leer ejemplos en la web (por supuesto, ya los has leído todos ) y ver cómo OneNote almacena sus datos en XML usando ONOMspy ( http://blogs.msdn.com/b/johnguin/archive/2011/07/28/onenote-spy-omspy-for-onenote-2010.aspx ).

Si desea trabajar con contenido de OneNote, necesitará una comprensión básica de XML. Escribir texto en una página de OneNote implica crear un elemento de esquema, cuyo contenido estará contenido en los elementos de OEChildren . Dentro de un elemento OEChildren , puede tener muchos otros elementos secundarios que representan el contenido del esquema. Estos pueden ser de tipo OE o HTMLBlock , si estoy leyendo el esquema correctamente. Personalmente, solo he usado OE , y en este caso, tendrás un elemento OE que contiene un elemento T (texto). El siguiente código creará un esquema XElement y le agregará texto:

// 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());

Así es como se ve el XML real que está enviando a OneNote:

<Page ID="{20A13151-AD1C-4944-A3D3-772025BB8084}{1}{A1954187212743991351891701718491104445838501}" xmlns="http://schemas.microsoft.com/office/onenote/2013/onenote"> <Title> <OE> <T><![CDATA[Test Page]]></T> </OE> </Title> <Outline> <OEChildren> <OE> <T><![CDATA[Here is some new sample text.]]></T> </OE> </OEChildren> </Outline> </Page>

¡Espero que eso te ayude a comenzar!


Hice la misma pregunta en los foros de MSDN y recibí esta gran respuesta. A continuación se muestra un ejemplo bonito y limpio de cómo escribir en OneNote usando C # y la interoperabilidad de OneNote. Espero que esto pueda ayudar a las personas en el futuro.

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; }


La tarea dada se puede resolver fácilmente usando Aspose.Note . El siguiente código crea un nuevo documento y agrega texto a su título:

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")


Si usa C #, consulte la nueva API de REST de OneNote en http://dev.onenote.com . Ya es compatible con la creación de una nueva página y tiene una API beta para parchear y agregar contenido a una página existente.