it-swarm-tr.com

.NET: Tüm Outlook takvim öğelerini al

Belirli bir takvimdeki tüm öğeleri (belirli bir tarih için) nasıl alabilirim. Örneğin, her pazartesi akşamı tekrarlayan bir öğeyle bir takvimin olduğunu söyleyelim. Bunun gibi tüm eşyaları istediğimde:

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

Sadece 1 ürün alıyorum ...

Bir takvimden all öğeleri (ana öğe + türetilmiş öğeler) almanın kolay bir yolu var mı? (yinelenen ürünlerim zamanla sınırlıdır).

Microsoft Outlook 12 Nesne kütüphanesini kullanıyorum (Microsoft.Office.Interop.Outlook).

27
Qinnie

Tekrarlayan randevular almak için Sınırla veya Bul seçeneğine sahip olmanız gerektiğine inanıyorum, aksi takdirde Outlook bunları genişletmiyor. Ayrıca, IncludeRecurrences ayarını Başlat -yapmadan önce yapmanız gerekir.

13
Mark Brackett

Dokümanlar üzerinde çalıştım ve bu benim sonucum: Sabit kodlanmış bir ay süre koydum, ama bu sadece bir örnek.

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

Benzer bir kod yazdım ancak dışa aktarma işlevselliğini buldum:

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 benim için işe yaradı:

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

Paylaşılan klasöre arkadaşınızdan erişmek isterseniz, arkadaşınızı alıcı olarak ayarlayabilirsiniz. Gereksinim: önce onun takvimi paylaşılmalıdır. 

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

Yinelenen öğeleri manuel olarak genişletmeye gerek yoktur. Sadece IncludeRecurrences kullanarak önce kullanarak öğeleri sıraladığınızdan emin olun.

İşte VBA örneği:

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

Bunu dene:

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

}

çalışıyor, deniyorum ama hakkında referans eklemelisin Microsoft Outlook

0

Bu makaleyi çok yararlı buldum: https://docs.Microsoft.com/en-us/office/client-developer/Outlook/pia/how-to-search-and-obtain-appointments-in-a -zaman-aralık

Takvim girdilerinin belirli bir zaman aralığında nasıl alınacağını gösterir. Benim için çalıştı. İşte size kolaylık sağlamak için belden kaynak kodu :)

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