2014-12-04 17 views
8

Tôi đã thấy nhiều bài viết về điều này nhưng tất cả chúng đều không đầy đủ hoặc không trả lời câu hỏi của tôi. Sử dụng C# và OneNote Interop, tôi chỉ muốn viết văn bản vào Trang OneNote 2013 hiện tại. Hiện nay tôi có một Notebook OneNote, với mục tiêu đề "Sample_Section "và một trang gọi là "MyPage".Cách viết vào trang OneNote 2013 Sử dụng C# và OneNote Interop

tôi cần để có thể sử dụng C# mã để viết văn bản cho trang này, nhưng tôi không thể tìm ra cách hoặc tìm thấy bất kỳ nguồn lực để Tôi đã xem xét tất cả các ví dụ mã trên web và không có câu trả lời nào cho câu hỏi đơn giản này hoặc có thể thực hiện điều này.Cũng nhiều ví dụ mã đã lỗi thời và bị phá vỡ khi cố gắng chạy chúng. mẫu mã Microsoft cho biết cách thay đổi tên của một Phần nhưng tôi không thể tìm thấy bất kỳ mã nào để viết văn bản vào một số Page. Không có cách nào đơn giản để thực hiện việc này mà tôi có thể thấy. và xem các ví dụ khác nhau trực tuyến nhưng không ai có thể trợ giúp.

Tôi cũng đã xem các bài viết MSDN trên OneNoteInterop. Tôi mơ hồ hiểu cách OneNoteInterop hoạt động thông qua XML nhưng bất kỳ trợ giúp bổ sung nào cũng hiểu được điều đó cũng sẽ được đánh giá cao. Quan trọng nhất là tôi thực sự sẽ đánh giá cao một ví dụ mã chứng minh cách viết văn bản vào một Trang Notebook Notebook OneNote 2013.

Tôi đã cố gắng sử dụng này câu trả lời Stack Overflow: Creating new One Note 2010 page from C#

Tuy nhiên, có 2 điều về giải pháp này mà không trả lời câu hỏi của tôi:

1) Các giải pháp rõ rệt cho thấy làm thế nào để tạo ra một mới trang, không phải cách viết văn bản cho nó hoặc cách điền trang với bất kỳ thông tin nào.

2) Khi tôi cố gắng chạy mã được đánh dấu là giải pháp, tôi nhận được một lỗi ở dòng sau:

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

Lý do được rằng giá trị của "nút" là null, bất kỳ Trợ giúp sẽ được đánh giá cao.

Trả lời

8

Tôi đã hỏi cùng một câu hỏi trên diễn đàn MSDN và được cung cấp câu trả lời tuyệt vời này. Dưới đây là một ví dụ đẹp, gọn gàng về cách viết cho OneNote bằng C# và OneNote interop. Tôi hy vọng rằng điều này có thể giúp mọi người trong tương lai.

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

Nếu bạn đang sử dụng C#, hãy xem API REST OneNote mới hơn tại http://dev.onenote.com. Nó đã hỗ trợ tạo một trang mới và có API beta để vá và thêm nội dung vào một trang hiện có.

+1

Cảm ơn bạn, tuy nhiên tôi đã đọc bài viết trên trước khi đăng và thậm chí đã thử một số ví dụ về mã. Và tôi vẫn không thể tìm thấy mã để thêm văn bản/nội dung vào tài liệu OneNote bằng cách sử dụng Interop. Tôi không cố gắng phát triển một ứng dụng như ứng dụng Windows Store/Windows Phone sẽ liên tục giao tiếp với OneNote hoặc API OneNote. Tôi lý tưởng chỉ cần tìm cách thiết kế một ứng dụng giao diện điều khiển để tạo và chỉnh sửa tài liệu One Note. Tương tự như những gì có thể được thực hiện bằng cách sử dụng Interop cho Word và Excel – B17

+0

Xem liệu http://stackoverflow.com/questions/14875760/onenote-inserting-elements-with-updatepagecontent có giúp ích gì không. – DipakBoyed

+1

Điều này không chỉ dành cho tài liệu OneNote trực tuyến? – johnny

2

Đây chỉ là những gì tôi đã thu lượm từ việc đọc ví dụ trên web (tất nhiên, bạn đã đọc tất cả những) và nhìn trộm vào cách cửa hàng OneNote dữ liệu của nó trong XML sử dụng ONOMspy (http://blogs.msdn.com/b/johnguin/archive/2011/07/28/onenote-spy-omspy-for-onenote-2010.aspx).

Nếu bạn muốn làm việc với nội dung OneNote, bạn sẽ cần hiểu biết cơ bản về XML. Viết văn bản vào trang OneNote liên quan đến việc tạo phần tử phác thảo, nội dung của nó sẽ được chứa trong các phần tử OEChildren. Trong một phần tử OEChildren, bạn có thể có nhiều phần tử con khác đại diện cho nội dung phác thảo. Đây có thể là loại OE hoặc HTMLBlock, nếu tôi đọc chính xác giản đồ.Cá nhân, tôi chỉ từng sử dụng OE và trong trường hợp này, bạn sẽ có phần tử OE chứa phần tử T (văn bản). Các mã sau sẽ tạo ra một XElement phác thảo và thêm văn bản vào nó:

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

Đây là những gì XML thực tế bạn đang gửi đến OneNote trông giống như:

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

Hy vọng rằng sẽ giúp giúp bạn bắt đầu!

2

Tác vụ đã cho có thể được giải quyết dễ dàng bằng cách sử dụng Aspose.Note. Đoạn mã sau tạo một Tài liệu mới và thêm văn bản vào tiêu đề của nó:

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ác vấn đề liên quan