我见过很多关于此的文章,但所有文章都不完整或者没有回答我的问题。使用C#
和OneNote Interop,我想简单地将文本写入现有的OneNote 2013页面。目前我有一个OneNote笔记本,其标题为"Sample_Section
"和一个名为"MyPage"
的页面。
我需要能够使用C#
代码将文本写入此页面,但我无法弄清楚如何或找到任何资源来执行此操作。我已经查看了网络上的所有代码示例,没有人回答这个简单的问题,或者能够做到这一点。此外,许多代码示例在尝试运行它们时已过时并中断。
我使用了Microsoft
代码示例,该示例演示了如何更改Section的名称但我找不到任何代码来将文本写入Page
。我可以看到没有简单的方法可以做到这一点。我花了很多时间研究这个并在线查看不同的例子,但没有人能够提供帮助。
我已经查看了MSDN
OneNote
上的Interop
文章。我隐约了解OneNote
Interop
如何通过XML
工作,但任何额外的帮助理解也会受到赞赏。最重要的是,我非常感谢一个代码示例,它演示了如何将文本写入OneNote
2013笔记本页面。
我尝试过使用此Stack Overflow答案: Creating new One Note 2010 page from C#
然而,有两个关于此解决方案的事情没有回答我的问题:
1)标记的解决方案显示了如何创建新页面,而不是如何向其中写入文本或如何使用任何信息填充页面。
2)当我尝试运行标记为解决方案的代码时,我在以下行收到错误:
var node = doc.Descendants(ns + nodeName).Where(n => n.Attribute("name").Value == objectName).FirstOrDefault();
return node.Attribute("ID").Value;
原因是"节点"是null,任何帮助将不胜感激。
答案 0 :(得分:10)
我在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;
}
答案 1 :(得分:2)
这正是我通过阅读网络上的示例(当然,您已经阅读所有这些)所获得的内容,并深入探讨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
元素中,您可以使用许多其他子元素来表示大纲内容。如果我正确读取架构,它们可以是OE
或HTMLBlock
类型。就个人而言,我只使用过OE
,在这种情况下,您将拥有一个包含OE
(文本)元素的T
元素。以下代码将创建一个大纲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:
<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>
希望有助于您入门!
答案 2 :(得分:2)
使用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")
答案 3 :(得分:0)
如果您使用的是C#,请在http://dev.onenote.com查看较新的OneNote REST API。它已经支持创建新页面,并且有一个beta API来修补和添加内容到现有页面。