.NET:获取所有Outlook日历项目

如何从特定日历(特定日期)获取所有项目。 让我们说比如每周一晚上我有一个带有定期项目的日历。 当我请求所有这样的项目时:

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

我只得到1件……

是否有一种简单的方法可以从日历中获取所有项目(主要项目+派生项目)? 在我的具体情况下,可以设置一个日期限制,但只是为了获得所有项目(我的经常性项目本身有时间限制)会很酷。

我正在使用Microsoft Outlook 12对象库(Microsoft.Office.Interop.Outlook)

我认为您必须限制或查找以获得定期约会,否则Outlook将不会扩展它们。 此外,您必须设置IncludeRecurrences 之前按开始排序。

我研究了文档,这是我的结果:我已经将一个月的时间限制硬编码,但这只是一个例子。

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

我写了类似的代码,但随后找到了导出function:

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

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() select new { ai.Categories, ai.Start, ai.Duration }; r.Dump(); 

如果您需要从朋友那里访问共享文件夹,则可以将您的朋友设置为收件人。 要求:必须先分享他的日历。

 // Set recepient Outlook.Recipient oRecip = (Outlook.Recipient)oNS.CreateRecipient("abc@yourmail.com"); // Get calendar folder Outlook.MAPIFolder oCalendar = oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar); 

无需手动扩展重复项目。 只需确保使用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 
 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; } 

试试这个:

  public List GetAllCalendarItems() { Outlook.Application OutlookApp = new Outlook.Application(); List result = new List(); 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 GetAppointmentItems(Outlook.MAPIFolder calendarFolder) { List result = new List(); 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; } } 
 calendarFolder = mapiNamespace.GetDefaultFolder( Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);