2008-09-18 2 views
26

Как я могу получить все элементы из определенного календаря (на определенную дату). Давайте скажем, например, что каждый понедельник вечером у меня есть календарь с повторяющимся предметом. Когда я прошу все предметы, как это:. NET: получить все элементы календаря Outlook.

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

я получаю только 1 пункт ...

Есть простой способ получить все элементы (основной пункт + производные элементов) из календаря? В моей конкретной ситуации можно установить ограничение по дате, но было бы здорово просто получить все предметы (мои повторяющиеся предметы ограничены временем).

Я использую библиотеку объектов Microsoft Outlook 12 (Microsoft.Office.Interop.Outlook).

ответ

13

Я считаю, что вы должны ограничить или найти, чтобы получать повторяющиеся встречи, иначе Outlook не расширит их. Кроме того, вы должны Сортировать по началу до настройка IncludeRecurrences.

+1

Пожалуйста, обратите внимание, что мы столкнулись со значительными производительность штрафы (до 30 секунд вместо нескольких мс) на некоторых системах/данных при сортировке элементов. – 2012-06-14 09:07:40

30

Я изучил документы, и это мой результат: Я поставил ограничение на один месяц жестко закодированным, но это всего лишь пример.

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

    } 

Спасибо за два ответа выше!

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

это просто дает ссылку на папку календаря. вообще не отвечает на вопрос. – 2013-10-01 20:06:41

1

Если вам нужно получить доступ к общей папке от своего друга, вы можете установить своего друга как получателя. Требование: его календарь должен быть разделен первым.

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

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

это, похоже, не имеет никакого отношения к вопросу. – 2013-10-01 20:07:07

7

я написал подобный код, но затем нашел функцию экспорта:

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

Там нет необходимости расширять повторяющиеся элементы вручную. Просто убедитесь, что вы сортируете элементы до с использованием IncludeRecurrences.

Вот 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 отрезала, что работает для меня:

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

Я также хотел бы отметить, что изменение порядка сортировки и включений, как представляется, не имеет значения, когда я его тестировал. YMMV, но я использовал это недавно, и он возвратил дубликаты за указанные дни. Мой последний запрос был за 6 месяцев данных, хотя и не на пару дней. – 2013-10-03 02:11:52

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

Попробуйте это:

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; 

    } 

} 
Смежные вопросы