2014-12-04 27 views
8

Ho visto molti articoli a riguardo ma tutti sono incompleti o non rispondono alla mia domanda. Utilizzando C# e l'interoperabilità OneNote, vorrei semplicemente scrivere del testo su una pagina OneNote 2013 esistente. Attualmente ho un blocco appunti di OneNote, con una sezione intitolata "Sample_Section "e una pagina chiamata "MyPage".Come scrivere una pagina di OneNote 2013 utilizzando C# e OneNote Interop

ho bisogno di essere in grado di utilizzare C# codice per scrivere il testo a questa pagina, ma non riesco a capire come e trovare le risorse per Ho visto tutti gli esempi di codice sul Web e nessuno ha risposto a questa semplice domanda o sono in grado di farlo.Per molti degli esempi di codice sono obsoleti e si interrompono quando si tenta di eseguirli.

Ho usato l'esempio di codice Microsoft che mostra come modificare il nome di una sezione ma non riesco a trovare alcun codice per scrivere il testo su un Page. Non c'è un modo semplice per farlo che possa essere visto. Mi ci è voluto molto tempo per cercare questo e guarda il diversi esempi online ma nessuno è in grado di aiutare.

Ho già visto gli articoli MSDN su OneNoteInterop. Comprendo vagamente come il OneNoteInterop funziona tramite XML ma qualsiasi aiuto supplementare che possa essere apprezzato. Soprattutto, mi piacerebbe davvero apprezzare un esempio di codice che dimostra come scrivere testo in una pagina Notebook 2013 OneNote.

Ho provato con questa risposta Stack Overflow: Creating new One Note 2010 page from C#

Tuttavia, ci sono 2 cose su questa soluzione che non rispondere alla mia domanda:

1) La soluzione marcata mostra come creare una nuova pagina, non come scrivere del testo o come popolare la pagina con qualsiasi informazione.

2) Quando si tenta di eseguire il codice contrassegnato come la soluzione, si ottiene un errore nella seguente riga:

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

Il motivo è che il valore di "nodo" è nullo, qualsiasi l'aiuto sarebbe molto apprezzato.

risposta

8

Ho fatto la stessa domanda sui forum MSDN e mi è stata data questa ottima risposta. Di seguito è riportato un esempio chiaro e pulito di come scrivere in OneNote utilizzando C# e l'interoperabilità di OneNote. Spero che questo possa aiutare le persone in 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; 
    } 
0

Se si utilizza C#, controllare la nuova API REST di OneNote al numero http://dev.onenote.com. Supporta già la creazione di una nuova pagina e ha un'API beta per applicare patch e aggiungere contenuti a una pagina esistente.

+1

Grazie, tuttavia, ho già letto l'articolo precedente prima di postare e anche provato alcuni esempi di codice. E non ero ancora in grado di trovare il codice per aggiungere testo/contenuto a un documento di OneNote utilizzando Interop. Non sto cercando di sviluppare un'applicazione come un'applicazione Windows Store/Windows Phone che comunica costantemente con OneNote o l'API OneNote. Sto idealmente cercando solo di progettare un'applicazione console per creare e modificare un documento One Note. Simile a ciò che può essere fatto usando Interop per Word ed Excel – B17

+0

Vedere se http://stackoverflow.com/questions/14875760/onenote-inserting-elements-with-updatepagecontent aiuta. – DipakBoyed

+1

Non è solo per i documenti OneNote online? – johnny

2

questo è proprio quello che ho spigolato dalla lettura esempi sul web (ovviamente, avete già letto tutti coloro) e sbirciando sul modo in cui memorizza OneNote i suoi dati in XML utilizzando ONOMspy (http://blogs.msdn.com/b/johnguin/archive/2011/07/28/onenote-spy-omspy-for-onenote-2010.aspx).

Se si desidera lavorare con il contenuto di OneNote, è necessaria una conoscenza di base dell'XML. La scrittura di testo in una pagina di OneNote prevede la creazione di un elemento struttura, il cui contenuto sarà contenuto negli elementi OEChildren. All'interno di un elemento OEChildren, puoi avere molti altri elementi figlio che rappresentano il contenuto del profilo. Questi possono essere di tipo OE o HTMLBlock, se sto leggendo lo schema correttamente.Personalmente, ho sempre usato solo OE, e in questo caso, avrai un elemento OE contenente un elemento T (testo). Il seguente codice creerà un XElement contorno e aggiungere del testo ad esso:

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

Ecco ciò che il reale XML si sta inviando a OneNote assomiglia:

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

Speranza che aiuta per iniziare!

2

L'attività determinata può essere facilmente risolta utilizzando Aspose.Note. Il codice seguente crea un nuovo documento e aggiunge del testo al suo titolo:

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