office c# .net outlook calendar recurring

c# - office - .NET: obtenga todos los elementos del calendario de Outlook



outlook calendar api (9)

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

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

Solo consigo 1 artículo ...

¿Hay alguna manera fácil de obtener todos los artículos (artículo principal + artículos derivados) de un calendario? En mi situación específica, es posible establecer un límite de fecha, pero sería genial obtener todos los artículos (mis artículos recurrentes tienen un límite de tiempo).

Estoy usando la biblioteca de objetos de Microsoft Outlook 12 (Microsoft.Office.Interop.Outlook) .


Creo que debe Restringir o Buscar para obtener citas periódicas, de lo contrario, Outlook no las expandirá. Además, debe Ordenar por Inicio antes de establecer IncluirRecurrencias.


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

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


Estudié los documentos y este es mi resultado: he puesto un límite de tiempo de un mes codificado, pero esto es solo 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()); } } }

¡Gracias por las dos respuestas anteriores!


LinqPad cortado que funciona para mí:

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


No es necesario expandir los elementos recurrentes manualmente. Solo asegúrese de ordenar los artículos antes de usar IncluirRecurrencias.

Aquí está el ejemplo 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


Prueba 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; } }


Si necesita acceder a la carpeta compartida de su amigo, puede configurar su amigo como destinatario. Requisito: su calendario debe ser compartido primero.

// Set recepient Outlook.Recipient oRecip = (Outlook.Recipient)oNS.CreateRecipient("[email protected]"); // Get calendar folder Outlook.MAPIFolder oCalendar = oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar);


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


calendarFolder = mapiNamespace.GetDefaultFolder( Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar);