.NET: Get all Outlook calendar items

2019-01-10 09:49发布

How can I get all items from a specific calendar (for a specific date). Lets say for instance that I have a calendar with a recurring item every Monday evening. When I request all items like this:

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

I only get 1 item...

Is there an easy way to get all items (main item + derived items) from a calendar? In my specific situation it can be possible to set a date limit but it would be cool just to get all items (my recurring items are time limited themselves).

I'm using the Microsoft Outlook 12 Object library (Microsoft.Office.Interop.Outlook).

10条回答
Juvenile、少年°
2楼-- · 2019-01-10 10:47

Try this:

    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;

    }

}
查看更多
看我几分像从前
3楼-- · 2019-01-10 10:48
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;

        }
查看更多
劫难
4楼-- · 2019-01-10 10:48
calendarFolder = 
    mapiNamespace.GetDefaultFolder(
        Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);
查看更多
Luminary・发光体
5楼-- · 2019-01-10 10:49
    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();

                   // get all date 
            DateTime first = new DateTime( item.Start.Hour, item.Start.Minute, 0);
            DateTime last = new DateTime();
            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());
        }
    }

}

it is working I try it but you need to add reference about Microsoft outlook

查看更多
登录 后发表回答