.NETO: Obtener todos los elementos de calendario de Outlook

¿Cómo puedo obtener todos los elementos de un calendario específico (para una fecha específica).
Digamos por ejemplo que tengo un calendario con un elemento periódico cada lunes en la noche. Cuando puedo solicitar todos los artículos como este:

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

Solo me dan 1 punto…

Hay una manera fácil de obtener todos elementos (elemento principal + derivada de elementos) de un calendario?
En mi situación específica puede ser posible establecer una fecha límite, pero sería genial sólo para obtener todos los elementos (mi recurrentes están limitados en el tiempo en sí).

Estoy usando el Microsoft Outlook 12 biblioteca de Objetos (de Microsoft.De la oficina.De interoperabilidad.Outlook).

InformationsquelleAutor | 2008-09-18

11 Kommentare

  1. 14

    Creo que debe Restringir o Encontrar en el fin de conseguir citas periódicas, de manera que Outlook no se expanda. También, se debe Ordenar por Iniciar antes de configuración IncludeRecurrences.

    • Por favor, ser conscientes de que nos encontramos importantes penalizaciones de rendimiento (hasta 30 segundos en lugar de algunos ms) en algunos sistemas/conjuntos de datos a la hora de ordenar los elementos.
  2. 33

    He estudiado los documentos y este es mi resultado:
    He puesto un límite de tiempo de un mes rígida, pero esto es sólo un ejemplo.

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

    Escribí un código similar, pero luego encontró la funcionalidad de exportación de:

    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");
  4. 3

    LinqPad cortada que me funciona:

    //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();
    • también quiero señalar que invertir el orden de la clase y includerecurrences no parece importar cuando yo estaba probando. YMMV pero he usado este recientemente y regresó duplicados para los días dado. Mi pregunta final fue de 6 meses de datos, aunque, no por un par de días.
  5. 2

    Si usted necesita si desea acceder a la carpeta compartida de su amigo, entonces usted puede configurar su amigo como el destinatario. Requisito: su calendario debe ser compartida primero.

    //Set recepient
    Outlook.Recipient oRecip = (Outlook.Recipient)oNS.CreateRecipient("[email protected]");
    
    //Get calendar folder 
    Outlook.MAPIFolder oCalendar = oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar);
    • esto no parece tener nada que ver con la pregunta.
  6. 1

    No hay ninguna necesidad de ampliar recurrentes manualmente. Sólo asegúrese de ordenar los elementos antes de utilizando IncludeRecurrences.

    Aquí es VBA ejemplo:

    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
  7. 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;
    
            }
  8. 0

    Intente esto:

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

    se está trabajando yo intente pero hay que añadir la referencia sobre
    Microsoft outlook

  10. 0

    He encontrado este articel muy útil: https://docs.microsoft.com/en-us/office/client-developer/outlook/pia/how-to-search-and-obtain-appointments-in-a-time-range

    Se muestra cómo obtener las entradas del calendario en un intervalo de tiempo especificado. A mí me funcionó. Aquí está el código fuente de la articel para su comodidad 🙂

    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; }
     }
  11. -3
    calendarFolder = 
        mapiNamespace.GetDefaultFolder(
            Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);
    • solo proporciona una referencia a la carpeta calendario. no contesta la pregunta.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein