none
Outlook Kalender exportieren

    Frage

  • Hallo Freunde,
    ich möchte aus einer VB.net Anwendung heraus Kalenderdaten im .CSV-Format exportieren:

     ----

            Dim objOutlook As Microsoft.Office.Interop.Outlook._Application
            objOutlook = New Microsoft.Office.Interop.Outlook.Application
            Dim ol2tt As Microsoft.Office.Interop.Outlook.MAPIFolder
            ol2tt = objOutlook.ActiveExplorer.CurrentFolder.Selection.Item(1)
            ol2tt.SaveAs("C:\Kalender.csv")
    Soweit habe ich Code dazu entwickelt-funktioniert aber nicht :-(
    Leider finde ich dazu keine Beschreibung - die integrierten Tools in VB Express 2008 geben nichts dazu her :-(

    Hat jemand vielleicht schon eine Routine dazu geschrieben oder weiss wo ich Infos dazu bekommen kann ?

    Doei
    Donnerstag, 27. August 2009 19:33

Antworten

  • Hi Franz,
    unklar ist, ob Outlook gestartet ist und was mit Terminen passieren soll, die über mehrere Tage gehen.

    Hier mal eine Lösung für den Fall, das Outlook gestartet ist und es werden die Endtermine unabhängig vom Datum ausgegeben:

    Option Explicit On
    Option Infer On
    Option Strict On

    Imports Microsoft.Office.Interop ' Verweis auf microsoft.office.interop.outlook setzen

    Module Module1

      Sub Main()
        Try
          Dim objOutlook = CType(GetObject(, "Outlook.Application"), Outlook.Application)
          Dim folder = objOutlook.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
          Dim l As New List(Of Outlook.AppointmentItem)
          For i = 1 To folder.Items.Count
            l.Add(CType(folder.Items(i), Outlook.AppointmentItem))
          Next
          Dim res = (From itm In l Where itm.Start >= Now And itm.Start <= Now.AddDays(56) _
              Select String.Format("{0:dd.MM.yy};{0:HH:mm};{1:HH:mm};{2};{3}", _
                                   itm.Start, itm.End, itm.Location, itm.Subject)).ToArray
          Using writer As New IO.StreamWriter("c:\temp\x.csv")
            writer.WriteLine(Join(res, vbNewLine))
          End Using
        Catch ex As Exception
          Console.WriteLine(ex.ToString)
        End Try
        '
        Console.ReadLine()
      End Sub

    End Module

     

    Samstag, 29. August 2009 19:42
  • Hi Franz,
    um die Daten sortiert zu bearbeiten, brauchst du nur ein OrderBy hinzufügen:

          Dim res = (From itm In l Where itm.Start >= Now And itm.Start <= Now.AddDays(56) _
              OrderBy itm,Start _
              Select String.Format("{0:dd.MM.yy};{0:HH:mm};{1:HH:mm};{2};{3}", _
                                   itm.Start, itm.End, itm.Location, itm.Subject)).ToArray

    --
    Peter
    Sonntag, 30. August 2009 10:38
  • Serientermine, die innnerhalb von 8 Wochen acht Mal auftreten? Was soll das?

    Wenn du Serientermine genauer bearbeiten willst, dann nutze das RecurrencePattern-Objekt. Da steht die Häufigkeit und der Abstand der Wiederholung drin.

    -- 
    Peter 

     


    Dienstag, 1. September 2009 05:21

Alle Antworten

  • Ausgehend von deinem Codeschnipsel vermute ich, dass du den in der aktuellen Kalenderansicht ersten selektierten Kalendereintrag ausgeben möchtest. Dazu kann die folgende VB9-Konsolendemo dienen:

    Option Explicit On
    Option Infer On
    Option Strict On

    Imports Microsoft.Office.Interop ' Verweis auf microsoft.office.interop.outlook setzen

    Module Module1

      Sub Main()
        Try
          Dim objOutlook = CType(GetObject(, "Outlook.Application"), Outlook.Application)
          Dim ol2tt = CType(objOutlook.ActiveExplorer.Selection.Item(1), Outlook.AppointmentItem)
          ol2tt.SaveAs("C:\temp\x.txt", Outlook.OlSaveAsType.olTXT)
        Catch ex As Exception
          Console.WriteLine(ex.ToString)
        End Try
        '
        Console.ReadLine()
      End Sub

    End Module

     


    --
    Peter

    Freitag, 28. August 2009 04:32
  • Hoi Peter,

    bin genau so verfahren wie von Dir beschrieben, also

    ein Modul erstellt mit Namen Module1, den Code hineinkopiert und das Module im Form.Load-Bereich aufgerufen mit Module1.Main().

    Es passiert aber absolut nüscht ;-)

    Wenn ich Imports Microsoft.Office.Interop als Imports Microsoft.Office.Interop.Outlook setze bekomme ich im Codebereich Fehler angezeigt.

    Wo ist der (mein) Fehler ?
    Denke ich mal wieder zu sehr um die Ecke oder zu geradeaus ?

    Doei
    Trixi

    P.S.: dies wird in die Console geschrieben (habe die Ausgabe in eine TextBox umgeleitet):

    System.InvalidCastException: Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "Microsoft.Office.Interop.Outlook.AppointmentItem" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID "{00063033-0000-0000-C000-000000000046}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)).
       bei MyTools.Module1.Main() in C:\Dokumente und Einstellungen\(meinName)\Eigene Dateien\Visual Studio 2008\Projects\MyTools\MyTools\Module1.vb:Zeile 13.
    Freitag, 28. August 2009 10:01
  • Mir ist bishe rimmer noch unklar, was du erreichen willst. Der Fehler kommt, wenn kein Termin ausgewählt ist.

    Beschreibe mal bitte deine Bedientechnologie und das Ziel, was du erreichen willst.

    --
    Peter
    Samstag, 29. August 2009 06:55
  • Hoi Peter,

    ich möchte ganz einfach ;-) aus meiner Anwendung heraus die Termine der nächsten 8 Wochen aus Outlook in eine .csv-Datei exportieren.
    Ohne Termine auszuwählen in Outlook - einfach nur alle Termine exportieren.

    Format der .csv -Datei soll sein:
    "Datum","Uhrzeit Anfang","Uhrzeit Ende","Ort des Termins (optional)","Texteintrag zu dem jeweiligen Termin"
    "Datum","Uhrzeit Anfang","Uhrzeit Ende","Ort des Termins (optional)","Texteintrag zu dem jeweiligen Termin"
    "Datum","Uhrzeit Anfang","Uhrzeit Ende","Ort des Termins (optional)","Texteintrag zu dem jeweiligen Termin"
    ...


    Doei
    Franz
    Samstag, 29. August 2009 16:58
  • Hi Franz,
    unklar ist, ob Outlook gestartet ist und was mit Terminen passieren soll, die über mehrere Tage gehen.

    Hier mal eine Lösung für den Fall, das Outlook gestartet ist und es werden die Endtermine unabhängig vom Datum ausgegeben:

    Option Explicit On
    Option Infer On
    Option Strict On

    Imports Microsoft.Office.Interop ' Verweis auf microsoft.office.interop.outlook setzen

    Module Module1

      Sub Main()
        Try
          Dim objOutlook = CType(GetObject(, "Outlook.Application"), Outlook.Application)
          Dim folder = objOutlook.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
          Dim l As New List(Of Outlook.AppointmentItem)
          For i = 1 To folder.Items.Count
            l.Add(CType(folder.Items(i), Outlook.AppointmentItem))
          Next
          Dim res = (From itm In l Where itm.Start >= Now And itm.Start <= Now.AddDays(56) _
              Select String.Format("{0:dd.MM.yy};{0:HH:mm};{1:HH:mm};{2};{3}", _
                                   itm.Start, itm.End, itm.Location, itm.Subject)).ToArray
          Using writer As New IO.StreamWriter("c:\temp\x.csv")
            writer.WriteLine(Join(res, vbNewLine))
          End Using
        Catch ex As Exception
          Console.WriteLine(ex.ToString)
        End Try
        '
        Console.ReadLine()
      End Sub

    End Module

     

    Samstag, 29. August 2009 19:42
  • Hoi Peter,

    Dank u wel !

    Das hat wunderbar und wunschgemäss geklappt :-)

    Termine über mehrere brauche nicht berücksichtigt zu werden, und Outlook ist aktiv.

    Werde das jetzt mal probieren ob es autom. startet bei Aufruf es Moduls, ansonsen kann ich das aber auch vorher über einen Call starten lassen.

    Doei
    Franz
    Samstag, 29. August 2009 19:53
  • Hoi Peter,

    wie kann ich die Ausgabe nach Datum sortieren ?
    Die untersten 3 Einträhe sind in Reihenfolge, aber dann sind sie "bunt" gemischt - kein Muster erkennbar: weder nach Uhrzeit, Anfangsbuchstaben des Ortes o.ä.

    Doei
    Franz
    Samstag, 29. August 2009 21:17
  • Hi Franz,
    um die Daten sortiert zu bearbeiten, brauchst du nur ein OrderBy hinzufügen:

          Dim res = (From itm In l Where itm.Start >= Now And itm.Start <= Now.AddDays(56) _
              OrderBy itm,Start _
              Select String.Format("{0:dd.MM.yy};{0:HH:mm};{1:HH:mm};{2};{3}", _
                                   itm.Start, itm.End, itm.Location, itm.Subject)).ToArray

    --
    Peter
    Sonntag, 30. August 2009 10:38
  • Hoi Peter,

    das hatte ich schon genau so probiert, aber es gibt dann 2 Fehler:
    1. Orderby wird blau unterstrichen und im Ausgabefenster steht ") erwartet"
    2. bei

    writer.WriteLine(Join(res, vbNewLine))

    wird res blau unterstrichen und im Ausgabefenster steht "Der Name res wurde nicht deklariert"

    Edit: Muss "Orderby" nicht "Order by" heissen ? Bringt aber einen ähnlichen Fehler

    Doei
    Franz

    Sonntag, 30. August 2009 10:47
  • Hoi Peter,

    Fehler schon gefunden:

    1. Orderby = Order By
    2. itm,Start = itm.Start

    :-)

    Doei
    Franz
    Sonntag, 30. August 2009 10:55
  • Hallo Franz

    Ich komme noch mit einem Beispiel wie man Outlook Kalender als .csv Datei exportieren kann aufgrund der Selektion eines Eintrags (oder mehrere) im Kalender. Ich habe gesehen du hast das Wort Selection benutzt.

    Outlook muss aktiv sein und mindestens ein Eintrag muss selektiert werden.

    Imports Microsoft.Office.Interop
    Imports System.IO
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim objOutlook = New Microsoft.Office.Interop.Outlook.Application
            Dim myItem As Microsoft.Office.Interop.Outlook.AppointmentItem
            Dim myOlExp As Microsoft.Office.Interop.Outlook.Explorer
            Dim myOlSel As Microsoft.Office.Interop.Outlook.Selection
    
            objOutlook.ActiveExplorer.Session.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderCalendar)
    
            myOlExp = objOutlook.ActiveExplorer
            myOlSel = myOlExp.Selection
    
            If myOlSel.Count = 0 Then
                MsgBox("Keine ausgewählten Kalenderelemente!")
            Else
                Dim sw As StreamWriter = New StreamWriter("C:\Temp\Kalender.csv", True)
                Dim str As String = String.Empty
    
                For x = 1 To myOlSel.Count
                    myItem = myOlSel.Item(x)
    
                    If (myItem.Subject IsNot Nothing) Then
                        str += myItem.Subject
                    Else
                        str += String.Empty
                    End If
                    If (myItem.Location IsNot Nothing) Then
                        str += "," & myItem.Location
                    Else
                        str += "," & String.Empty
                    End If
                    If (myItem.Duration <> 0) Then
                        str += "," & myItem.Duration.ToString
                    Else
                        str += "," & String.Empty
                    End If
                    If (myItem.Organizer IsNot Nothing) Then
                        str += "," & myItem.Organizer
                    Else
                        str += "," & String.Empty
                    End If
                    Dim curBusyStatusText As String
                    Select Case myItem.BusyStatus
                        Case 0 : curBusyStatusText = "Free"
                        Case 1 : curBusyStatusText = "Tentative"
                        Case 2 : curBusyStatusText = "Busy"
                        Case 3 : curBusyStatusText = "Out Of Office"
                        Case Else : curBusyStatusText = "Anzahl nicht in der Angebotspalette"
                    End Select
                    str += "," & "BusyStatus ist " & curBusyStatusText
    
                    sw.WriteLine(str)
                    str = String.Empty
    
                Next x
                sw.Close()
    
            End If
    
        End Sub
    End Class



    Grüße und Erfolg,

    Robert

    Sonntag, 30. August 2009 11:37
  • Hoi Robert,

    vielen Dank auch für Deine Mühe, aber die erste Lösung ist die für mich in diesem Fall sinnvollere.

    1. muss Outlook nicht gestartet sein
    und
    2. muss ich ich keine Termine vorher auswählen.

    Allerdings werden in der 1. Lösung keine Serientermine berücksichtigt.
    Wie könnte ich das noch realisieren ?

    Habe mit den verschiedenen Parameter "herumgespielt" und in der Hilfe nachgelsen, finde dazu aber keine Tag.

    Evlt. weiss @Peter da noch etwas zu zu sagen ?

    Doei
    Franz
    Sonntag, 30. August 2009 11:49
  • Hi Franz,
    Serientermine haben üblicherweise eine weit in der Vergangeheit liegenden Starttermin. Damit fallen sie aus der Zeitprüfung heraus. Das must du separat prüfen, z.B. so:

    Option Explicit On
    Option Infer On
    Option Strict On
    
    Imports Microsoft.Office.Interop ' Verweis auf microsoft.office.interop.outlook setzen
    
    Module Module1
    
      Sub Main()
        Try
          Dim objOutlook = CType(GetObject(, "Outlook.Application"), Outlook.Application)
          Dim folder = objOutlook.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
          Dim l As New List(Of Outlook.AppointmentItem)
          For i = 1 To folder.Items.Count
            l.Add(CType(folder.Items(i), Outlook.AppointmentItem))
          Next
          Dim res = (From itm In l Where (itm.Start >= Now And itm.Start <= Now.AddDays(56)) _
              Or (itm.IsRecurring And itm.Start.AddYears(Now.Year - itm.Start.Year) >= Now _
              And itm.Start.AddYears(Now.Year - itm.Start.Year) <= Now.AddDays(56)) _
              Order By itm.Start _
              Select String.Format("{0:dd.MM.yy};{0:HH:mm};{1:HH:mm};{2};{3}", _
                                   itm.Start, itm.End, itm.Location, itm.Subject)).ToArray
          Using writer As New IO.StreamWriter("c:\temp\x.csv")
            writer.WriteLine(Join(res, vbNewLine))
          End Using
        Catch ex As Exception
          Console.WriteLine(ex.ToString)
        End Try
        '
        Console.ReadLine()
      End Sub
    
    End Module
    --
    Peter
    Sonntag, 30. August 2009 17:22
  • Hoi Peter,

    die vorgeschlagene Lösung führt leider nicht zum gewünschten Ergebnis.
    Zwar wird jetzt der Serientermin Geburtstag (eingetraen 2004 bzw. 2005) mit dem entsprechendem Datum und den genannten Jahren aufgezeigt aber kein anderer Serientermin (ich habe testweise meinen Sport = Montags von 17:30 - 19:00 als Serientermin eingetragen) wird angezeigt.

    Das mit den Geburtstagen wäre nich so tragisch, aber der Sporttermin wird gar nicht angezeigt.

    Hatte den mal testweise von PRIVAT auf WICHTIG und auf GESCHÄFTLICH gesetzt weil ich dachte dass es villeicht damit zusammenhängen könnte aber das Ergebnis ändert sich nicht.

    Doei
    Franz

    Edit:

    01.12.04    00:00 - 00:00 Geburtstag von Manni
    22.12.05    00:00 - 00:00 Mama Geburtstag
    05.09.09    21:30 - 23:30 Montgolfiade Warstein NightGlow und Feuerwerk
    03.10.09    00:00 - 00:00 Tag der Deutschen Einheit
    31.10.09    00:00 - 00:00 Reformationstag
    01.11.09    00:00 - 00:00 Allerheiligen

    P.S.: ich hatte den Zeitraum mal auf 360 Tage geändert
    Montag, 31. August 2009 19:33
  • Serientermine, die innnerhalb von 8 Wochen acht Mal auftreten? Was soll das?

    Wenn du Serientermine genauer bearbeiten willst, dann nutze das RecurrencePattern-Objekt. Da steht die Häufigkeit und der Abstand der Wiederholung drin.

    -- 
    Peter 

     


    Dienstag, 1. September 2009 05:21
  • Was das soll ist natürlich eine berechtigte Frage die ich Dir beantworten kann:
    ich bin als IT-Dozent an verschiedenen Orten in verschiedenen Häufigkeiten tätig.

    Bei einem einzigen Serientermin macht das natürlich keinen Sinn, das ist mir klar.

    Aber wenn ich 14 Serientermine in 8 Wochen habe die auch noch auf vormittags und nachmittags aufgeteilt sind macht das natürlich grossen Sinn.

    Werde mich also mal die dem RecurrencePattern-Objekt beschäftigen.

    Der genannte Sport-Termin war wie gesagt nur mal ein Beispiel zum probieren.

    Doei
    Franz
    Dienstag, 1. September 2009 21:38