_Word_DocSaveAs: Funktioniert nicht in Office 2013

  • Hallo,

    ich habe ein Problem mit word.au3 (ausgeliefert mit AutoIt Version 3.3.12.0) und Word 2013. Ich möchte eine UTF-8 codierte CSV-Datei öffnen und als HTM wieder abspeichern. Mein Quellcode (der Übersichtlichkeit halber ohne Fehlerbehandlung) sieht so aus:

    [autoit]


    #include <FileConstants.au3>
    #include <Word.au3>

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

    $sInputFile = FileOpenDialog("Select CSV to open in Word", "C:\", "CSV (*.csv)", $FD_FILEMUSTEXIST)
    $sOutputFile = "C:\test.htm"

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

    $oWord = _Word_Create()
    $oWordDoc = _Word_DocOpen($oWord, $sInputFile, False, $WdOpenFormatUnicodeText)
    _Word_DocSaveAs($oWordDoc, $sOutputFile, $WdFormatHTML, False, False)
    _Word_Quit($oWord)

    [/autoit]

    Die CSV wird auch ohne Anzeige des Konvertierungsdialogs geöffnet, ab dann gibt es Unterschiede.

    Word 2007 verhält sich wie erwartet; es speichert die Datei und schließt sich danach automatisch. Word 2013 zeigt mir den 'Datei Speichern' Dialog an, als Namen den des Inputfiles und als Dateityp Word-Dokument.

    Woran liegt das?

  • Habe leider kein Word 20103, daher ein paar Fragen:
    Wird der Dialog von _Word_DocSaveAs oder _Word_Quit angezeigt?

  • Was heisst kein Erfolg?
    Ohne error checking ist es etwas schwierig das Problem zu lokalisieren.
    Kannst Du mal folgende Zeilen zu Beginn Deines Skripts einfügen?

    [autoit]

    #include <Debug.au3>
    _DebugSetup()
    _DebugCOMError()

    [/autoit]
  • Hi water,

    schon mal vielen Dank für Deine Mühe :)

    Kein Erfolg heißt, dass in Word 2013 die Datei nicht automatisch unter dem angegebenen Namen und Format abgespeichert wird (so wie in Word 2007)

    Ich habe Deinen Debugcode eingefügt. In beiden Wordversionen erscheint nach dem Aufruf von _Word_Create():

    @@ DEBUG COM Error encountered in test.au3 (53) :
    Number = 0x80020006 (-2147352570)
    WinDescription = Unbekannter Name.
    Description =
    Source =
    HelpFile =
    HelpContext =
    LastDllError = 0
    Retcode = 0x00000000

    Beide Versionen öffnen trotzdem Word und geben das application object zurück; genau so öffnet _Word_DocOpen die CSV-Datei und gibt das document object zurück. Während in 2007 bei _Word_DocSaveAs keine Fehlermeldung kommt, produziert 2013:

    @@ DEBUG COM Error encountered in test.au3 (460) :
    Number = 0x80020009 (-2147352567)
    WinDescription = Ausnahmefehler aufgetreten.
    Description = Befehl misslungen
    Source = Microsoft Word
    HelpFile = wdmain11.chm
    HelpContext = 36966
    LastDllError = 0
    Retcode = 0x800A1066

    Gruß

    Norik

  • Funktioniert die folgende Funktion?

    [autoit]

    Func _Word_DocSaveAsEx($oDoc, $sFilename = Default, $iFileFormat = Default, $bReadOnlyRecommended = Default, $bAddToRecentFiles = Default, $sPassword = Default, $sWritePassword = Default)
    If $sFilename = Default Then $sFilename = ""
    If $iFileFormat = Default Then $iFileFormat = $WdFormatDocument
    If $bReadOnlyRecommended = Default Then $bReadOnlyRecommended = False
    If $bAddToRecentFiles = Default Then $bAddToRecentFiles = 0
    If $sPassword = Default Then $sPassword = ""
    If $sWritePassword = Default Then $sWritePassword = ""
    If Not IsObj($oDoc) Then Return SetError(1, 0, 0)
    ; Use SaveAs method up to Word 2007, for Word 2010 and later use SaveAs2
    $aVersion = StringSplit($oWord.Version, ".")
    If Number($aVersion[1]) < 14 Then
    $oDoc.SaveAs($sFilename, $iFileFormat, False, $sPassword, $bAddToRecentFiles, $sWritePassword, $bReadOnlyRecommended)
    Else
    $oDoc.SaveAs2($sFilename, $iFileFormat, False, $sPassword, $bAddToRecentFiles, $sWritePassword, $bReadOnlyRecommended)
    EndIf
    If @error Then Return SetError(2, @error, 0)
    Return 1
    EndFunc ;==>_Word_DocSaveAsEx

    [/autoit]
  • Nein, leider nicht. Debug zeigt ...

    @@ DEBUG COM Error encountered in test.au3 (39) :
    Number = 0x80020009 (-2147352567)
    WinDescription = Ausnahmefehler aufgetreten.
    Description = Befehl misslungen
    Source = Microsoft Word
    HelpFile = wdmain11.chm
    HelpContext = 36966
    LastDllError = 0
    Retcode = 0x800A1066

    ... wobei in Zeile 39 die Methode $oDoc.SaveAs2 aufgerufen wird.

  • Kannst Du mal bitte den komplette Funktionsaufruf mit allen Parametern hier posten?

  • [autoit]


    #include <Word.au3>
    #include <Debug.au3>

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

    _DebugSetup()
    _DebugCOMError()

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

    Local $sCSVInputFile = "C:\Users\Public\Documents\test.csv"
    Local $sOutputFile = "C:\Users\Public\Documents\test_out.htm"

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

    $oWord = _Word_Create()
    $oWordDoc = _Word_DocOpen($oWord, $sCSVInputFile, False, $WdOpenFormatUnicodeText)
    _Word_DocSaveAsEx($oWordDoc, $sOutputFile, $WdFormatHTML, False, False)
    _Word_Quit($oWord)

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

    Func _Word_DocSaveAsEx($oDoc, $sFilename = Default, $iFileFormat = Default, $bReadOnlyRecommended = Default, $bAddToRecentFiles = Default, $sPassword = Default, $sWritePassword = Default)
    If $sFilename = Default Then $sFilename = ""
    If $iFileFormat = Default Then $iFileFormat = $WdFormatDocument
    If $bReadOnlyRecommended = Default Then $bReadOnlyRecommended = False
    If $bAddToRecentFiles = Default Then $bAddToRecentFiles = 0
    If $sPassword = Default Then $sPassword = ""
    If $sWritePassword = Default Then $sWritePassword = ""
    If Not IsObj($oDoc) Then Return SetError(1, 0, 0)
    ; Use SaveAs method up to Word 2007, for Word 2010 and later use SaveAs2
    $aVersion = StringSplit($oWord.Version, ".")
    If Number($aVersion[1]) < 14 Then
    $oDoc.SaveAs($sFilename, $iFileFormat, False, $sPassword, $bAddToRecentFiles, $sWritePassword, $bReadOnlyRecommended)
    Else
    $oDoc.SaveAs2($sFilename, $iFileFormat, False, $sPassword, $bAddToRecentFiles, $sWritePassword, $bReadOnlyRecommended)
    EndIf
    If @error Then Return SetError(2, @error, 0)
    Return 1
    EndFunc ;==>_Word_DocSaveAsEx

    [/autoit]



    @@ DEBUG COM Error encountered in test.au3 (28) :
    Number = 0x80020009 (-2147352567)
    WinDescription = Ausnahmefehler aufgetreten.
    Description = Befehl misslungen
    Source = Microsoft Word
    HelpFile = wdmain11.chm
    HelpContext = 36966
    LastDllError = 0
    Retcode = 0x800A1066

    Einmal editiert, zuletzt von Norik (11. März 2015 um 16:59)

  • Blöde Frage: Warum verwendest Du Word und nicht Excel um eine CSV-Datei zu verarbeiten?

  • Word konvertiert mir den Unicode so, wie ich ihn brauche, Excel nicht.

    Ich hab übrigens mal das Format der Inputdatei geändert (ANSI TXT und DOCX) aber die SaveAs Funktion funktioniert unabhängig davon nicht und wirft eine Exception.

    Einmal editiert, zuletzt von Norik (12. März 2015 um 08:50)

  • Problem gelöst!

    Ich habe in Word ein kleines VBA-Makro mit der SaveAs2 Methode geschrieben und es funktionierte auch nicht! Kein automatisches Abspeichern im gewünschten Format. Im MSDN gab es dann eine Lösung zur Frage "Beim Befehl SavAs tritt der Fehler „4198 Befehl misslungen“ auf":

    Zitat


    In Word 2010/2013 Klick auf „Datei“ oben links, dann Klick auf „Optionen“ - „Add-Ins“ - „Verwalten: COM-Add-Ins - Gehe zu...“ und dann die aufgeführten Add-Ins deaktivieren

    Bei mir war dort ein "abDocs Word Addin" aktiviert, Haken raus, OK ... und mein Skript macht was es soll.

    Die Frage nach dem Warum spar ich mir ...

  • Danke für die Rückmeldung!
    Ich werde die Word UDF trotzdem so anpassen, dass die SaveAs2-Methode für Word 2010 und später aufgerufen wird.