it-swarm-eu.dev

.NET: Získejte všechny položky kalendáře aplikace Outlook

Jak mohu získat všechny položky z určitého kalendáře (pro konkrétní datum). Řekněme například, že mám kalendář s opakovanou položkou každý pondělí večer. Když požádám o všechny podobné položky:

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

Mám jen 1 položku ...

Existuje snadný způsob, jak dostat všechny položky (hlavní položky + odvozené položky) z kalendáře? V mé konkrétní situaci může být možné nastavit limit data, ale bylo by to super, kdybyste se dostali všechny položky (mé opakované položky jsou časově omezené).

Používám knihovnu objektů Microsoft Outlook 12 (Microsoft.Office.Interop.Outlook) .

27
Qinnie

Domnívám se, že je nutné omezit nebo najít, aby bylo možné získat opakované události, jinak je aplikace Outlook nerozbalí. Také musíte seřadit podle Start před setting IncludeRecurrences.

13
Mark Brackett

Studoval jsem dokumenty a to je můj výsledek: Časový limit jednoho měsíce jsem pevně zakódoval, ale to je jen příklad.

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

}
32
Qinnie

Napsal jsem podobný kód, ale pak jsem našel funkci exportu:

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
Eliot

LinqPad vystřihnul, že to funguje pro 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();
3
Roy Ashbrook

Pokud chcete mít přístup ke sdílené složce od svého přítele, můžete nastavit svého přítele jako příjemce. Požadavek: jeho kalendář musí být sdílen jako první. 

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

// Get calendar folder 
Outlook.MAPIFolder oCalendar = oNS.GetSharedDefaultFolder(oRecip, Outlook.OlDefaultFolders.olFolderCalendar);
1
sdyutjan
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
RameezAli

Není třeba rozšiřovat opakované položky ručně. Jednoduše zajistíte, že položky před použijete IncludeRecurrences.

Zde je příklad 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

Zkuste to:

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

}

to funguje, zkusím to, ale musíte přidat odkaz o Microsoft Outlook

0
TC Anıl Aydınalp