Как написать на страницу OneNote 2013 с помощью C# и взаимодействия OneNote

Я видел много статей по этому поводу, но все они либо неполные, либо не отвечают на мой вопрос. С помощью C# и OneNote Interop, я хотел бы просто написать текст на существующей странице OneNote 2013. В настоящее время у меня есть блокнот OneNote с разделом под названием "Sample_Section"и страница называется "MyPage",

Мне нужно уметь пользоваться C# код для написания текста на этой странице, но я не могу понять, как или найти какие-либо ресурсы для этого. Я просмотрел все примеры кода в Интернете, и ни один из них не ответил на этот простой вопрос или не смог этого сделать. Также многие примеры кода устарели и ломаются при попытке их запустить.

Я использовал Microsoft Пример кода, который показывает, как изменить имя раздела, но я не могу найти код для записи текста в Page, Нет простого способа сделать это, что я вижу. Я потратил много времени на изучение этого вопроса и просмотр различных примеров в Интернете, но ни один из них не может помочь.

Я уже просмотрел MSDN статьи о OneNoteInterop также. Я смутно понимаю, как OneNoteInterop работает через XML но любая дополнительная помощь, понимающая это, будет также цениться. Самое главное, я был бы очень признателен за пример кода, который демонстрирует, как записать текст в OneNote Страница тетради 2013.

Я попытался использовать этот ответ переполнения стека: Создание новой страницы One Note 2010 из C#

Однако в этом решении есть две вещи, которые не отвечают на мой вопрос:

1) Помеченное решение показывает, как создать новую страницу, а не как написать на нее текст или как заполнить страницу какой-либо информацией.

2) Когда я пытаюсь запустить код, помеченный как решение, я получаю сообщение об ошибке в следующей строке:

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

Причина в том, что значение "узла" является нулевым, любая помощь будет принята с благодарностью.

4 ответа

Решение

Я задал тот же вопрос на форумах MSDN и получил отличный ответ. Ниже приведен хороший чистый пример записи в OneNote с использованием C# и взаимодействия 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 хранит свои данные в XML с помощью ONOMspy ( 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());

Вот как выглядит фактический XML, который вы отправляете в 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>

Надеюсь, что это поможет вам начать!

Данная задача может быть легко решена с помощью 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#, ознакомьтесь с более новым API REST OneNote по адресу http://dev.onenote.com/. Он уже поддерживает создание новой страницы и имеет бета-версию API для исправления и добавления контента на существующую страницу.

Другие вопросы по тегам