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.