LDAP Abfrage in Word schreiben DC Windows 2008 in AD

  • Moin...

    im Rahmen meines kleinen Tools "Telefonbuch" mit Unterstützung von "water", vielen Dank nochmals,

    möchte ich eine gefilterte Abfrage in ein Word Dokument schreinben.

    Erster Filter alle aktiven Mitarbeiter von A-Z in eine Liste mit Büro Telefon und Handy Nummer.

    Zweiter Filter alle aktiven Mitarbeiter pro Abteilung auch hier wieder Büro Telefon und danach die Handy Nummer.

    Idel wäre sicher eine sortierte Auflistung sprich zwischen A und B eine Zeile frei und pro Abteilung ebenso.

  • Ich habe unser Telefonbuch nach Excel exportiert. Die Spalten lassen sich leichter formatieren und mehr Hilfe bei Fragen kriegt man zu Excel auch als zu Word.
    Auf Seite 1 habe ich sogar das Formenlogo positioniert etc.

  • Der LDAP Query liefert Dir eine zwei-dimensionale Tabelle. Die musst Du nach 2 Kriterien sortieren und dann in die Excel-Datei schreiben.
    Es gibt irgendwo eine UDF um eine 2D-Tabelle nach mehreren Kriterien zu sortieren. Ich suche mal ... hier.

  • moin water...

    siehts du eine chance mir den 2d export zu erstellen?

    Ich möchte diese Funktion ins "Telefonbuch" einbauen, da immer noch welche ein Papier in der Hand haben möchten....

  • Mal sehen.
    Hast Du das Skript schon um die Auswahl nach Abteilung erweitert? Falls ja, poste den aktuellen Code oder schick mir ne PM, dann baue ich auf diesem Code auf.

  • ich habe die Funktionsbuttons erweiter und "bräuchte" jetzt nur noch die Export Funtionen.
    Die Icons laufen, letzt würde ich evtl ein Button erstellen oder Hinter dem "Info" Buttton die Export Tastatur kombi eintragen.
    Zur Zeit ist es so drückt man auf Info soll das Programm erklärt werden, dort würde ich eine Key-Kombi hinteerlegen einmal nach Abteilung und nach A-Z.

    Gruß

  • Ich hätte noch ein paar andere Verbesserungen. Wenn ich das in Deinen Code einbaue, dann brauche ich meine Änderungen nicht zu markieren bzw. Du sie nicht wieder mühsam in Deinen Code einbauen.

  • Hier nun die aktuellste Version. Ausdruck nach Name oder Abteilung (darum 2 Druck Buttons).
    Die ListView kann durch klicken auf die Spaltenüberschriften sortiert werden.

    Spoiler anzeigen
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Run_Debug_Mode=N
    #include-once
    #include <AD.au3>
    #include <ButtonConstants.au3>
    #include <Excel.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sName = "", $sTitle = "Telefonnummernabfrage BST"
    Global $sVersion = "0.7 beta", $sAutor = "water", $sVDatum = "2012/04/06"
    Global $sLDAPName, $sLDAPAbteilung, $asResult, $nMsg, $sAbteilung, $sSelected
    Global $oExcel, $iMaxRow, $iFirstRow, $sFirstLetter
    Global Const $xlDown = -4121
    Global $sLogoFile = "", $sSaveFile = "C:\temp\Telefonbuch"

    [/autoit] [autoit][/autoit] [autoit]

    #region ### START Koda GUI section ### Form=
    Global $hForm = GUICreate($sTitle, 615, 440, 192, 124)
    GUICtrlCreateLabel("Name:", 10, 24, 35, 17)
    Global $hInputName = GUICtrlCreateInput("", 64, 22, 225, 21)
    GUICtrlCreateLabel("Abteilung:", 10, 59, 51, 17)
    Global $hInputAbteilung = GUICtrlCreateInput("", 64, 57, 225, 21)
    Global $hBtn_OK = GUICtrlCreateButton("OK", 304, 22, 41, 21)
    GUICtrlSetTip(-1, "Abfrage starten")
    Global $hBtn_Help = GUICtrlCreateButton("?", 358, 22, 41, 21)
    GUICtrlSetTip(-1, "Hilfe")
    Global $hBtn_info = GUICtrlCreateButton("Info", 412, 22, 41, 21)
    GUICtrlSetTip(-1, "Programminfo")
    Global $hBtn_TF = GUICtrlCreateButton("TF", 466, 22, 41, 21)
    GUICtrlSetTip(-1, "??")
    Global $hBtn_Exit = GUICtrlCreateButton("Exit", 536, 22, 65, 21)
    GUICtrlSetTip(-1, "Programm beenden")
    Global $hBtn_Copy = GUICtrlCreateButton("Copy", 358, 57, 41, 21)
    GUICtrlSetTip(-1, "Datensatz in Zwischenablage")
    Global $hBtn_DruckN = GUICtrlCreateButton("Druck", 412, 57, 41, 21)
    GUICtrlSetTip(-1, "Ergebnis drucken - Nach Name sortiert")
    Global $hBtn_DruckA = GUICtrlCreateButton("Druck", 466, 57, 41, 21)
    GUICtrlSetTip(-1, "Ergebnis drucken - Nach Abteilung sortiert")
    Global $hList = GUICtrlCreateListView("Name|Abteilung|Telefon Büro|Handy", 8, 96, 601, 336)
    ; Set accelerators for Enter
    Global $AccelKeys[2][2] = [["{ENTER}", $hBtn_OK],["^c", $hBtn_Copy]]
    GUISetAccelerators($AccelKeys)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_RegisterSortCallBack($hList)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $hBtn_Exit
    ExitLoop
    Case $hBtn_OK, 3
    $sName = StringStripWS(GUICtrlRead($hInputName), 3)
    $sAbteilung = StringStripWS(GUICtrlRead($hInputAbteilung), 3)
    If $sName <> "" Or $sAbteilung <> "" Then _Process()
    Case $hBtn_Help
    MsgBox(64, "About", $sTitle & @CRLF & @CRLF & "Programm written by ... " & _
    @CRLF & @CRLF & "Version: " & $sVersion & @CRLF & "Autor: " & $sAutor & @CRLF & "Date: " & $sVDatum)
    Case $hBtn_TF
    ShellExecute("tf.pdf")
    Case $hBtn_info
    ShellExecute("info.pdf")
    Case $hBtn_Copy
    _Copy()
    Case $hBtn_DruckN
    _Druck($asResult, "N")
    Case $hBtn_DruckA
    _Druck($asResult, "A")
    Case $hList
    _GUICtrlListView_SortItems($hList, GUICtrlGetState($hList))
    EndSwitch
    WEnd
    _GUICtrlListView_UnRegisterSortCallBack($hList)

    [/autoit] [autoit][/autoit] [autoit]

    Func _Process()

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_BeginUpdate($hList)
    _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($hList)) ; Clear the ListView
    _AD_Open()
    If @error Then Exit MsgBox(16, $sTitle, "Error: " & @error & " bei Erstellung der Verbindung zum Active Directory!")
    $sLDAPName = ""
    $sLDAPAbteilung = ""
    If $sName <> "" Then
    $sLDAPName = "(name=" & $sName
    If $sName <> "*" Then $sLDAPName &= "*"
    $sLDAPName &= ")"
    EndIf
    If $sAbteilung <> "" Then $sLDAPAbteilung = "(department=" & $sAbteilung & "*)"
    $asResult = _AD_GetobjectsInOU("", "(&(objectcategory=person)(objectclass=user)" & $sLDAPName & $sLDAPAbteilung & "(telephoneNumber=*)(!userAccountControl:1.2.840.113556.1.4.803:=" & $ADS_UF_ACCOUNTDISABLE & "))", 2, "name,department,telephoneNumber,mobile", "name")
    Select
    Case @error = 0
    For $i = 1 To $asResult[0][0]
    GUICtrlCreateListViewItem($asResult[$i][0] & "|" & $asResult[$i][1] & "|" & $asResult[$i][2] & "|" & $asResult[$i][3], $hList)
    Next
    Case @error = 3
    MsgBox(16, $sTitle, "Name '" & $sName & "' wurde nicht gefunden!")
    Case Else
    MsgBox(16, $sTitle, "Error: " & @error & " bei Abfrage nach Name '" & $sName & "'!")
    EndSelect
    _GUICtrlListView_SetColumnWidth($hList, 0, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($hList, 1, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($hList, 2, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($hList, 3, $LVSCW_AUTOSIZE)
    _GUICtrlListView_EndUpdate($hList)
    _AD_Close()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Process

    [/autoit] [autoit][/autoit] [autoit]

    Func _Copy()

    [/autoit] [autoit][/autoit] [autoit]

    Local $IDItem = GUICtrlRead($hList)
    If $IDItem = 0 Then Return
    $sSelected = GUICtrlRead($IDItem)
    $sSelected = StringLeft($sSelected, StringLen($sSelected) - 1) ; letztes | entfernen
    $sSelected = StringReplace($sSelected, "|", @TAB) ; | in @Tab umwandeln
    ClipPut($sSelected) ; In Zwischenablage schreiben

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Copy

    [/autoit] [autoit][/autoit] [autoit]

    Func _Druck($avArray, $sType)

    [/autoit] [autoit][/autoit] [autoit]

    ProgressOn($sTitle, "Telefonbuch drucken", "", -1, -1, 16)
    ProgressSet(10, "", "Excel Arbeitsblatt verarbeiten")
    ; Open Excel Worksheet
    $oExcel = _ExcelBookNew(0)
    $oExcel.ScreenUpdating = False
    ; Ziffern als Text formatieren
    $oExcel.Activesheet.Columns("C:D").NumberFormat = "@"
    ; Daten nach Excel kopieren
    ProgressSet(25, "", "Excel Arbeitsblatt Daten importieren")
    ; _ExcelWriteSheetFromArray($oExcel, $avArray, 2, 1, 1, 0)
    Local $avArrayTransposed = $oExcel.transpose($avArray)
    ; Copy data to Excel. Taken from http://www.avdf.com/apr98/art_ot003.html
    $oExcel.Range("A1:A1").Resize(UBound($avArray, 1), UBound($avArray, 2)) = $avArrayTransposed
    _ExcelWriteCell($oExcel, "Name", "A1")
    _ExcelWriteCell($oExcel, "Abteilung", "B1")
    _ExcelWriteCell($oExcel, "Telefon Büro", "C1")
    _ExcelWriteCell($oExcel, "Handy", "D1")
    ProgressSet(50, "", "Excel Arbeitsblatt Daten gruppieren")
    ; Jeweils Anfangsbuchstaben oder Abteilung markieren
    $iMaxRow = $oExcel.ActiveSheet.UsedRange.Rows.Count
    $iFirstRow = 2
    If $sType = "N" Then ; Nach Name gruppieren
    _ExcelSortExtended($oExcel, "A1", 1, 1, $iMaxRow, 4, 1, 1, False, 1) ; Nach Name sortieren
    For $i = $iMaxRow To $iFirstRow Step -1
    $sFirstLetter = StringLeft($oExcel.ActiveSheet.Range("A" & $i).Value, 1)
    If $i = $iFirstRow Or $sFirstLetter <> StringLeft($oExcel.ActiveSheet.Range("A" & $i - 1).Value, 1) Then
    $oExcel.ActiveSheet.Range("A" & $i).EntireRow.Insert($xlDown)
    $oExcel.ActiveSheet.Range("A" & $i).Value = $sFirstLetter
    $oExcel.Activesheet.Range("A" & $i).Interior.ColorIndex = 15 ; Grau hinterlegen
    $oExcel.Activesheet.Range("A" & $i).Font.Bold = True
    EndIf
    Next
    Else
    _ExcelSortExtended($oExcel, "B1", 1, 1, $iMaxRow, 4, 1, 1, False, 1) ; Nach Abteilung sortieren
    For $i = $iMaxRow To $iFirstRow Step -1
    $sFirstLetter = $oExcel.ActiveSheet.Range("B" & $i).Value
    If $i = $iFirstRow Or $sFirstLetter <> $oExcel.ActiveSheet.Range("B" & $i - 1).Value Then
    $oExcel.ActiveSheet.Range("B" & $i).EntireRow.Insert($xlDown)
    $oExcel.ActiveSheet.Range("B" & $i).Value = $sFirstLetter
    $oExcel.Activesheet.Range("B" & $i).Interior.ColorIndex = 15 ; Grau hinterlegen
    $oExcel.Activesheet.Range("B" & $i).Font.Bold = True
    EndIf
    Next
    EndIf
    ProgressSet(75, "", "Excel Arbeitsblatt Daten formatieren")
    ; Erste Zeile fett drucken
    _ExcelFontSetProperties($oExcel, "A1:D1", 1, 1, 1, True)
    ; Erste Zeile grau hinterlegen
    $oExcel.Activesheet.Range("A1:D1").Interior.ColorIndex = 15
    ; Schriftgröße auf 10 setzen
    $oExcel.Range("A:Z").Font.Size = 10
    ; Erste Spalte fett drucken
    _ExcelFontSetProperties($oExcel, "A:A", 1, 1, 1, True)
    ; Spaltenbreite festlegen
    $oExcel.Activesheet.Columns("A:D").AutoFit
    ; Alle Spalten links ausrichten
    $oExcel.Activesheet.Columns("A:D").HorizontalAlignment = 2
    $oExcel.ActiveSheet.Range("A1").Select
    With $oExcel.Activesheet.PageSetup
    ; Ränder setzen. Angabe in Punkt (1pt=0.035cm). http://msdn.microsoft.com/en-us/library/…gin(VS.80).aspx
    .TopMargin = 40
    .BottomMargin = 40
    .HeaderMargin = 18
    .FooterMargin = 18
    .LeftMargin = 45
    .RightMargin = 22
    ; Breite reduzieren so dass alle auf 1 Seite passt
    .FitToPagesWide = 1
    .FitToPagesTall = False
    .Zoom = False
    ; Gitternetzlinien
    .PrintGridlines = True
    ; Set the rows to print on every page
    .PrintTitleRows = "1:1"
    ; Seitentitel setzen
    .LeftHeader = "&"",Fett""&12Telefonbuch BST"
    .RightHeader = "Stand: " & @MDAY & "." & @MON & "." & @YEAR
    .RightFooter = "Seite &S von &A"
    .LeftFooter = "Gedruckt: &D &U"
    EndWith
    ; Titelblatt einfügen
    _ExcelSheetAddNew($oExcel, "Titelseite")
    $oExcel.Activesheet.Columns("A").ColumnWidth = 77.25
    With $oExcel.Activesheet.PageSetup
    ; Ränder setzen. Angabe in Punkt (1pt=0.035cm). http://msdn.microsoft.com/en-us/library/…gin(VS.80).aspx
    .TopMargin = 72
    .BottomMargin = 72
    .HeaderMargin = 38
    .FooterMargin = 38
    .LeftMargin = 58
    .RightMargin = 58
    ; Breite reduzieren so dass alle auf 1 Seite passt
    .FitToPagesWide = 1
    .FitToPagesTall = False
    .Zoom = False
    EndWith
    ; Alle Spalten zentrieren
    $oExcel.Activesheet.Columns("A:A").HorizontalAlignment = 3
    ; Höhe der Zeilen festlegen
    $oExcel.Activesheet.Rows("1:1").RowHeight = 182
    $oExcel.Activesheet.Rows("2:2").RowHeight = 27
    $oExcel.Activesheet.Rows("3:3").RowHeight = 45
    $oExcel.Activesheet.Rows("4:4").RowHeight = 58
    $oExcel.Activesheet.Rows("5:5").RowHeight = 84
    #cs
    ; Bild einfügen
    $oExcel.Range("A1").Select
    $oExcel.ActiveSheet.Pictures.Insert($sLogoFile).Select
    $oExcel.Selection.ShapeRange.Height = 44.57
    $oExcel.Selection.ShapeRange.Width = 391.71
    $oExcel.Selection.ShapeRange.Left = 40
    $oExcel.Selection.ShapeRange.Top = 25
    #ce
    ; Texte eingeben
    $oExcel.ActiveSheet.Range("A2").Font.Size = 20
    _ExcelWriteCell($oExcel, "Telefonbuch", "A2")
    _ExcelFontSetProperties($oExcel, "A2", 1, 1, 1, True)
    _ExcelWriteCell($oExcel, "von", "A3")
    _ExcelWriteCell($oExcel, "BST", "A4")
    _ExcelWriteCell($oExcel, "Stand: " & @MDAY & "." & @MON & "." & @YEAR, "A6")
    ; Arbeitsblatt speichern
    ; _ExcelBookSaveAs($oExcel, "C:\temp\telefonbuch", "xls", 0, 1)
    ; Datei als PDF speichern
    $oExcel.ActiveWorkbook.ExportAsFixedFormat(0, $sSaveFile & ".pdf")
    _ExcelBookClose($oExcel, 0, 0)
    ProgressSet(100, "", "FERTIG")
    ProgressOff()
    MsgBox(64, $sTitle, "Gesichert als " & @CRLF & $sSaveFile & ".pdf", 3)
    ShellExecute($sSaveFile & ".pdf")

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_Druck

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Description: Performs an advanced sort on a range.
    ; Syntax: _ExcelSortExtended($oExcel, $sKey, $sRangeOrRowStart, $iColStart = 1, $iRowEnd = 1, $iColEnd = 1, _
    ; $iDirection = 2, $iHeader = 0, $fMatchCase = False, $iOrientation = 2, $iDataOption = 0)
    ; Parameter(s): $oExcel - An Excel object opened by a preceding call to _ExcelBookOpen() or _ExcelBookNew()
    ; $sKey - The key column or row to sort by (in A1 format)
    ; $sRangeOrRowStart - Either an A1 range, or an integer row number to start from if using R1C1
    ; $iColStart - The starting column for the number format(left) (default=1)
    ; $iRowEnd - The ending row for the number format (bottom) (default=1)
    ; $iColEnd - The ending column for the number format (right) (default=1)
    ; $iDirection - Sort direction (1=Ascending, 2=Descending) (default=descending)
    ; $iHeader - Assume sort data has a header? (1=yes, 2=No, 0=guess) (default=guess)
    ; $fMatchCase - Match case when performing sort (True|False)
    ; $iOrientation - Specify how sort data is arranged (1=sort columns, 2=sort rows) (default=sort rows)
    ; $iDataOption - Specify how sort will treat data (0=sort normal, 1=sort text as numbers) (default = sort normal)
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0 and sets @error on errors:
    ; @error=1 - Specified object does not exist
    ; @error=2 - Starting row or column invalid
    ; @extended=0 - Starting row invalid
    ; @extended=1 - Starting column invalid
    ; @error=3 - Ending row or column invalid
    ; @extended=0 - Ending row invalid
    ; @extended=1 - Ending column invalid
    ; Author(s): SEO <locodarwin at yahoo dot com>, many thanks to DaLiMan
    ; Note(s): This sort routine will not function properly with pivot tables. Please
    ; use the pivot table sorting functions instead.
    ; Link: http://www.autoitscript.com/forum/topic/96…elsortextended/
    ;===============================================================================
    Func _ExcelSortExtended($oExcel, $sKey, $sRangeOrRowStart, $iColStart = 1, $iRowEnd = 1, $iColEnd = 1, $iDirection = 2, $iHeader = 0, $fMatchCase = False, $iOrientation = 2, $iDataOption = 0)
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If Not StringRegExp($sRangeOrRowStart, "[A-Z,a-z]", 0) Then
    If $sRangeOrRowStart < 1 Then Return SetError(2, 0, 0)
    If $iColStart < 1 Then Return SetError(2, 1, 0)
    If $iRowEnd < $sRangeOrRowStart Then Return SetError(3, 0, 0)
    If $iColEnd < $iColStart Then Return SetError(3, 1, 0)
    $oExcel.Range($oExcel.Cells($sRangeOrRowStart, $iColStart), $oExcel.Cells($iRowEnd, $iColEnd)).Sort _
    ($oExcel.Range($sKey), $iDirection, $oExcel.Range($sKey), Default, $iDirection, $oExcel.Range($sKey), _
    $iDirection, $iHeader, True, $fMatchCase, $iOrientation, Default, $iDataOption)
    Else
    $oExcel.Range($sRangeOrRowStart).Sort($oExcel.Range($sKey), $iDirection, $oExcel.Range($sKey), Default, _
    $iDirection, $oExcel.Range($sKey), $iDirection, $iHeader, True, $fMatchCase, $iOrientation, Default, $iDataOption)
    EndIf
    Return 1
    EndFunc ;==>_ExcelSortExtended

    [/autoit]