2008-09-18 21 views
26

Jak uzyskać wszystkie elementy z określonego kalendarza (dla określonej daty). Powiedzmy na przykład, że mam kalendarz z elementem cyklicznym w każdy poniedziałek wieczorem. Kiedy zwrócić wszystkie elementy tak:.NET: Pobierz wszystkie elementy kalendarza Outlook:

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

mam tylko 1 rzecz ...

Czy istnieje prosty sposób uzyskać wszystkie przedmioty (Główny artykuł + przedmioty pochodzące) z kalendarza? W mojej konkretnej sytuacji może być możliwe ustawienie limitu daty, ale byłoby fajnie po prostu zdobyć wszystkie przedmioty (moje powtarzające się przedmioty są ograniczone czasowo same w sobie).

Używam biblioteki obiektów Microsoft Outlook 12 (Microsoft.Office.Interop.Outlook).

Odpowiedz

13

Uważam, że należy ograniczyć lub znaleźć w celu uzyskania powtarzających się terminów, w przeciwnym razie program Outlook ich nie rozszerzy. Należy również wybrać opcję Sortuj według Start przed ustawieniem IncludeRecurrences na.

+1

Należy pamiętać, że napotkaliśmy znaczącą wydajność kary (do 30 sekund zamiast niektórych ms) w niektórych systemach/danych ustawia podczas sortowania przedmiotów. –

30

Przestudiowałem dokumentację i to jest mój wynik: Ustawiłem na czas jednego miesiąca zakodowany, ale to tylko przykład.

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

    } 

Dzięki za dwie odpowiedzi powyżej!

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

to tylko zawiera odniesienie do folderu kalendarza. w ogóle nie odpowiada na pytanie. –

1

Jeśli chcesz uzyskać dostęp do udostępnionego folderu od znajomego, możesz ustawić swojego przyjaciela jako odbiorcę. Wymagania: jego kalendarz musi być udostępniony jako pierwszy.

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

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

wydaje się, że nie ma to nic wspólnego z pytaniem. –

7

pisałem podobny kod, ale potem okazało się, że funkcja eksportu:

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

Nie ma potrzeby ręcznego poszerzyć powtarzające się elementy. Po prostu upewnij się, że sortujesz elementy przed przy użyciu IncludeRecurrences.

Oto przykład VBA:

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 że pracuje dla mnie:

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

Chciałbym również zauważyć, że odwrócenie kolejności sortowania i włączeń zdawało się nie mieć znaczenia, kiedy testowałem to. YMMV, ale użyłem tego ostatnio i zwróciło duplikaty dla podanych dni. Moje ostatnie zapytanie dotyczyło 6 miesięcy danych, a nie tylko przez kilka dni. –

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

Spróbuj tego:

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; 

    } 

}