Exceldiagram in Autoit einfügen.

  • Hallo AutoIt.de

    Ich wurde von meinem chef beauftragt eine selbstaktualisierende Beamer show machen soll

    nun habe ich das problem das in dieser Beamershow sich eine exceltabelle einfinden soll die sich selber alle 5 min aktualiesiert
    nun dachte ich mir das es am einfachsten wäre wenn die Diagramme sich als jpg bild exportieren würden.

    Also habe ich mich auf die suche gemacht nach einer möglichkeitdafür.
    Ich habe zwar ein script für excel gefunden nur blicke ich da nicht wirklich durch.

    Ich weis das es möglich ist Daten aus excel mit Autoit zu exportieren nur meine frage ist jetzt ob das auch mit tabellen geht und wenn ja wie.

    MFG Raumen837

    Einmal editiert, zuletzt von Raumen837 (15. Oktober 2012 um 12:22)

    • Offizieller Beitrag

    Hier mal ein Bsp.:

    Spoiler anzeigen
    [autoit]

    Const $xlColumns = 2
    Const $xl3DPieExploded = 70
    Const $xlDataLabelsShowValue = 2

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

    Local $oExcel = ObjCreate("Excel.Application") ; Excel-Objekt erstellen
    $oExcel.Visible = 1
    $oExcel.SheetsInNewWorkbook = 1 ; Anzahl der gewünschten Sheets beim Erstellen festlegen
    Local $oBook = $oExcel.Workbooks.Add ; im Excel-Objekt ein Workbook-Objekt erstellen
    Local $oSheet = $oBook.Sheets(1) ; Sheet-Objekt für Sheet 1 erstellen (Name oder Index)
    $oSheet.Name = 'Mein Sheet' ; Eigenschft Name ändern

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

    ; oder vorhandene Datei öffnen:
    ;~ Local $oBook = $oExcel.WorkBooks.Open($sFilePath, Default, False)
    ;~ Local $oSheet = $oBook.Worksheets.Item(1) ; Index od. Name des Sheets

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

    ; Daten in neuem Sheet eintragen

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

    ; Die Range-Offset-Adressierung ermöglicht einfaches Navigieren mit Schleifen

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

    ; Syntax: NewRange = Objekt.Range("StartZelle").Offset(ZeilenOffset, SpaltenOffset)
    ; Offset=0 ist die betreffende Zeile/Spalte selbst, die Adressierung ist relativ zur StartZelle
    ; negative Werte betreffen also Zeilen/Spalten oberhalb/vor der StartZelle

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

    ; Spaltenbeschriftung B1:H1
    For $i = 0 To 7
    If $i = 7 Then
    $oSheet.Range("B1").Offset(0, $i).Value = 'SUMME'
    Else
    $oSheet.Range("B1").Offset(0, $i).Value = 'HEADER ' & $i+1
    EndIf
    Next

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

    ; Zeilenbeschriftung A2:A10
    For $i = 0 To 8
    $oSheet.Range("A2").Offset($i, 0).Value = 'NAME ' & $i+1
    Next

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

    ; Werte eintragen B2:H10
    For $i = 0 To 8
    For $j = 0 To 6
    $oSheet.Range("B2").Offset($i, $j).Value = Random(8,30,1)
    Next
    Next

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

    ; Formeln Summen Zeilen und Summe gesamt
    Local $r = 2
    For $i = 0 To 9
    If $i = 9 Then
    $oSheet.Range("I2").Offset($i, 0).Formula = "=SUMME(I2:I10)"
    Else
    $oSheet.Range("I2").Offset($i, 0).Formula = "=SUMME(B"&$r&":H"&$r&")"
    $r += 1
    EndIf
    Next

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

    ; Diagramm im $oSheet erstellen
    ; Um die Positionierung des Diagramms an einer Zelle auszurichten, kann man die Werte vorab abfragen
    ; und das Diagramm gleich mit diesen Parametern erstellen, oder anschließend verschieben

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

    Local $width = 300, $height = 200

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

    ; Ausrichtung linksbündig an Zelle B13:
    ;~ Local $left = $oSheet.Range("B13").Left
    ;~ Local $top = $oSheet.Range("B13").Top

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

    ; Ausrichtung rechtsbündig an Zelle I13:
    Local $left = $oSheet.Range("J13").Left - $width ; Zelle J13: left = Zelle I13: right !
    Local $top = $oSheet.Range("I13").Top

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

    ; Objekt Diagramm erstellen
    Local $oChart = $oSheet.ChartObjects.Add($left, $top, $width, $height).Chart

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

    With $oChart
    .ChartType = $xl3DPieExploded ; Diagrammtyp festlegen
    .SetSourceData($oSheet.Range("I2:I10"), $xlColumns) ; Datenbereich für Diagramm
    .SeriesCollection(1).XValues = "='Mein Sheet'!Z2S1:Z10S1" ; Beschriftung Legende setzen (Namen aus A2:A10)
    .HasTitle = True ; Titel aktivieren
    .ChartTitle.Characters.Text = "Einzelsummen / Name (Gesamt = " & $oSheet.Range('I11').Value & ")" ; Titel
    .ApplyDataLabels($xlDataLabelsShowValue, False, True) ; Segmente Beschriften mit Werten
    EndWith

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

    ; Diagramm (Zeichnungsfläche=Shape) ausrichten, wenn nicht vorab positioniert
    ;~ With $oSheet
    ;~ .Shapes(1).Top = $oSheet.Range("B13").Top ; Ausrichtung Top an Zelle B13.top
    ;~ .Shapes(1).Left = $oSheet.Range("B13").Left ; Ausrichtung Left an Zelle B13.left
    ;~ .Select
    ;~ EndWith

    [/autoit]

    Edit:
    Oops, ich sehe gerade du willst das Diagramm exportieren, hatte ich falsch verstanden. ;)

    Versuch erst mal manuell ob folgendes geht:
    - Diagramm markieren
    - Druckbereich festlegen
    - Drucken auf PDF-Drucker (pdf-Dateien kannst du in deine Präsentation einbasteln), -- wird dabei das Diagramm gedruckt?
    - PDF- Datei in Präsentation einfügen bzw. ersetzen

    Wenn du das zusammenbekommst, jeden einzelnen Schritt notieren -- dann kann man sich an die Automatisierung machen. Auch Powerpoint ist m.W. per AutoIt ansprechbar.

  • Du kannst auch mal einen kritischen Blick auf meine ExcelChart UDF werfen. Die beinhaltet Funktionen für alles und jedes.
    Für Download siehe meine SIgnatur.

  • Danke für erure Antworten.

    Ich habe mich mal nach dem excelUDF auseinander gesetzt.

    Doch bekomme ich es nicht raus wie ich ein Diagramm was es schon gibt exportieren kann ich finde nur folgenden code doch dort wird das Diagramm erstellt und nicht ausgelesen.

    Code
    Local $oChart1 = _XLChart_ChartCreate($oExcel, $iWorksheet, $xlStockOHLC, $Graph_position, "", $XValueRange, $DataRange, $DataName) 
    _XLChart_ChartExport($oChart1, $iFile, "PNG", False, True)

    Gruß raumen837

  • Mit

    [autoit]

    $aCharts = _XLChart_ChartsGet($oXLC_Excel, 1, 0)

    [/autoit]

    kriegst Du einen Array aller Charts auf dem aktiven Worksheet zurück. $oXLC_Excel muss von einem vorhergehenden _ExcelBookOpen, _ExcelBookAttach oder _ExcelBookNew kommen.
    $aCharts sieht dann wie folgt aus:
    two-dimensional one based array with the following information:
    0 - Object of the chart or chartsheet
    1 - Type of the object. 1 = chart, 2 = chartsheet
    2 - Name of the chart or chartsheet
    3 - Number of the Excel sheet where the chart or chartsheet resides
    4 - Name of the Excel sheet where the chart or chartsheet resides
    Das Element 0 für das Chart übergibst Du dann an _XLChart_ChartExport.

  • Ok Danke nun habe ich noch ne frage.

    Ich weis wie das Chart heißt "Diagramm 5" wie würde dafür der code dann aussehen.

    Da ich jetzt es möglichst umkoplietziert designen möchte da es auch andere Personen verstehen müssen, würde ich ungern erst nach dem Diagramm suchen sondern nur den sozusagen den namen des Diagramms angeben und dann direckt exportieren.

    MFG Raumen837

  • So in etwa:

    [autoit]

    Global $sChartName = "Diagramm 5"
    $oChart = _Chartget($oExcel, $sChartName)
    If @error Then MsgBox(16, "Fehler", "Fehler beim Zugriff auf Chart '" & $sChartName & "' aufgetreten. @error = " & @error & ", @extended = " & @extended)
    _XLChart_ChartExport($oChart, ...)
    If @error Then MsgBox(16, "Fehler", "Fehler beim Export von Chart '" & $sChartName & "' aufgetreten. @error = " & @error & ", @extended = " & @extended)
    Exit

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

    Func _ChartGet($oXLC_Excel, $sName)
    If Not IsObj($oXLC_Excel) Then Return SetError(1, 0, 0)
    If $sName = "" Then Return SetError(2, 0, 0)
    Local $aCharts = _XLChart_ChartsGet($oXLC_Excel, 1, 0)
    If @error Then Return SetError(3, @error, 0)
    For $i = 1 To $aCharts[0][0]
    If $aCharts[$i][2] = $sName Then Return $aCharts[$i][0]
    Next
    Return SetError(4, 0, 0)
    EndFunc ;==>_Chartget

    [/autoit]
  • DANKE!

    Hast mir schon sehr geholfen.

    Nun ich habe versucht bei dir grade die UDF downzuloaden .... habe sie entpackt und dann kommt:

    Datei beschädigt

    liegt das jetzt am firmen netz oder ist das was anderes.

  • Ich habe die ZIP Datei mit Windows 7 Bordmitteln erstellt und konnte sie gerade auch problemlos herunterladen und mit Windows 7 Bordmitteln entpacken.
    Probiers nochmal. Wenn's nicht klappt kann ich die Datei ja hier ungepackt hochladen.

  • Ok, dann hier mal die ZIP-Datei direkt

  • so eine frage habe ich noch.

    mir ist grade was aufgefallen immer wenn er Excel startet bei mir dann kommt eine art fehlermeldung
    Wo Excel nicht weiterstartet .

    Weist du ob man dies überbrücken kann oder ich in excel einstellen kann das die meldung nicht mehr kommt:

    [Blockierte Grafik: http://www7.pic-upload.de/11.10.12/w4p3h8p7hrc.png]


    Da ich nicht die HOST datei updaten darf bleibt der fehler dauerhaft da sich das programm immer nur eine kopis von der version holt

    Der script soll alleine laufen können ohne das ich jedes mal dort auf "Don't Update" klicken kann.


    Gruß raumen837

  • Die Meldung hat mit HOST Datei updaten nichts zu tun.
    Du hast in der Excel Datei nur Referenzen auf eine andere Excel-Datei drin und Excel möchte wissen, ob es die aktuellsten Werte aus der verlinkten Excel-Datei holen soll.
    Wie startest Du Excel? Von Hand oder per AutoIt?

  • Kannst Du dein Skript (oder zumindest den Teil wo das Workbook geöffnet wird) posten?

  • Der teil mit Excel ist ganz unten:

    [autoit]

    ];Datenbank Writer
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include "source.au3"
    #include "vorinstallation.au3"
    #include <Excel.au3>
    #include <Array.au3>
    #include <ExcelChart.au3>
    ;Angaben für Datenbank
    $DBserver = 0
    $DBuser = 0
    $DBPasswort = 0
    $DBDatenbanknew = 0
    $DBDatenbankold = 0
    ;Angaben der Speicherpfade
    ;Bitte schreibe in "$Pfad + "name des objekts""
    $config = "E:\pb\writer\config.txt"
    $minitemp = "E:\minitemp"

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

    ;wichtig fürs Programm (NICHT ÄNDERN)
    $downpfad = 0
    $downpfad2 = 0
    $label1 = 0
    $label2 = 0

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

    vorinstallation()
    gui1()
    Func gui1()
    $GUI1 = GUICreate("Writer ", 450, 300)
    GUISetFont(15)
    $hButton1 = GUICtrlCreateButton("Start", 10, 10,70,40)
    $hButton2 = GUICtrlCreateButton("Close", 90, 10,70,40)
    GUICtrlCreateLabel("Status: ",10,60)
    GUICtrlCreateLabel("-Derzeitig in Arbeit: ",25,90)
    GUICtrlCreateLabel("-Excel: ",25,125)
    GUICtrlCreateLabel("-Diagramme: ",25,160)
    GUICtrlCreateLabel("-MYSQL: ",25,195)
    GUICtrlCreateLabel("Nächste Aktualiesierung in: ",10,230)
    $label1 = GUICtrlCreateLabel(" ",90,60)
    $label2 = GUICtrlCreateLabel(" ",225,90)
    GUISetBkColor(0xFFFFFF)
    GUICtrlCreatePic("c:\temp\Eaton.jpg",220,1,214,60)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $hButton1
    config()
    Case $hButton2
    ExitLoop
    EndSwitch
    WEnd
    EndFunc
    Func config()
    Local $file
    Local $line = 1
    Local $daten
    Local $daten2
    Local $daten3
    Local $speed
    GUICtrlSetData($label2,"Config check")

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

    If FileExists($config) Then

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

    Else
    FileInstall("config.txt",$config)
    MsgBox(0,"ERROR","Es wurde keinen config.txt gefunden. Neue config.txt wurde auf dem Desktop erstellt")
    Exit
    EndIf

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

    If FileExists($minitemp) Then
    FileDelete($minitemp)
    EndIf

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

    $file = FileOpen($config,0)
    While 2
    $daten = FileReadLine($file,$line)
    If $daten = "1:" Then
    While 1
    If $daten2 = "end:1" Then
    ExitLoop
    EndIf
    $line = $line + 1
    $daten2 = FileReadLine($file,$line)
    If $daten = "end:1" Then
    else
    FileWriteLine($minitemp,$daten2)
    EndIf
    Wend
    EndIf
    If $daten = "2:" Then
    $line = $line + 1
    $daten3 = FileReadLine($file,$line)
    EndIf
    $line = $line + 1
    If $daten = "end" Then
    ExitLoop
    EndIf
    Wend
    $downpfad = $daten3 & "*.*"
    $downpfad2 = $daten3
    FileClose($file)
    FileClose($minitemp)
    GUICtrlSetData($label1,"10%")
    Sleep(50)
    Down()
    EndFunc
    Func Down()
    Local $file
    Local $line = 1
    Local $daten
    GUICtrlSetData($label2,"Source download")

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

    $file = FileOpen($minitemp,0)
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to minitemp file.")
    Exit
    EndIf

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

    While 1
    $daten = FileReadLine($file,$line)
    If $daten = "end:1" Then
    ExitLoop
    Else
    FileCopy($daten, $downpfad)
    EndIf
    $line = $line + 1

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

    WEnd
    GUICtrlSetData($label1,"25%")
    FileClose($file)
    verarbeitung()
    EndFunc
    Func _ChartGet($oXLC_Excel, $sName)
    If Not IsObj($oXLC_Excel) Then Return SetError(1, 0, 0)
    If $sName = "" Then Return SetError(2, 0, 0)
    Local $aCharts = _XLChart_ChartsGet($oXLC_Excel, 1, 0)
    If @error Then Return SetError(3, @error, 0)
    For $i = 1 To $aCharts[0][0]
    If $aCharts[$i][2] = $sName Then Return $aCharts[$i][0]
    Next
    Return SetError(4, 0, 0)
    EndFunc ;==>_Chartget

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

    Func verarbeitung()
    Local $file
    Local $line
    Local $daten
    Local $zzz = 1
    GUICtrlSetData($label2,"Verarbeitung")

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

    If FileExists($downpfad2) Then

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

    Else
    MsgBox(0,"ERROR!","Heruntergeladene Dateien konnten nicht gefunden werden.")
    EndIf

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

    Local $oExcel = _ExcelBookOpen($downpfad2 & "Productivity.xlsx")
    _ExcelSheetActivate($oExcel,"Diagramm")
    ;-------------------------------------------------------------------------------------------------------------------------------------------
    Global $sChartName = "Diagramm 5"
    $oChart = _Chartget($oExcel, $sChartName)
    If @error Then
    MsgBox(16, "Fehler", "Fehler beim Zugriff auf Chart '" & $sChartName & "' aufgetreten. @error = " & @error & ", @extended = " & @extended)
    EndIf
    If @error Then
    MsgBox(16, "Fehler", "Fehler beim Export von Chart '" & $sChartName & "' aufgetreten. @error = " & @error & ", @extended = " & @extended)
    EndIf
    _XLChart_ChartExport($oChart, $downpfad2 & "Diagramm 5.jpg", "jpg", False, True)
    ;-------------------------------------------------------------------------------------------------------------------------------------------
    $sChartName = "Diagramm 2"
    $oChart = _Chartget($oExcel, $sChartName)
    If @error Then
    MsgBox(16, "Fehler", "Fehler beim Zugriff auf Chart '" & $sChartName & "' aufgetreten. @error = " & @error & ", @extended = " & @extended)
    EndIf
    If @error Then
    MsgBox(16, "Fehler", "Fehler beim Export von Chart '" & $sChartName & "' aufgetreten. @error = " & @error & ", @extended = " & @extended)
    EndIf
    _XLChart_ChartExport($oChart, $downpfad2 & "Diagramm 2.jpg", "jpg", False, True)
    ;-------------------------------------------------------------------------------------------------------------------------------------------
    GUICtrlSetData($label1,"35%")
    _ExcelBookClose($oExcel)
    endFunc

    [/autoit]
  • Die Funktion _ExcelBookOpen verursacht das Problem. Der 2. Parameter für die Open Methode (UpdateLinks) ist auf Default (gleichbedeutend mit 1 = User specifies how links will be updated) gesetzt, sollte aber auf 2 (Never update links for this workbook on opening) gesetzt sein.
    Du kannst entweder die Excel UDF anpassen (was ich nicht empfehle) oder eine eigene _ExcelBookOpenEx Funktion in Dein Skript einbauen. Die sollte dann so aussehen:

    [autoit]

    Func _ExcelBookOpenEx($sFilePath, $fVisible = 1, $fReadOnly = False, $sPassword = "", $sWritePassword = "")
    Local $oExcel = ObjCreate("Excel.Application")
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If Not FileExists($sFilePath) Then Return SetError(2, 0, 0)
    If $fVisible > 1 Then $fVisible = 1
    If $fVisible < 0 Then $fVisible = 0
    If $fReadOnly > 1 Then $fReadOnly = 1
    If $fReadOnly < 0 Then $fReadOnly = 0
    With $oExcel
    .Visible = $fVisible
    If $sPassword <> "" And $sWritePassword <> "" Then .WorkBooks.Open($sFilePath, 2, $fReadOnly, Default, $sPassword, $sWritePassword)
    If $sPassword = "" And $sWritePassword <> "" Then .WorkBooks.Open($sFilePath, 2, $fReadOnly, Default, Default, $sWritePassword)
    If $sPassword <> "" And $sWritePassword = "" Then .WorkBooks.Open($sFilePath, 2, $fReadOnly, Default, $sPassword, Default)
    If $sPassword = "" And $sWritePassword = "" Then .WorkBooks.Open($sFilePath, 2, $fReadOnly)

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

    ; Select the first *visible* worksheet.
    For $i = 1 To .ActiveWorkbook.Sheets.Count
    If .ActiveWorkbook.Sheets($i).Visible = $xlSheetVisible Then
    .ActiveWorkbook.Sheets($i).Select()
    ExitLoop
    EndIf
    Next
    EndWith
    Return $oExcel
    EndFunc ;==>_ExcelBookOpen

    [/autoit]


    Ersetze nun überall in Deinem Script _ExcelBookOpen mit _ExcelBookOpenEX und das Problem sollte behoben sein.

  • Wann taucht diese Meldung auf (d.h. welche Funktion verursacht die Meldung)? Beim _ExcelBookOpen oder beim sichern?