Embedded Excel-Tabelle speichern?

    • Offizieller Beitrag

    Ich habe eine eingebettete Excel-Tabelle (siehe Beispiel unten) und möchte diese, nachdem sie ausgefüllt ist, abspeichern und später auch wieder laden können.
    Mit Objekten habe ich aber noch nicht viel gemacht und somit wenig Ahnung. Wie kriege ich das mit dem speichern und laden hin?

    Edit: Man benötigt Excel in der XP-Version für dieses Beispiel.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    Opt('GUIOnEventMode', 1)
    Global $MaxPlayer = 20, $NCount = 8
    Global $aNames[$MaxPlayer] = ['A','B','C','D','E','F','G','H']; hier sind die Namen der Mitspieler gespeichert
    Global $aFM[$MaxPlayer] = [True, True, True, False, False, False, False, False]; Frau/Mann

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

    Global $GUI = GUICreate('Test', 800, 600, -1, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    Global $Obj1 = ObjCreate('OWC10.Spreadsheet')
    If Not IsObj($Obj1) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')

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

    Global $Obj1_ctrl = GUICtrlCreateObj($Obj1, 30, 10, 700, 570)
    GUICtrlSetState(-1, $GUI_ONTOP)
    GUICtrlSetBKColor(-1, 0x444444)

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

    With $Obj1
    .AutoFit=0
    .DisplayGridlines=-1
    .DisplayHorizontalScrollBar=-1
    .DisplayTitleBar=0
    .DisplayToolbar=0
    .DisplayVerticalScrollBar=0
    .EnableEvents=-1
    .MoveAfterReturn=-1
    .RightToLeft=0
    .ViewableRange='1:30'
    .Columns('A:A').ColumnWidth = 12
    .Columns('B:U').ColumnWidth = 8
    .Rows('1:1').RowHeight = 25
    .Range('A1:A30').Interior.Color = 0x88ff88
    .Range('A2:A30').HorizontalAlignment = -4152; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A25:U25').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').VerticalAlignment = -4108; -4108 = center, -4107 = bottom, -4130 = justify, -4160 = top
    .Range('A1:U1').Font.Bold = TRUE
    .Range('A25:U25').Font.Bold = TRUE
    For $i = 66 TO 85
    .Range('A' & $i-64).value = $i-65
    .Range(Chr($i) & '1').value = $aNames[$i-66] & StringLeft(' ', 1*($aNames[$i-66]=''))
    .Range(Chr($i) & '25').formula = '=' & Chr($i) & '1'
    If $aFM[$i-66] And $i-66 < $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x8888ff
    .Range(Chr($i) & '25').Interior.Color = 0x8888ff
    Else
    .Range(Chr($i) & '1').Interior.Color = 0xff8888
    .Range(Chr($i) & '25').Interior.Color = 0xff8888
    EndIf
    If $i-66 >= $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x88ffff
    .Range(Chr($i) & '25').Interior.Color = 0x88ffff
    EndIf
    .Range(Chr($i) & '24').formula = '=SUM(' & Chr($i) & '2:' & Chr($i) & '21)'
    Next
    .Range('A1').value = 'Name'
    .Range('A22').value = 'Pumpen'
    .Range('A23').value = 'Alle Neune'
    .Range('A24').value = 'Punkte'
    .Range('A25').value = 'Name'
    EndWith

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

    GUISetState()
    While 1
    Sleep(10)
    WEnd

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

    Func _End()
    Exit
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Ich krieg's irgendwie nicht auf die Reihe.

    Wenn ich das so (unten) ändere, kommt immer eine Fehlermeldung:
    libExamplesGUI.exe

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    Opt('GUIOnEventMode', 1)
    Global $MaxPlayer = 20, $NCount = 8
    Global $aNames[$MaxPlayer] = ['A','B','C','D','E','F','G','H']; hier sind die Namen der Mitspieler gespeichert
    Global $aFM[$MaxPlayer] = [True, True, True, False, False, False, False, False]; Frau/Mann

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

    Global $GUI = GUICreate('Test', 800, 600, -1, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    Global $oExcel = ObjCreate('OWC10.Spreadsheet')
    If Not IsObj($oExcel) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')

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

    Global $oBook = $oExcel.Workbooks.Add
    Global $oSheet = $oBook.Worksheets(1)

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

    Global $oExcel_ctrl = GUICtrlCreateObj($oExcel, 30, 10, 700, 570)

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

    GUICtrlSetState(-1, $GUI_ONTOP)
    GUICtrlSetBKColor(-1, 0x444444)

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

    With $oExcel
    .AutoFit=0
    .DisplayGridlines=-1
    .DisplayHorizontalScrollBar=-1
    .DisplayTitleBar=0
    .DisplayToolbar=0
    .DisplayVerticalScrollBar=0
    .EnableEvents=-1
    .MoveAfterReturn=-1
    .RightToLeft=0
    .ViewableRange='1:30'
    .Columns('A:A').ColumnWidth = 12
    .Columns('B:U').ColumnWidth = 8
    .Rows('1:1').RowHeight = 25
    .Range('A1:A30').Interior.Color = 0x88ff88
    .Range('A2:A30').HorizontalAlignment = -4152; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A25:U25').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').VerticalAlignment = -4108; -4108 = center, -4107 = bottom, -4130 = justify, -4160 = top
    .Range('A1:U1').Font.Bold = TRUE
    .Range('A25:U25').Font.Bold = TRUE
    For $i = 66 TO 85
    .Range('A' & $i-64).value = $i-65
    .Range(Chr($i) & '1').value = $aNames[$i-66] & StringLeft(' ', 1*($aNames[$i-66]=''))
    .Range(Chr($i) & '25').formula = '=' & Chr($i) & '1'
    If $aFM[$i-66] And $i-66 < $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x8888ff
    .Range(Chr($i) & '25').Interior.Color = 0x8888ff
    Else
    .Range(Chr($i) & '1').Interior.Color = 0xff8888
    .Range(Chr($i) & '25').Interior.Color = 0xff8888
    EndIf
    If $i-66 >= $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x88ffff
    .Range(Chr($i) & '25').Interior.Color = 0x88ffff
    EndIf
    .Range(Chr($i) & '24').formula = '=SUM(' & Chr($i) & '2:' & Chr($i) & '21)'
    Next
    .Range('A1').value = 'Name'
    .Range('A22').value = 'Pumpen'
    .Range('A23').value = 'Alle Neune'
    .Range('A24').value = 'Punkte'
    .Range('A25').value = 'Name'
    EndWith

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

    GUISetState()
    While 1
    Sleep(10)
    WEnd

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

    Func _End()
    Exit
    EndFunc

    [/autoit]

    Wie muss das richtig aussehen?

    • Offizieller Beitrag

    Nein, das führt zum fast gleichen Fehler. Der Zeiger zeigt dann nur hinter die Klammern.

    Ich denke, das muss was mit dem: Global $oExcel = ObjCreate('OWC10.Spreadsheet') zu tun haben.

    Wenn ich das ändere in: Global $oExcel = ObjCreate('Excel.Application') und dann $oExcel.Visible = 1, dann öffnet sich Excel und AutoIt meldet auch keinen Fehler bei: Global $oBook = $oExcel.Workbooks.Add, sondern erst später beim: .AutoFit=0 nach dem 'With'.

    Ich weiss aber nicht, wie ich das ändern kann/muss. Es soll ja auf jeden Fall eine eingebettete Excel-Tabelle sein.

  • Also prinzipiell funzt das, aber die Typen 'Excel.Application.Workbook.Worksheet' und 'OWC10.Spreadsheet' unterscheiden sich zu sehr.
    Ich find im Moment das Objekt-Modell von Excel nicht. Das braucht man um das umzubasteln.
    Vielleicht hat ja jemand anderes ne praktischere Idee...

    P.S. Als 'Beweis' bau das mal in einen Button-Click ein ;)

    [autoit]

    Local $oExcel = ObjCreate("Excel.Application")
    Local $oBook = $oExcel.Workbooks.Add()
    $oBook.Worksheets(1).Range('A1:U25').value = $Obj1.Range('A1:U25').value
    $oBook.Worksheets(1).Range('A1:U25').formula = $Obj1.Range('A1:U25').formula
    $oBook.SaveAs( "C:\temp\Test.xls" )
    $oExcel.Quit()

    [/autoit]
    • Offizieller Beitrag

    Nach reichlich lesen in der 'Microsoft Office 2003 Web Components VBA Language Reference' und diversen 'Trial And Error'-Experimenten habe ich es jetzt geschaft, die Tabelle zu speichern. :)

    Ich will euch mein vorläufiges Ergebnis nicht vorenthalten, deshalb hier das Script:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    Opt('GUIOnEventMode', 1)
    Global $MaxPlayer = 20, $NCount = 8
    Global $aNames[$MaxPlayer] = ['A','B','C','D','E','F','G','H']; hier sind die Namen der Mitspieler gespeichert
    Global $aFM[$MaxPlayer] = [True, True, True, False, False, False, False, False]; Frau/Mann

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

    Global $GUI = GUICreate('Test', 800, 600, -1, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    Global $oExcel = ObjCreate('OWC10.Spreadsheet')
    If Not IsObj($oExcel) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')

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

    $oSheet = $oExcel.Worksheets(1)
    Const $ssConstants = $oExcel.Constants

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

    Global $Excel_ctrl = GUICtrlCreateObj($oExcel, 30, 10, 700, 570)
    GUICtrlSetState(-1, $GUI_ONTOP)
    GUICtrlSetBKColor(-1, 0x444444)
    With $oExcel
    .AutoFit=0
    .DisplayGridlines=-1
    .DisplayHorizontalScrollBar=-1
    .DisplayTitleBar=0
    .DisplayToolbar=0
    .DisplayVerticalScrollBar=0
    .EnableEvents=-1
    .MoveAfterReturn=-1
    .RightToLeft=0
    .ViewableRange='1:30'
    EndWith

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

    With $oSheet
    .Columns('A:A').ColumnWidth = 12
    .Columns('B:U').ColumnWidth = 8
    .Rows('1:1').RowHeight = 25
    .Range('A1:A30').Interior.Color = 0x88ff88
    .Range('A2:A30').HorizontalAlignment = -4152; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A25:U25').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').VerticalAlignment = -4108; -4108 = center, -4107 = bottom, -4130 = justify, -4160 = top
    .Range('A1:U1').Font.Bold = TRUE
    .Range('A25:U25').Font.Bold = TRUE
    For $i = 66 TO 85
    .Range('A' & $i-64).value = $i-65
    .Range(Chr($i) & '1').value = $aNames[$i-66] & StringLeft(' ', 1*($aNames[$i-66]=''))
    .Range(Chr($i) & '25').formula = '=' & Chr($i) & '1'
    If $aFM[$i-66] And $i-66 < $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x8888ff
    .Range(Chr($i) & '25').Interior.Color = 0x8888ff
    Else
    .Range(Chr($i) & '1').Interior.Color = 0xff8888
    .Range(Chr($i) & '25').Interior.Color = 0xff8888
    EndIf
    If $i-66 >= $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x88ffff
    .Range(Chr($i) & '25').Interior.Color = 0x88ffff
    EndIf
    .Range(Chr($i) & '24').formula = '=SUM(' & Chr($i) & '2:' & Chr($i) & '21)'
    Next
    .Range('A1').value = 'Name'
    .Range('A22').value = 'Pumpen'
    .Range('A23').value = 'Alle Neune'
    .Range('A24').value = 'Punkte'
    .Range('A25').value = 'Name'
    EndWith
    GUISetState()

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

    $oExcel.Export ('C:\temp\test.xls', $ssConstants.ssExportActionNone, $ssConstants.ssExportAsAppropriate)

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

    While 1
    Sleep(10)
    WEnd

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

    Func _End()
    Exit
    EndFunc

    [/autoit]
  • Hi Oscar,

    das könnte etwas für Dich sein ;)

    Spoiler anzeigen


    Original-URL des Artikels: http://www.golem.de/0802/57768.html Veröffentlicht: 18.02.2008 11:31
    Freier Zugriff auf Microsofts binäre Office-Formate
    Microsoft gibt Spezifikationen frei

    Wie angekündigt, hat Microsoft die Spezifikationen für die binären Office-Formate des Softwaregiganten freigegeben. Damit erhalten nun alle Interessierten Zugriff auf den Aufbau der Dateiformate von Word, Excel, PowerPoint sowie Drawing. Als kleine Überraschung wurden auch die Spezifikationen des WMF-Dateiformats veröffentlicht.

    Ab sofort hat jedermann Zugriff auf die Spezifikationen der binären Office-Formate doc, xls, ppt sowie das Dateiformat von Office Drawing, die gesammelt auf einer Webseite präsentiert werden. Zwar waren diese Spezifikationen bereits zuvor lizenzfrei zu bekommen, aber diese gab es erst nach direkter Anfrage bei Microsoft. Es gibt die Vermutung, dass dabei vor allem große Unternehmen berücksichtigt wurden, während kleinere Entwickler oder Firmen keine Möglichkeit hatten, an diese Daten heranzukommen.

    Nun hat Microsoft diese Spezifikationen unter der Open Specification Promise veröffentlicht. In diesem Rahmen wurden auch die Spezifikationen für das WMF-Dateiformat (Windows Metafile Format) sowie das "Windows Compound Binary File Format" und die Spezifikationen zum "Ink Serialized Format" (ISF) frei zugänglich gemacht.

    Zudem wurde auf Sourceforge der bereits angekündigte "Office Binary Translator to Open XML" veröffentlicht. Innerhalb des Projekts soll ein Konverter unter einer BSD-Lizenz entwickelt werden, um die alten Office-Formate aus Redmond in das neue XML-Format OOXML umzuwandeln. Hierbei will Microsoft mit anderen Firmen zusammenarbeiten. Noch befinde sich das Projekt in einem frühen Stadium, erklärte Brian Jones aus Microsofts Office-Team. (ip)


    Weiterhin viel Erfolg !

    • Offizieller Beitrag

    So! Jetzt habe ich auch das Laden der Datei hinbekommen. Das war ja fast noch schlimmer als das Speichern. :wacko:


    Falls also mal jemand eine eingebettete Excel-Tabelle laden, anzeigen und speichern will/muss, hier mein Beispielscript:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    Opt('GUIOnEventMode', 1)
    Global $MaxPlayer = 20, $NCount = 8
    Global $aNames[$MaxPlayer] = ['A','B','C','D','E','F','G','H']; hier sind die Namen der Mitspieler gespeichert
    Global $aFM[$MaxPlayer] = [True, True, True, False, False, False, False, False]; Frau/Mann

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

    Global $GUI = GUICreate('Test', 800, 600, -1, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    Global $oExcel = ObjCreate('OWC10.Spreadsheet.10')
    If Not IsObj($oExcel) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')

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

    Const $ssConstants = $oExcel.Constants

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

    If FileExists('C:\temp\test.xml') Then $oExcel.XMLURL = 'C:\temp\test.xml'; Hier wird die Testdatei geladen

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

    $oSheet = $oExcel.Worksheets(1)

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

    Global $Excel_ctrl = GUICtrlCreateObj($oExcel, 30, 10, 700, 570)
    GUICtrlSetState(-1, $GUI_ONTOP)

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

    With $oExcel
    .AutoFit=0
    .DisplayGridlines=-1
    .DisplayHorizontalScrollBar=-1
    .DisplayTitleBar=0
    .DisplayToolbar=0
    .DisplayVerticalScrollBar=0
    .EnableEvents=-1
    .MoveAfterReturn=-1
    .RightToLeft=0
    .ViewableRange='1:30'
    EndWith

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

    With $oSheet
    .Columns('A:A').ColumnWidth = 12
    .Columns('B:U').ColumnWidth = 8
    .Rows('1:1').RowHeight = 25
    .Range('A1:A30').Interior.Color = 0x88ff88
    .Range('A2:A30').HorizontalAlignment = -4152; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A25:U25').HorizontalAlignment = -4108; -4108 = center, -4131 = left, -4152 = right
    .Range('A1:U1').VerticalAlignment = -4108; -4108 = center, -4107 = bottom, -4130 = justify, -4160 = top
    .Range('A1:U1').Font.Bold = TRUE
    .Range('A25:U25').Font.Bold = TRUE
    For $i = 66 TO 85
    .Range('A' & $i-64).value = $i-65
    .Range(Chr($i) & '1').value = $aNames[$i-66] & StringLeft(' ', 1*($aNames[$i-66]=''))
    .Range(Chr($i) & '25').formula = '=' & Chr($i) & '1'
    If $aFM[$i-66] And $i-66 < $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x8888ff
    .Range(Chr($i) & '25').Interior.Color = 0x8888ff
    Else
    .Range(Chr($i) & '1').Interior.Color = 0xff8888
    .Range(Chr($i) & '25').Interior.Color = 0xff8888
    EndIf
    If $i-66 >= $NCount Then
    .Range(Chr($i) & '1').Interior.Color = 0x88ffff
    .Range(Chr($i) & '25').Interior.Color = 0x88ffff
    EndIf
    .Range(Chr($i) & '24').formula = '=SUM(' & Chr($i) & '2:' & Chr($i) & '21)'
    Next
    .Range('A1').value = 'Name'
    .Range('A22').value = 'Pumpen'
    .Range('A23').value = 'Alle Neune'
    .Range('A24').value = 'Punkte'
    .Range('A25').value = 'Name'
    EndWith
    GUISetState()

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

    If Msgbox(4,'','Speichern?') = 6 Then $oExcel.Export ('C:\temp\test.xml', $ssConstants.ssExportActionNone, $ssConstants.ssExportXMLSpreadsheet); Hier wird gespeichert

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

    While 1
    Sleep(10)
    WEnd

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

    Func _End()
    Exit
    EndFunc

    [/autoit]

    Das Script hat zwar ein wenig mit meinem aktuellen Projekt zu tun, aber das führt ja auch gleich zu ein paar Beispielen. :)

  • So kannst du auch Office 2003 mit einbinden:

    Spoiler anzeigen
    [autoit]

    For $i = 1 To 3
    Case 1
    ;??? OWC in Excel 2000 und früher
    Case 2
    Global $oExcel = ObjCreate('OWC10.Spreadsheet.10')
    If IsObj($oExcel) Then ExitLoop
    Case 3
    Global $oExcel = ObjCreate('OWC11.Spreadsheet.11')
    If IsObj($oExcel) Then ExitLoop
    Next
    If Not IsObj($oExcel) Then Exit MsgBox(0, 'Fehler', 'Excel-Objekt konnte nicht erstellt werden.')

    [/autoit]
  • Okay galt nur für 'echte' Office-Automatisation was hier stand :D
    @progandy : Was du alles weißt... ;) :D

    Einmal editiert, zuletzt von JanSchmidt (20. Februar 2008 um 08:53)

  • Nein, OWC12 gibt es nicht mehr :(
    Und die davor waren glaub ich nur
    OWC.Spreadsheet
    ohne Zahlen und unterstützen viele Eigenschaften nicht.