2008-09-18 36 views
26

Làm cách nào để nhận tất cả các mục từ một lịch cụ thể (cho một ngày cụ thể). Ví dụ: Ví dụ: tôi có lịch với mục định kỳ vào mỗi tối thứ Hai. Khi tôi yêu cầu tất cả các mục như thế này:.NET: Nhận tất cả các mục lịch Outlook

CalendarItems = CalendarFolder.Items; 
CalendarItems.IncludeRecurrences = true; 

tôi chỉ nhận được 1 item ...

Có một cách dễ dàng để có được tất cả mục (item chính + các mặt hàng có nguồn gốc) từ một lịch? Trong tình huống cụ thể của tôi, bạn có thể đặt giới hạn ngày nhưng sẽ rất thú vị khi nhận tất cả các mục (các mục định kỳ của tôi là thời gian tự giới hạn).

Tôi đang sử dụng thư viện Đối tượng Microsoft Outlook 12 (Microsoft.Office.Interop.Outlook).

Trả lời

13

Tôi tin rằng bạn phải Hạn chế hoặc Tìm để nhận cuộc hẹn định kỳ, nếu không Outlook sẽ không mở rộng chúng. Ngoài ra, bạn phải Sắp xếp theo Bắt đầu trước khi thiết lập Bao gồmRecurrences.

+1

Xin lưu ý rằng chúng tôi gặp hiệu suất đáng kể hình phạt (lên đến 30 giây thay vì một số ms) trên một số hệ thống/dữ liệu đặt khi sắp xếp các mục. –

30

Tôi đã nghiên cứu tài liệu và đây là kết quả của tôi: Tôi đã đặt giới hạn thời gian một tháng được mã hóa cứng, nhưng đây chỉ là một ví dụ.

public void GetAllCalendarItems() 
    { 
     Microsoft.Office.Interop.Outlook.Application oApp = null; 
     Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = null; 
     Microsoft.Office.Interop.Outlook.MAPIFolder CalendarFolder = null; 
     Microsoft.Office.Interop.Outlook.Items outlookCalendarItems = null; 

     oApp = new Microsoft.Office.Interop.Outlook.Application(); 
     mapiNamespace = oApp.GetNamespace("MAPI"); ; 
     CalendarFolder = mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);   outlookCalendarItems = CalendarFolder.Items; 
     outlookCalendarItems.IncludeRecurrences = true; 

     foreach (Microsoft.Office.Interop.Outlook.AppointmentItem item in outlookCalendarItems) 
     { 
      if (item.IsRecurring) 
      { 
       Microsoft.Office.Interop.Outlook.RecurrencePattern rp = item.GetRecurrencePattern(); 
       DateTime first = new DateTime(2008, 8, 31, item.Start.Hour, item.Start.Minute, 0); 
       DateTime last = new DateTime(2008, 10, 1); 
       Microsoft.Office.Interop.Outlook.AppointmentItem recur = null; 



       for (DateTime cur = first; cur <= last; cur = cur.AddDays(1)) 
       { 
        try 
        { 
         recur = rp.GetOccurrence(cur); 
         MessageBox.Show(recur.Subject + " -> " + cur.ToLongDateString()); 
        } 
        catch 
        { } 
       } 
      } 
      else 
      { 
       MessageBox.Show(item.Subject + " -> " + item.Start.ToLongDateString()); 
      } 
     } 

    } 

Cảm ơn hai câu trả lời ở trên!

-3
calendarFolder = 
    mapiNamespace.GetDefaultFolder(
     Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar); 
+0

điều này chỉ cung cấp tham chiếu đến thư mục lịch. không trả lời câu hỏi chút nào. –

1

Nếu bạn muốn truy cập thư mục được chia sẻ từ bạn bè, bạn có thể đặt bạn bè làm người nhận. Yêu cầu: lịch của anh ấy phải được chia sẻ trước.

// Set recepient 
Outlook.Recipient oRecip = (Outlook.Recipient)oNS.CreateRecipient("[email protected]"); 

// Get calendar folder 
Outlook.MAPIFolder oCalendar = oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar); 
+1

điều này dường như không liên quan gì đến câu hỏi. –

7

tôi đã viết mã tương tự, nhưng sau đó phát hiện các chức năng xuất khẩu:

Application outlook; 
NameSpace OutlookNS; 

outlook = new ApplicationClass(); 
OutlookNS = outlook.GetNamespace("MAPI"); 

MAPIFolder f = OutlookNS.GetDefaultFolder(OlDefaultFolders.olFolderCalendar); 

CalendarSharing cs = f.GetCalendarExporter(); 
cs.CalendarDetail = OlCalendarDetail.olFullDetails; 
cs.StartDate = new DateTime(2011, 11, 1); 
cs.EndDate = new DateTime(2011, 12, 31); 
cs.SaveAsICal("c:\\temp\\cal.ics"); 
1

Không có nhu cầu mở rộng mặt hàng định kỳ bằng tay. Chỉ cần đảm bảo bạn sắp xếp các mục trước bằng cách sử dụng IncludeRecurrences.

Đây là VBA dụ:

tdystart = VBA.Format(#8/1/2012#, "Short Date") 
tdyend = VBA.Format(#8/31/2012#, "Short Date") 

Dim folder As MAPIFolder 
Set appointments = folder.Items 

appointments.Sort "[Start]" ' <-- !!! Sort is a MUST 
appointments.IncludeRecurrences = True ' <-- This will expand reccurent items 

Set app = appointments.Find("[Start] >= """ & tdystart & """ and [Start] <= """ & tdyend & """") 

While TypeName(app) <> "Nothing" 
    MsgBox app.Start & " " & app.Subject 
    Set app = appointments.FindNext 
Wend 
2

LinqPad snipped mà làm việc cho tôi:

//using Microsoft.Office.Interop.Outlook 
Application a = new Application(); 
Items i = a.Session.GetDefaultFolder(OlDefaultFolders.olFolderCalendar).Items; 
i.IncludeRecurrences = true; 
i.Sort("[Start]"); 
i = i.Restrict(
    "[Start] >= '10/1/2013 12:00 AM' AND [End] < '10/3/2013 12:00 AM'"); 


var r = 
    from ai in i.Cast<AppointmentItem>() 
    select new { 
     ai.Categories, 
     ai.Start, 
     ai.Duration 
     }; 
r.Dump(); 
+0

tôi cũng xin lưu ý rằng việc đảo ngược thứ tự sắp xếp và includerecurrences dường như không quan trọng khi tôi đang thử nghiệm nó. YMMV nhưng tôi đã sử dụng tính năng này gần đây và nó đã trả lại các bản sao cho những ngày đã cho. Truy vấn cuối cùng của tôi là trong 6 tháng dữ liệu, không phải chỉ trong vài ngày. –

1
public void GetAllCalendarItems() 
     { 
      DataTable sample = new DataTable(); //Sample Data 
      sample.Columns.Add("Subject", typeof(string)); 
      sample.Columns.Add("Location", typeof(string)); 
      sample.Columns.Add("StartTime", typeof(DateTime)); 
      sample.Columns.Add("EndTime", typeof(DateTime)); 
      sample.Columns.Add("StartDate", typeof(DateTime)); 
      sample.Columns.Add("EndDate", typeof(DateTime)); 
      sample.Columns.Add("AllDayEvent", typeof(bool)); 
      sample.Columns.Add("Body", typeof(string)); 


      listViewContacts.Items.Clear(); 
      oApp = new Outlook.Application(); 
      oNS = oApp.GetNamespace("MAPI"); 
      oCalenderFolder = oNS.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar); 
      outlookCalendarItems = oCalenderFolder.Items; 
      outlookCalendarItems.IncludeRecurrences = true; 
      // DataTable sample = new DataTable(); 
      foreach (Microsoft.Office.Interop.Outlook.AppointmentItem item in outlookCalendarItems) 
      { 
       DataRow row = sample.NewRow(); 
       row["Subject"] = item.Subject; 
       row["Location"] = item.Location; 
       row["StartTime"] = item.Start.TimeOfDay.ToString(); 
       row["EndTime"] = item.End.TimeOfDay.ToString(); 
       row["StartDate"] = item.Start.Date; 
       row["EndDate"] = item.End.Date; 
       row["AllDayEvent"] = item.AllDayEvent; 
       row["Body"] = item.Body; 
       sample.Rows.Add(row); 
      } 
      sample.AcceptChanges(); 
      foreach (DataRow dr in sample.Rows) 
       { 
        ListViewItem lvi = new ListViewItem(dr["Subject"].ToString()); 

        lvi.SubItems.Add(dr["Location"].ToString()); 
        lvi.SubItems.Add(dr["StartTime"].ToString()); 
        lvi.SubItems.Add(dr["EndTime"].ToString()); 
        lvi.SubItems.Add(dr["StartDate"].ToString()); 
        lvi.SubItems.Add(dr["EndDate"].ToString()); 
        lvi.SubItems.Add(dr["AllDayEvent"].ToString()); 
        lvi.SubItems.Add(dr["Body"].ToString()); 



        this.listViewContacts.Items.Add(lvi); 
       } 
      oApp = null; 
      oNS = null; 

     } 
0

Hãy thử điều này:

public List<AdxCalendarItem> GetAllCalendarItems() 
    { 
     Outlook.Application OutlookApp = new Outlook.Application(); 
     List<AdxCalendarItem> result = new List<AdxCalendarItem>(); 
      Outlook._NameSpace session = OutlookApp.Session; 
      if (session != null) 
       try 
       { 
        object stores = session.GetType().InvokeMember("Stores", BindingFlags.GetProperty, null, session, null); 
        if (stores != null) 
         try 
         { 
          int count = (int)stores.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, stores, null); 
          for (int i = 1; i <= count; i++) 
          { 
           object store = stores.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, stores, new object[] { i }); 
           if (store != null) 
            try 
            { 
             Outlook.MAPIFolder calendar = null; 
             try 
             { 
              calendar = (Outlook.MAPIFolder)store.GetType().InvokeMember("GetDefaultFolder", BindingFlags.GetProperty, null, store, new object[] { Outlook.OlDefaultFolders.olFolderCalendar }); 
             } 
             catch 
             { 
              continue; 
             } 
             if (calendar != null) 
              try 
              { 
               Outlook.Folders folders = calendar.Folders; 
               try 
               { 
                Outlook.MAPIFolder subfolder = null; 
                for (int j = 1; j < folders.Count + 1; j++) 
                { 
                 subfolder = folders[j]; 
                 try 
                 { 
                  // add subfolder items 
                  result.AddRange(GetAppointmentItems(subfolder)); 
                 } 
                 finally 
                 { if (subfolder != null) Marshal.ReleaseComObject(subfolder); } 
                } 
               } 
               finally 
               { if (folders != null) Marshal.ReleaseComObject(folders); } 
               // add root items 
               result.AddRange(GetAppointmentItems(calendar)); 
              } 
              finally { Marshal.ReleaseComObject(calendar); } 
            } 
            finally { Marshal.ReleaseComObject(store); } 
          } 
         } 
         finally { Marshal.ReleaseComObject(stores); } 
       } 
       finally { Marshal.ReleaseComObject(session); } 
     return result; 
    } 

    List<AdxCalendarItem> GetAppointmentItems(Outlook.MAPIFolder calendarFolder) 
    { 
     List<AdxCalendarItem> result = new List<AdxCalendarItem>(); 
     Outlook.Items calendarItems = calendarFolder.Items; 
     try 
     { 
      calendarItems.IncludeRecurrences = true; 
      Outlook.AppointmentItem appointment = null; 
      for (int j = 1; j < calendarItems.Count + 1; j++) 
      { 
       appointment = calendarItems[j] as Outlook.AppointmentItem; 
       try 
       { 
        AdxCalendarItem item = new AdxCalendarItem(
         calendarFolder.Name, 
         appointment.Subject, 
            appointment.Location, 
            appointment.Start, 
            appointment.End, 
            appointment.Start.Date, 
            appointment.End.Date, 
            appointment.AllDayEvent, 
            appointment.Body); 
        result.Add(item); 
       } 
       finally 
       { 
        { Marshal.ReleaseComObject(appointment); } 
       } 
      } 
     } 
     finally { Marshal.ReleaseComObject(calendarItems); } 
     return result; 
    } 
} 

public class AdxCalendarItem 
{ 
    public string CalendarName; 
    public string Subject; 
    public string Location; 
    public DateTime StartTime; 
    public DateTime EndTime; 
    public DateTime StartDate; 
    public DateTime EndDate; 
    public bool AllDayEvent; 
    public string Body; 

    public AdxCalendarItem(string CalendarName, string Subject, string Location, DateTime StartTime, DateTime EndTime, 
          DateTime StartDate, DateTime EndDate, bool AllDayEvent, string Body) 
    { 
     this.CalendarName = CalendarName; 
     this.Subject = Subject; 
     this.Location = Location; 
     this.StartTime = StartTime; 
     this.EndTime = EndTime; 
     this.StartDate = StartDate; 
     this.EndDate = EndDate; 
     this.AllDayEvent = AllDayEvent; 
     this.Body = Body; 

    } 

} 
Các vấn đề liên quan