.NET: Get all Outlook calendar items
Asked Answered
S

12

33

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).

Sabinesabino answered 18/9, 2008 at 8:19 Comment(0)
A
14

I believe that you must Restrict or Find in order to get recurring appointments, otherwise Outlook won't expand them. Also, you must Sort by Start before setting IncludeRecurrences.

Assignable answered 18/9, 2008 at 11:8 Comment(1)
Please be aware that we encountered significant performance penalties (up to 30 seconds instead of some ms) on some systems/data sets when sorting the items.Justifiable
S
36

I've studied the docs and this is my result: I've put a time limit of one month hard-coded, but this is just an example.

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

}
Sabinesabino answered 18/9, 2008 at 12:42 Comment(0)
A
14

I believe that you must Restrict or Find in order to get recurring appointments, otherwise Outlook won't expand them. Also, you must Sort by Start before setting IncludeRecurrences.

Assignable answered 18/9, 2008 at 11:8 Comment(1)
Please be aware that we encountered significant performance penalties (up to 30 seconds instead of some ms) on some systems/data sets when sorting the items.Justifiable
B
8

I wrote similar code, but then found the export functionality:

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");
Batik answered 3/12, 2011 at 10:14 Comment(0)
F
5

LinqPad snipped that works for me:

//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();
Fishbowl answered 3/10, 2013 at 2:9 Comment(1)
i would also note that reversing the order of the sort and includerecurrences didn't seem to matter when i was testing it. YMMV but I used this recently and it returned duplicates for the days given. My final query was for 6 months of data though, not for just a couple of days.Fishbowl
B
2

If you need want to access the shared folder from your friend, then you can set your friend as the recipient. Requirement: his calendar must be shared first.

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

// Get calendar folder 
Outlook.MAPIFolder oCalendar = oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar);
Bakken answered 18/8, 2011 at 11:1 Comment(1)
this doesn't appear to have anything to do with the question.Fishbowl
S
2

There is no need to expand recurring items manually. Just ensure you sort the items before using IncludeRecurrences.

Here is VBA example:

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
Streptococcus answered 27/3, 2013 at 21:14 Comment(0)
S
2
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;

        }
Skyscraper answered 10/2, 2014 at 5:50 Comment(0)
L
1

I found this article very useful: https://learn.microsoft.com/en-us/office/client-developer/outlook/pia/how-to-search-and-obtain-appointments-in-a-time-range

It demonstrates how to get calendar entries in a specified time range. It worked for me. Here is the source code from the article for your convenience :)

using Outlook = Microsoft.Office.Interop.Outlook;

private void DemoAppointmentsInRange()
{
    Outlook.Folder calFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
        as Outlook.Folder;
    DateTime start = DateTime.Now;
    DateTime end = start.AddDays(5);
    Outlook.Items rangeAppts = GetAppointmentsInRange(calFolder, start, end);
    if (rangeAppts != null)
    {
        foreach (Outlook.AppointmentItem appt in rangeAppts)
        {
             Debug.WriteLine("Subject: " + appt.Subject 
                 + " Start: " + appt.Start.ToString("g"));
        }
    }
}

/// <summary>
/// Get recurring appointments in date range.
/// </summary>
/// <param name="folder"></param>
/// <param name="startTime"></param>
/// <param name="endTime"></param>
/// <returns>Outlook.Items</returns>
private Outlook.Items GetAppointmentsInRange(
    Outlook.Folder folder, DateTime startTime, DateTime endTime)
{
    string filter = "[Start] >= '"
        + startTime.ToString("g")
        + "' AND [End] <= '"
        + endTime.ToString("g") + "'";
    Debug.WriteLine(filter);
    try
    {
        Outlook.Items calItems = folder.Items;
        calItems.IncludeRecurrences = true;
        calItems.Sort("[Start]", Type.Missing);
        Outlook.Items restrictItems = calItems.Restrict(filter);
        if (restrictItems.Count > 0)
        {
            return restrictItems;
        }
        else
        {
            return null;
        }
    }
    catch { return null; }
 }
Lamellirostral answered 16/8, 2019 at 20:48 Comment(0)
O
1

Here's a combination of a few answers to get entries from the past 30 days. Will output to console but you can take the console log output and save to a file or whatever you want from there. Thanks to everyone for posting their code here, was very helpful!

using Microsoft.Office.Interop.Outlook;

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 = false;

Console.WriteLine("Showing Calendar Items From the last 30 days");

//Set your dates here...
DateTime startTime = DateTime.Now.AddDays(-31);
DateTime endTime = DateTime.Now;

string filter = "[Start] >= '"
    + startTime.ToString("g")
    + "' AND [End] <= '"
    + endTime.ToString("g") + "'";

try
{

    outlookCalendarItems.Sort("[Start]", Type.Missing);


    foreach (Microsoft.Office.Interop.Outlook.AppointmentItem item in outlookCalendarItems.Restrict(filter))
    {

        Console.WriteLine(item.Subject + " -> " + item.Start.ToLongDateString());

    }


}
catch {  }


Console.WriteLine("Finished");
}


GetAllCalendarItems();
Ossify answered 8/8, 2022 at 15:31 Comment(0)
G
0

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;

    }

}
Giraudoux answered 3/2, 2015 at 9:16 Comment(0)
G
0
    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

Grown answered 27/12, 2018 at 10:17 Comment(0)
T
-4
calendarFolder = 
    mapiNamespace.GetDefaultFolder(
        Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);
Tidemark answered 19/5, 2010 at 21:11 Comment(1)
this just provides a reference to the calendar folder. doesn't answer the question at all.Fishbowl

© 2022 - 2024 — McMap. All rights reserved.