0

我试图查找是否可以通过 Microsoft.Office.Interop.OneNote 参考中的 UpdatePageContent 将内容添加到 oneNote 页面。

我想用我用 XML 制作的默认模板创建一个页面,但是 msdn 的文档说我这个函数只允许结构:

msdn 文档:

您必须在传递给 UpdatePageContent 方法的 XML 代码中包含的唯一对象是已更改的页面级对象(例如大纲、页面上的图像或页面上的墨迹)。此方法不会修改或删除您未在 bstrPageChangesXmlIn 参数中指定的页面级对象。该方法完全替换了页面级对象,例如大纲,其 ID 与您传递的对象的 ID 匹配。因此,您必须在代码中完全指定所有页面级对象,包括它们的现有内容和您想要对其进行的更改。

我的问题是:我可以使用这个库在页面中添加元素吗?如果是这样,如何?

谢谢

4

3 回答 3

1

您可以使用OMSpy工具来调查页面内容结构。以下是一些可帮助您入门的示例:

有 pageId 时设置页面标题

        private static void SePageTitle(string pageId, string pageTitle)
    {
        Microsoft.Office.Interop.OneNote.Application m_app = new Microsoft.Office.Interop.OneNote.Application();
        string strPagTitle = "<one:Page xmlns:one=\"http://schemas.microsoft.com/office/onenote/2010/onenote\" ID=\"{0}\" >" +
              "<one:Title selected=\"partial\" lang=\"en-US\">" +
                "<one:OE style=\"font-family:Calibri;font-size:17.0pt\">" +
                  "<one:T><![CDATA[{1}]]></one:T> " +
                "</one:OE>" +
              "</one:Title>" +
            "</one:Page>";
        strPagTitle = string.Format(strPagTitle, pageId, pageTitle);
        m_app.UpdatePageContent(strPagTitle);
    }

当您拥有 pageId 时将元素添加到页面:

        private static void SetElementInPage(string pageId)
    {
        Microsoft.Office.Interop.OneNote.Application m_app = new Microsoft.Office.Interop.OneNote.Application();
        string strPageContent = "<one:Page xmlns:one=\"http://schemas.microsoft.com/office/onenote/2010/onenote\" ID=\"{0}\" >" +
            "<one:Outline>" +
                "<one:Position x=\"36.0\" y=\"86.4000015258789\" z=\"0\" />" + 
                "<one:Size width=\"117.001953125\" height=\"40.28314971923828\" />" + 
                "<one:OEChildren>" + 
                    "<one:OE>" +
                        "<one:T><![CDATA[This is a sample data added to test out OneNote API functionality.  Following is a list item.]]></one:T>" + 
                    "</one:OE>" +
                "</one:OEChildren>" +
                "<one:OEChildren indent=\"2\">" +
                    "<one:OE  alignment=\"left\">" +
                        "<one:List>" +
                            "<one:Bullet bullet=\"2\" fontSize=\"11.0\" />" +
                        "</one:List>" + 
                        "<one:T><![CDATA[A for Apple]]></one:T>" +
                    "</one:OE>" +
                    "<one:OE  alignment=\"left\">" +
                        "<one:List>" +
                            "<one:Bullet bullet=\"2\" fontSize=\"11.0\" />" +
                        "</one:List>" + 
                        "<one:T><![CDATA[B for Ball]]></one:T>" +
                    "</one:OE>" +
                    "<one:OE  alignment=\"left\">" +
                        "<one:List>" +
                            "<one:Bullet bullet=\"2\" fontSize=\"11.0\" />" +
                        "</one:List>" + 
                        "<one:T><![CDATA[C for Cat]]></one:T>" +
                    "</one:OE>" +
               "</one:OEChildren>" +
            "</one:Outline>" +
            "</one:Page>";
        strPageContent = string.Format(strPageContent, pageId);
        m_app.UpdatePageContent(strPageContent);
    }
于 2013-02-17T07:54:18.223 回答
0

请在您询问时发布下一部分的帖子,以便其他 SOF 成员正确理解问题。

有关使用 Onepagenote 的语法和解决问题的方法,请浏览以下链接。

http://msdn.microsoft.com/en-us/magazine/ff796230.aspx

http://social.msdn.microsoft.com/Forums/pl-PL/officegeneral/thread/4596510a-6509-4e3a-be08-c11131fa4663

于 2013-02-14T18:26:54.717 回答
0

为什么要让自己这么难?您可以简单地在 OneNote 中创建模板,然后使用互操作来获取层次结构。所以之后你可以使用一个sectiongroup(这将是你的模板),这样你就可以在一个sectiongroup的每个部分中获取页面的内容。

我很难将元素从一个笔记本复制到另一个,但每个元素都有一个 ObjectID。这表明该元素是该特定页面已知的。删除此属性(因此不仅是属性的值),OneNote 会将元素视为新元素,并将 ObjectID 分配给元素。

我如何从页面中删除 ID 和 objectID 的代码示例:

string xml;
                    OneApplication.GetPageContent(page.Attributes["ID"].Value, out xml, PageInfo.piAll);
                    var doc = XDocument.Parse(xml);
                    var nodes = doc.Descendants();

                    foreach (var node in nodes)
                    {
                        if (node.Attribute("objectID") != null)
                        {
                            node.Attributes("objectID").Remove();
                        } else if (node.Attribute("ID") != null)
                        {
                            node.Attribute("ID").Value = "";
                        }
                    }

当您将所有元素添加到另一个页面时。你会看到他们。这100%有效,因为我自己做过:)

希望这会有所帮助。

于 2016-08-08T05:59:00.943 回答