.NET: Obtenez tous les éléments du calendrier Outlook

Comment puis-je obtenir tous les éléments d'un calendrier spécifique (pour une date spécifique). Disons par exemple que j'ai un calendrier avec un article récurrent chaque lundi soir. Quand je demande à tous les éléments comme ceci:

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

je seulement obtenir 1 point...

Est-il un moyen facile d'obtenir éléments (élément principal + éléments dérivés) d'un calendrier? Dans ma situation spécifique, il peut être possible de fixer une date limite, mais ce serait cool juste pour obtenir tous les éléments (mon récurrents sont eux-mêmes limités dans le temps).

J'utilise la bibliothèque D'objets Microsoft Outlook 12 (Microsoft.Bureau.Interop.Outlook).

26
demandé sur Ether 2008-09-18 12:19:35

9 réponses

je crois que vous devez Restreindre ou de Trouver dans l'ordre pour obtenir des rendez-vous récurrents, sinon Outlook ne sera pas de la développer. Aussi, vous devez Trier par Start avant mise en place D'IncludeRecurrences.

13
répondu Mark Brackett 2008-09-18 11:08:05

j'ai étudié les documents et voici mon résultat: J'ai mis une limite de temps d'un mois avec un code dur, mais ce n'est qu'un exemple.

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

}
31
répondu MetaColon 2018-05-04 14:35:00

j'ai écrit un code similaire, mais la fonctionnalité d'exportation:

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");
7
répondu Eliot 2011-12-03 15:23:05

LinqPad ciselée qui fonctionne pour moi:

//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();
2
répondu Roy Ashbrook 2013-10-03 02:09:10

Si vous avez besoin d'souhaitez accéder au dossier partagé de votre ami, alors vous pouvez définir votre ami en tant que destinataire. Exigence: son calendrier doit d'abord être partagé.

// Set recepient
Outlook.Recipient oRecip = (Outlook.Recipient)oNS.CreateRecipient("abc@yourmail.com");

// Get calendar folder 
Outlook.MAPIFolder oCalendar = oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar);
1
répondu sdyutjan 2011-08-18 11:01:57

il n'est pas nécessaire d'étendre les articles récurrents manuellement. Assurez-vous de trier les éléments avant en utilisant des fréquences includes.

Voici L'exemple de 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
1
répondu Vladimir Sitnikov 2013-06-29 19:29:50
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;

        }
1
répondu RameezAli 2014-02-10 05:50:59

essaye ceci:

    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;

    }

}
0
répondu Dobry 2015-02-03 09:16:03
calendarFolder = 
    mapiNamespace.GetDefaultFolder(
        Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);
-3
répondu uygar 2011-12-07 13:17:54